Redis的特点
性能优秀,数据在内存中,读写速度非常快,支持并发10W QPS;
单进程单线程,是线程安全的,采用IO多路复用机制;
丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等;
支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载;
主从复制,哨兵,高可用;
可以用作分布式锁;
可以作为消息中间件使用,支持发布订阅。
Redis的五种数据类型
1. String
String是Redis最基本的数据类型,一个key对应一个value。value是二进制安全的,可以存储jpg图片或者序列化对象,最大可存储512M。
set键值对:setkeyvalueget键值对:getkey
2. Hash
hash类型存储键值对集合,类似于Java中的HashMap类型。hash类型特别适合存储对象,而且可以只修改对象中的某一个属性值。
set单个键值对:hsetkeyfield1value1set多个键值对:hmsetkeyfield1value1field2value2get单个键值对:hgetkeyfield1get多个键值对:hmgetkeyfield1field2get所有的键值对:hgetallkey获取所有的key:hkeyskey删除一个或多个字段:hdelkeyfield1field2查看哈希表中key中field是否存在:hexistskeyfield1为哈希表指定字段的整数值加上增量:hincrbykeyfield2increment获取哈希表中字段的数量:hlenkey
3. List
List是字符串列表,本质实现方式是双向链表,插入的时候可以选择插入到队头或者队尾。在进行增删操作的时候效率很高,一般用于消息队列等场景。
往列表头push元素:lpushkeyvalue1value2往列表尾push元素:rpushkeyvalue3value4获取从左起列表范围内元素(右侧同理):lrangekey010从列表左侧pop元素(右侧同理):lpopkeyvalue1获取列表长度:llenkey
4. Set
Set是String的无序类型,本质是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。Set可以用于判断共同好友、访问网站IP等需要去重的场合。
添加一个或多个成员:saddkeymember1member2获取集合的成员数:scardkey获取集合中的所有成员:smemberskey移除并返回集合中一个随即元素:spopkey返回所有给定集合的交集:sinterkey1key2返回所有给定集合的并集:sunionkey1key2
5. ZSet
ZSet指的是有序集合,和Set一样是String类型元素的集合,且不允许重复的元素。不同的是每个元素都会关联一个double类型的分数score,Redis根据这个score来对集合中的元素进行排序,当你插入之后就会自动根据score排序。
ZSet内部根据HashMap和跳跃表来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。ZSet可用于计算排行榜、带权重的消息队列等。
跳表顾名思义,就是跳跃了一些元素,可以抽象多层。如下图所示,比如我们要查找8,先在最上层L2查找,发现在1和9之间;然后去L1层查找,发现在5和9之间;然后去L0查找,发现在7和9之间,然后找到8。当元素比较多时,使用跳表可以显著减少查找的次数。
同list类似,Redis内部也不是直接使用的跳表,而是使用了一个自定义的数据结构来持有跳表。下图左边蓝色部分是skiplist,右边是4个zskiplistNode。zskiplistNode内部有很多层L1、L2等,指针指向这一层的下一个结点。BW是回退指针(backward),用于查找的时候回退。然后下面是score和对象本身object。
向zset中添加一个或多个成员,或者更新成员分数:zaddkeyscore1member1score2member2获取有序集合的成员数:zcardkey通过索引区间返回有序集合指定区间的成员:zrangekeystartstop