Redis介绍与内部实现机制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Redis介绍与实现机制第一章Redis介绍一、Redis特性(一)存储结构Redis是RemoteDictionaryServer的缩写,它使用字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。同大多数脚本语言中的字典一样,Redis字典中的键值除了可以是字符串,还可以是其他数据类型。Redis支持的数据类型有字符串、散列、列表、集合、有序集合。(二)内存存储与持久化Redis数据库的所有数据都存储在内存中。在一台普通的笔记本电脑上,Redis可以在1秒内读写超过十万个键值。Redis也提供了持久化的支持,即将内存中的数据异步写入硬盘中,同时不影响继续提供服务。(三)功能丰富Redis在很多场合是名副其实的多面手,越来越多的人将其用作缓存、队列系统中。例如,Redis可作为缓存系统,并且可以为每个键设置生存时间,生存时间到期后键会自动删除;Redis还支持“发布/订阅”的消息模式,等等(四)简单稳定在Redis中使用命令来读写数据,就相当于SQL语言之关系型数据库。并且Redis提供了几十种不同编程语言的客户端库,这些库很好地封装了Redis命令,使得在程序中与Redis进行交互更加容易。Redis是开源的,良好的开发氛围和严谨的版本发布机制使得Redis的稳定版本更加可靠。SQL语句:SELECTtitleFROMpostsWHEREid=1LIMIT1Redis中命令:HGETpost:1title二、Redis数据类型1.字符串类型字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,例如存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512MB。2.散列类型Redis是采用字典结构以键值对的形式存储数据,而散列类型的键值也是一种字典结构,其存储了字段和字段值的映射,但是字段值只能是字符串,不支持其他数据类型。散列类型适合存储对象。3.列表类型列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个字段。4.集合类型集合中的每个元素都是不同的,并且没有顺序。一个集合类型(set)键可以存储至多232-1个字段。5.有序集合类型在集合类型的基础上,使得我们可以获得最高(最低)的前N个元素、指定分数范围内的元素等与分数有关的操作。三、Redis常用命令(0)启动启动Redisredis-server检查Redis是否在工作redis-cli(1)字符串SETnameTomGETnameSETcounter1000INCRcounterDECRcounterAPPENDnameJackGETname(2)散列类型HMSETcarnamevolvocolorblackprice20HMGETcarnameHEXISTScarnameHDELcarprice(3)列表类型LPUSHlistsredisLPUSHlistsmogodbRPUSHlistsmysqlLPOPlistsRPOPlistsLRANGElists010(4)集合类型SADDlettersaSADDlettersabcSREMletterscdSMEMBERSlettersSADDsetA123SADDsetB234SDIFFsetAsetB(5)有序集合ZADDtutorials1redis2mongodb3mysql3mysqlZRANGEtutorials010WITHSCORES(6)事务MULTIINCRlikesINCRvisitorsEXEC(7)生存时间SETsessionuuid11EXPIREsession20TTLsession(8)排序LPUSHmylist426173SORTmylistLPUSHmylistalphaacedcaSORTmylistalphaALPHA(9)消息通知PUBLISHredisChatRedisisagreatcachingtechniqueSUBSCRIBEredisChatPUBLISHredisChatLearnredisbytutorialspointRedis的底层通信协议对管道(pipelining)提供了支持,通过管道可以一次性发送多条指令并在执行完成后一次性将结果返回,当一组命令中每条命令不依赖于之前命令的执行结果时就可以将这组命令一起通过管道发出,管道可以减少客户端与Redis的通信次数来实现降低往返时延累计值的目的。第二章Redis数据结构与对象简单动态字符串、链表、跳跃表、字典、压缩列表、整数集合;对象一、Redis数据结构—简单动态字符串(SDC)Redis没有直接使用C语言传统的字符串表示,而是自己构建了名为简单动态字符串(simpledynamicstring,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区,例如AOF模块中的AOF缓冲区、客户端状态中的输入缓冲区等。与C字符串的区别:(1)常数复杂度获取字符串长度(2)杜绝缓冲区溢出(3)减少修改字符串时带来的内存重分配次数(空间预分配、惰性空间释放)一、Redis数据结构—简单动态字符串(SDC)跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。在大多数情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树更为简单,所以有不少程序使用跳跃表代替平衡树。Redis只在两个地方用到了跳跃表,一个是实现有序集合,另一个是集群节点中用作内部数据结构。header:指向跳跃表的表头节点;tail:指向跳跃表的表尾节点;level:记录目前跳跃表中,层数最大的那个节点层数;前进指针、后退指针、跨度一、Redis数据结构—跳跃表链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点灵活地调整链表的长度。链表内置在许多高级的编程语言中,因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。除了链表键之外,发布与订阅、慢查询、监视器等功能也使用到了链表。一、Redis数据结构—链表字典,是一种用于保存键值对的抽象数据结构,C语言没有内置这种数据结构,因此Redis构建了自己的字典实现。字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典作为底层实现的,对数据库的增、删、改、查等操作也是构建在对字典的操作之上。一、Redis数据结构—字典整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。contents数组是整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项,各个项在数组中从小到大有序排列,并且数组中不包含任何重复项。length属性记录了整数集合包含的元素数量,也即是contents数组的长度。一、Redis数据结构—整数集合压缩列表是列表键和哈希键的底层实现,当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度较短的字符串,那么Redis就会使用压缩列表作为列表键的底层实现。压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。一、Redis数据结构—压缩列表二、Redis对象Redis并没有直接使用前面所述的数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象五种类型的对象,每种对象都用到了至少一种前面介绍的数据结构。Redis使用对象来表示数据库中的键和值,每次当我们在Redis数据库中新创建一个键值对时,至少会创建两个对象,一个对象用作键值对的键(键对象),另一个用作键值对的值(值对象)。raw:简单动态字符串linkedlist:双端链表ziplist:压缩列表int:long类型整数intset:整数集合ht:字典string:字符串对象list:列表对象hash:哈希对象Set:集合对象Sortedset:有序集合对象二、Redis对象通过encoding属性来设定对象所使用的编码,而不是为特定的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,可以根据不同的场景设置不同的编码,从而优化对象在某一场景下的效率。例如,当列表对象包含元素比较少时,Redis使用压缩列表作为列表对象的底层实现。每种类型的对象都至少使用了两种不同的编码,如下表所示:二、Redis对象—内存回收、对象共享由于C语言并不具备自动内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数(referencecounting)技术实现内存回收机制,通过这一机制,程序可以跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。Redis还通过引用计数技术实现对象共享机制,这一机制可以在适当的条件下,通过让多个数据库键共享一个对象来节省内存。当数据库中保存的相同值对象越多,对象共享机制就能节约越多的内存。(1)在创建一个新对象时,引用计数的值会被初始化为1;(2)当对象被一个新程序使用时,它的引用计数值会被增一;(3)当对象不再被一个程序使用时,它的引用计数值会被减一;(4)当对象的引用计数值变为0时,对象所占用的内存会被释放;(1)将数据库键的值指针指向一个现有的值对象(2)将被共享的值对象的引用计数增一第三章Redis功能实现机制持久化、事务、发布与订阅、集群、排序、事件等一、持久化—RDB由于Redis是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器退出,服务器中的数据库状态也会消失不见。为了解决这个问题,Redis提供了RDB、AOF持久化方式,将内存中的数据保存到磁盘中,避免数据意外丢失。(1)RDB:RDB持久化通过将服务器某个时间点上的数据库状态(非空数据库以及相关键值对)保存到一个RDB文件中,Redis服务器可以用它来还原数据库状态。SAVE命令会阻塞Redis服务器进程。而BGSAVE会派生出一个子进程,然后由子进程负责创建RDB文件,服务器父进程继续处理命令请求。还可以SAVE命令设置自动间隔保存,例如SAVE6010000服务器在60秒之内,对数据库进行了至少10000次修改,自动执行BGSAVE命令。RDB文件是一个经过压缩的二进制文件。(1)服务器状态结构redisServer的saveparams属性用来保存一个save选项设置的保存条件。(2)dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态进行了多少次修改。lastsave属性是一个时间戳,记录了服务器上一次成功执行SAVE或BGSAVE命令的时间一、持久化—AOF(2)AOF:AOF持久化通过保存Redis服务器所执行的写命令来记录数据库状态的。被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,Redis的命令请求协议保存为纯文本格式。AOF持久化功能的实现分为命令追加、文件写入、文件同步三个步骤:当AOF持久化处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令(如SET、SADD、RPUSH)追加到服务器状态的aof_buf缓冲区的末尾。服务器在每次结束一个事件循环之前,它都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件里面。flushAppendOnlyFile函数的行为由服务器配置的appendfsync选项的值(always、everysec(默认)、no

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功