前言
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是多样化的,如下图:
![02684b72f650fc7a5009faa103bde879.png](https://i-blog.csdnimg.cn/blog_migrate/90340d6df58b93758d6730c1ddac531c.jpeg)
2. Redis的五种数据类型
2.1 字符串对象(String)
字符串对象的模型:
![a507460580aa92126e7b8d500baaf332.png](https://i-blog.csdnimg.cn/blog_migrate/90811a06fefb6314a387ac7d22f32638.jpeg)
redis底层提供了三种不同的数据结构实现字符串对象,根据不同的数据自动选择合适的数据结构。这里的字符串对象并不是指的纯粹的字符串,数字也是可以的。
- int:当数据是long类型的整数字符串时,底层使用long类型的整数实现。这个值会直接存储在字符串对象的ptr属性中,同时OBJECT ENCODING为int。
- raw:当数据为长度大于44字节的字符串时,底层使用简单动态字符串实现,说到这里就不得不提下redis的简单随机字符串(Simple Dynamic String,SDS),SDS有三个属性,free,len和buf。free存的是还剩多少空间,len存的是目前字符串长度,不包含结尾的空字符。buf是一个list,存放真实字符串数据,包含free和空字符。针对SDS本文不做详细介绍,欢迎点击了解。
- embstr:当数据为长度小于44字节的字符串时,底层使用embstr编码的简单动态字符串实现。相比于raw,embstr内存分配只需要一次就可完成,分配的是一块连续的内存空间。
2.2 列表对象(List)
列表对象的模型:
![1d539210f43ce78bbb53a2d8fa03157f.png](https://i-blog.csdnimg.cn/blog_migrate/31a97e4f40a9a010f799ae94835022bb.jpeg)
redis中的列表对象经常被用作消息队列使用,底层采用ziplist和linkedlist实现。大家使用的时候当作链表使用就可以了。
- ziplist 列表对象使用ziplist编码需要满足两个要求,一是所有字符串长度都小于设定值值64字节(可以在配置文件中修改list-max-ziplist-value字段改变)。二是所存元素数量小于设定值512个(可以在配置文件中修改list-max-ziplist-entries字段改变)。ziplist类似与python中的list,占用一段连续的内存地址,由此减小指针内存占用。 zlbytes:占内存总数 zltail:到尾部的偏移量 zllen:内部节点数 node:节点 zlend:尾部标识 previous_entry_length:前一节点的长度 encoding:数据类型 content:真实数据 遍历的时候会根据zlbytes和zltail直接找到尾部节点nodeN,然后根据每个节点的previous_entry_length反向遍历。增加和删除节点会导致其他节点连锁更新,因为每个节点都存储了前一节点的长度。
- linkedlist linkedlist有三个属性,head,tail和len。head指向链表的头部,tail指向链表的尾部,len为链表的长度。
2.3 哈希类型对象(Hash)
哈希类型对象的模型:
![b9e5e5306109b39675de898e4047fc63.png](https://i-blog.csdnimg.cn/blog_migrate/c37c13d47093c3fc6d39e3d15e065f4c.jpeg)
redis的value类型hash类型,其实就是map类型,就是在值的位置放一个map类型的数据。
2.4 集合对象(Set)
集合对象类型的模型: