SDS

Redis 高频面试题:10w+QPS 的 Redis 真的只是因为单线程和基于内存?

那年仲夏 提交于 2020-08-18 05:29:13
你以为 Redis 这么快仅仅因为单线程和基于内存? 那么你想得太少了,我个人认为 Redis 的快是基于多方面的:不但是单线程和内存,还有底层的数据结构设计,网络通信的设计,主从、哨兵和集群等等方面的设计~ 下面,我将 360° 为你揭开 Redis QPS达到10万/秒的神秘面纱。 一、底层数据结构设计 1、底层架构: 首先值得称赞的第一点:Redis 底层使用的数据结构很多,但是却没有直接使用这些数据结构来实现键值对数据库,而是基于数据结构创建了一个对象(redisObject)系统。(是不是觉得有点面向对象编程的意思 ~) 对象系统里面包括了字符串对象,列表对象,哈希对象、集合对象和有序集合对象。 使用对象的好处: Redis 在执行命令之前,可以根据对象的类型判断这个对象是否可以执行给定的命令。 可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。 一个对象怎么设置不同的数据结构实现? 在讲解前,我们必须要了解 Redis 对象的结构。 它三个重要的部分:type 属性、encoding 属性,和 ptr 属性。 我们用字符串对象为例: 我们都知道,Redis 的 SET 命令其实是针对字符串的,但是它也可以设置数值。那底层是怎么做的呢? 它会将 String 对象的 encoding 属性标识为 REDIS_ENCODING

Redis相关知识点汇总

情到浓时终转凉″ 提交于 2020-08-17 03:48:01
MongoDB和Redis有什么区别? 内存管理机制上: Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据 。 MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘 。 支持的数据结构上: Redis 支持的数据结构丰富 ,包括hash、set、list等。 MongoDB 数据结构比较单一,但是 支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富 。 mysql引擎以及其区别 在Mysql数据库中,常用的引擎为 Innodb 和 MyIASM ,其中 Innodb是一个事务型的存储引擎,有行级锁定和外键约束,提供了对数据库ACID事物的支持,实现了SQL标准的四种隔离级别,即读未提交,不可重复读,可重复读以及串行,其涉及目标就是处理大数据容量的数据库系统 。 MyIASM引擎是Mysql默认的引擎,不提供数据库事务的支持,也不支持行级锁和外键,因此当写操作时需要锁定整个表,效率较低 。不过其保存了表的行数,当进行select count(*)form table时,可直接读取已经保存的值,不需要进行全表扫描。 因此当表的读操作远多于写操作,并且不需要事务支持时,可以优先选择MyIASM 。 Redis的定时机制怎么实现的 Redis服务器是一个

没有物理按键的手机不远了?超声波手势感应可以完美替代

╄→гoц情女王★ 提交于 2020-08-17 00:52:25
   随着手游产业的蓬勃发展,越来越多的手机厂商都推出了游戏专用手机 ,比如联想最近推出了 Legion 手机,华硕和腾讯合作推出的 ROG 3 手机,都是面向手游发烧友的产品。    在这些手机背后,有一家名为 Sentons 的初创公司几乎鲜有人知。 这家总部位于加州圣何塞的科技公司成立于 2011 年,在深圳、台北和首尔均有办公室,主要研究一种名为 “软件定义表面(SDS)” 的技术。    通过超声波,SDS 技术可以识别手机屏幕和边缘的一系列手势操作,还可以分辨手指的按压力度,移动方向和速度,连续还是间断,以及时间长短等等。 这些操作经过排列组合之后,就可以实现对手机的操控,比如挤压边框调出悬浮菜单,然后上下轻轻滑动手指以浏览菜单中的选项,最后再重压一次打开对应的应用。   在 SDS 技术的驱动下,手机理论上可以做到完全无按钮,仅用内置传感器捕捉用户手势,还不会影响用户体验。超声波传感器的敏感度和精确度甚至超过传统电容式触摸传感器。       公司 CEO Jess Lee 在接受采访时表示,这项技术可以让手游体验更像其他平台,因为单纯依赖屏幕操控很不舒服,一些交互方式非常复杂和别扭,十分影响游戏体验。 将手指从屏幕移开,转而握住手机边框,更符合人体工程学原理。   “支持 Sentons 技术的手机集成了触觉体验,因此即使没有按钮,用户也能获得按下按钮的触觉反馈,”

《三天给你聊清楚redis》第1天先唠唠redis是个啥(18629字)

穿精又带淫゛_ 提交于 2020-08-16 06:00:14
1、入门 Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构: 字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。 • Redis将所有的数据都存放在内存中,所以它的读写性能十分惊人,用作数据库,缓存和消息代理。 Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。 • Redis典型的应用场景包括:缓存、排行榜、计数器、社交网络、消息队列等 1.1NoSql入门概述 1)单机Mysql的美好时代 瓶颈: 数据库总大小一台机器硬盘内存放不下 数据的索引(B + tree)一个机器的运行内存放不下 访问量(读写混合)一个实例不能承受 2)Memcached(缓存)+ MySql + 垂直拆分 通过缓存来缓解数据库的压力,优化数据库的结构和索引 垂直拆分指的是:分成多个数据库存储数据(如:卖家库与买家库) 3)MySql主从复制读写分离 主从复制:主库来一条数据,从库立刻插入一条。 读写分离:读取(从库Master),写(主库Slave) 4)分表分库+水平拆分+MySql集群 主库的写压力出现瓶颈(行锁InnoDB取代表锁MyISAM) 分库:根据业务相关紧耦合在同一个库

redis的5种对象与8种数据结构之字符串对象(下)

蹲街弑〆低调 提交于 2020-08-15 15:48:06
简介: 引言 本文是对《redis设计与实现(第二版)》中数据结构与对象相关内容的整理与说明。本篇文章只对对象结构,1种对象——字符串对象。以及字符串对象所对应的两种编码——raw和embstr,进行了详细介绍。 引言 本文是对《redis设计与实现(第二版)》中数据结构与对象相关内容的整理与说明。本篇文章只对对象结构,1种对象——字符串对象。以及字符串对象所对应的两种编码——raw和embstr,进行了详细介绍。表达一些本人的想法与看法,也希望更多朋友一起来讨论,分享交流。 作者:太阳 云掣科技-数据库团队 数据库工程师 字符串对象 字符串对象可以存储整数、浮点数、字符串,具体策略是: 当存储整数时,用到的编码是int,底层的数据结构可以用来存储long类型的整数; 当存储字符串时,如果字符串的长度小于等于32字节,那么将用编码为embstr的格式来存储;如果字符串的长度大于32字节,将用编码为raw的SDS格式来存储; 当存储浮点数时会先将浮点数转换为字符串,如果转换后的字符串长度小于32字节就用编码为embstr的格式来存储,否则用编码为raw的SDS格式来存储。 下图是一个字符串对象的结构图,最左侧是对象结构,中间跟右侧合起来是raw编码的SDS数据结构(sdshdr),示例图: raw编码,简单动态字符串(simple dynamic string-SDS)

《深入浅出redis》

匆匆过客 提交于 2020-08-14 10:28:49
1 数据结构与对象 1.1 SDS(simple dynamic string)定义 /* * 保存字符串对象的结构 */ struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 char buf[]; }; free属性的值为0,表示这个SDS没有分配任何未使用空间 len属性的值为5,表示这个SDS保存了一个5字节长的字符串 buf属性是一个char类型的数组,最后以’\0’结尾。空字符不计算在SDS的len中 1.2 SDS与C字符串的区别 C字符串不能满足Redis对字符串在安全性、效率以及功能方面的要求 1.2.1 常数复杂度获取字符串长度 C字符串不记录自身的长度信息,因此获取一个C字符串的长度,需要遍历整个字符串,时间复杂度为 O(n), 而SDS里有len字段保存了字符串本身的长度,时间复杂度为O(1),确保了获取字符串长度不会成为redis的性能瓶颈 1.2.2 杜绝缓冲区溢出 C字符串不记录自身自身长度,因此容易造成缓冲区溢出,如: # 如果用户为dest分配的空间不够,就会产生溢出,可能会导致src的内容被覆盖 char *strcat(char *dest, const char *src); 当使用SDS的API对SDS进行修改时

Redis中的数据结构

元气小坏坏 提交于 2020-08-14 05:27:52
1. 底层数据结构, 与Redis Value Type之间的关系 对于Redis的使用者来说, Redis作为Key-Value型的内存数据库, 其Value有多种类型. String Hash List Set ZSet 这些Value的类型, 只是"Redis的用户认为的, Value存储数据的方式". 而在具体实现上, 各个Type的Value到底如何存储, 这对于Redis的使用者来说是不公开的. 举个粟子: 使用下面的命令创建一个Key-Value $ SET "Hello" "World" 对于Redis的使用者来说, Hello 这个Key, 对应的Value是String类型, 其值为五个ASCII字符组成的二进制数据. 但具体在底层实现上, 这五个字节是如何存储的, 是不对用户公开的. 即, Value的Type, 只是表象, 具体数据在内存中以何种数据结构存放, 这对于用户来说是不必要了解的. Redis对使用者暴露了五种Value Type, 其底层实现的数据结构有8种, 分别是: SDS - simple synamic string - 支持自动动态扩容的字节数组 list - 平平无奇的链表 dict - 使用双哈希表实现的, 支持平滑扩容的字典 zskiplist - 附加了后向指针的跳跃表 intset - 用于存储整数数值集合的自有结构

吐血整理60个Redis面试题

微笑、不失礼 提交于 2020-08-12 05:32:01
1.Redis 是一个基于内存的高性能key-value数据库。 2.Redis相比memcached有哪些优势: memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 redis的速度比memcached快很多 redis可以持久化其数据 3.Redis是单线程 redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销 4.Reids常用5种数据类型 string,list,set,sorted set,hash 6.Reids6种淘汰策略: noeviction : 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。大多数写命令都会导致占用更多的内存(有极少数会例外。 **allkeys-lru:**所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。 **volatile-lru:**只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。 **allkeys-random:**所有key通用; 随机删除一部分 key。 volatile-random : 只限于设置了 expire 的部分; 随机删除一部分 key。 volatile-ttl : 只限于设置了 expire

Serverless 的初心、现状和未来

天涯浪子 提交于 2020-08-11 12:44:50
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 阿里妹导读:Serverless 是如何产生的?当前有哪些落地场景?Serverless 的未来又将如何?本文分享阿里资深技术专家对 Serverless 的看法,回顾其发展历程,并对 Serverless 的发展趋势做出预测。 源起 回望整个计算机技术发展史,我们会发现 “抽象、解耦、集成” 的主题贯穿其中。产业每一次的抽象、解耦、集成,都将创新推向新的高度,也催生出庞大的市场和新的商业模式。 大型机时代,硬件和软件都是定制化的,使用专有的硬件、操作系统和应用软件。 PC 时代,硬件被抽象解耦成 CPU、内存、硬盘、主板、USB 设备等标准化的部件,不同厂商生产的部件可以自由组合,组装成整机。软件被抽象解耦为操作系统、库等可复用组件。硬件和软件的抽象解耦,创造了新的商业模式,释放了生产力,造就了 PC 时代的繁荣。 云的时代,硬件软件化和软件服务化成为最显著的两个趋势。 硬件软件化的核心在于硬件功能中越来越多的部分由软件来呈现,从而在迭代效率、成本等方面获得显著优势。以软件定义存储(Software Defined Storage,SDS)为例,SDS 是位于物理存储和数据请求之间的一个软件层,允许用户操控数据的存储方式和存储位置。通过硬件与软件解耦,SDS

Spring Data 教程

有些话、适合烂在心里 提交于 2020-08-11 10:44:56
1. Redis简介 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。Redis 是一个高性能的key-value数据库。 redis的出现,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。 redis的key都是字符串 String 类型,它的value是多样化的,如下图: redis数据类型 ENCODING返回的编码 底层对应的数据结构 string int long类型的整数 string embstr embstr编码的简单动态字符串 string raw 简单动态字符串 list ziplist 压缩列表 list