简单记录下redis的list/hash/set/sorted_set这四种数据类型与应用场景。基本操作命令使用不再这里赘述,可以参考官方资料敲一敲学习~~
1. list
redis的list底层有三种实现:
双向链表linklist,特点是访问速度快,但占用空间大。
ziplist,特点是内存连续,占用空间小,但插入或者修改有可能导致内存拷贝,影响插入修改的效率。
quicklist算是对内存占用和访问速度的一个妥协,综合了上述两种数据结构的优点设计,quicklist的每个节点包含数个ziplist节点组成。
查看list的底层数据结构类型:
list可以做什么呢?参考命令:
应用场景:
模拟栈(FILO):
模拟队列(FIFO):
有限集合:
阻塞队列:
窗口1,阻塞
窗口2,push元素666后,窗口1收到了消息666
应用场景:可以对field进行数值计算,比如说记录某一篇文章的点赞数、阅读数、关注数、转发数等。如下图:
3. set set中的元素是不允许重复的。redis中set的底层数据结构实现也有两种,intset与hashtable。如下图当set元素小于等于512个的时候,会使用inset的这种数据结构,否则使用hashtable。先用下面代码构造s1的set值为1-512;查看encoding为intset,当添加一个不存在的元素后,底层数据结构转变成了hashtable。
同样的redis使用intset的数据结构可以减小内存的占用,但又不会特别影响查询的性能,当数据量大了之后,自动转换为hashtable。 应用场景: set可以求交集、并集、差集等,利用这些特性可以用来计算比如说某些用户的共同爱好,有某个爱好的用户有哪些(那么可以针对这些用户投放爱好的内容)等。set可以产生随机事件,那么也可以用来做抽奖程序, 4. sorted_set sorted_set在redis中底层数据结构也有两种实现,ziplist与skiplist。查看配置如下,当sorted_set的数量不大于128并且值不大于64个字符时,使用ziplist实现,否则使用skiplist(跳表); 同样的出于对内存占用和访问速度的均衡,采用了ziplist转跳表skiplist的设计。跳表通过提升维度的方式,达到二叉树一样O(logN)的时间复杂度,感兴趣可以去看看跳表的实现,也可以尝试手写跳表。 应用场景:sorted_set提供了set的集合操作,同时加入了权重的概念,可以按照权重来聚合多个sorted_set。可以用在排行榜上面,如下面的歌曲排行榜:还可以方便的将多个榜单,按照一定的权重聚合成一个总的榜单。参考命令: