list 转set_Redis探索(四)list/hash/set/sorted_set

    简单记录下redis的list/hash/set/sorted_set这四种数据类型与应用场景。基本操作命令使用不再这里赘述,可以参考官方资料敲一敲学习~~ 1. list     redis的list底层有三种实现:
  • 双向链表linklist,特点是访问速度快,但占用空间大。

  • ziplist,特点是内存连续,占用空间小,但插入或者修改有可能导致内存拷贝,影响插入修改的效率。

  • quicklist算是对内存占用和访问速度的一个妥协,综合了上述两种数据结构的优点设计,quicklist的每个节点包含数个ziplist节点组成。

    查看list的底层数据结构类型:

d21281068ac23709cbb00e32ab5af837.png

    list可以做什么呢?参考命令:

13df11d9431a0a5698eb1f487f3b6071.png

    应用场景:

  • 模拟栈(FILO):

    5c5b897c9a6db6778b53bdb1bf254113.png

  • 模拟队列(FIFO):

    80e641272c7434e755bc09b128aaa284.png

  • 有限集合:

    315d2ae346aa6b46f45b067199a2c859.png

  • 阻塞队列:

    窗口1,阻塞

    36335456b8b15a08c77115d6de94d3f1.png

    窗口2,push元素666后,窗口1收到了消息666

    e55d7528953f0b05eace62b298c28992.png

    06bcc36556ec84776b0d530d05ec89d8.png

2. hash     redis中hash的底层实现一样有两种,ziplist与hashtable。如下图当hash元素小于512个并且元素大小小于64字节时,使用的底层实现为ziplist。

1131a48915227d2ae078764fbe68230f.png

    如下图 当ziplist无法满足时,使用hashtable。

5e455ffd4ca252fc0609378433f30a2a.png

    同样的hashtable会消耗更多的内存,但是读取速度很快。ziplist使多个元素连续紧凑的存储,更加节约内存,但读写会变慢。

    应用场景:可以对field进行数值计算,比如说记录某一篇文章的点赞数、阅读数、关注数、转发数等。如下图:

afd812cffa67ea96951f1e007f05a2f5.png

3. set     set中的元素是不允许重复的。redis中set的底层数据结构实现也有两种,intset与hashtable。如下图当set元素小于等于512个的时候,会使用inset的这种数据结构,否则使用hashtable。

b7f88b1814b52780e710b015d9543b46.png

    先用下面代码构造s1的set值为1-512;查看encoding为intset,当添加一个不存在的元素后,底层数据结构转变成了hashtable。

539a6d2cd5ef1378a515b9e3f7b1f013.png

0637ecc93a32e7c1c2924453a652eb06.png

    同样的redis使用intset的数据结构可以减小内存的占用,但又不会特别影响查询的性能,当数据量大了之后,自动转换为hashtable。     应用场景: set可以求交集、并集、差集等,利用这些特性可以用来计算比如说某些用户的共同爱好,有某个爱好的用户有哪些(那么可以针对这些用户投放爱好的内容)等。set可以产生随机事件,那么也可以用来做抽奖程序,

7c12bf45ec4084256386e4d197f000bc.png

94639908724e69e06b3c1bc815711882.png

4. sorted_set     sorted_set在redis中底层数据结构也有两种实现,ziplist与skiplist。查看配置如下,当sorted_set的数量不大于128并且值不大于64个字符时,使用ziplist实现,否则使用skiplist(跳表);

b5abe4f5b702b350553633728db36af6.png

3f489c78c3bfa4e95378bf8c641b65f0.png

    同样的出于对内存占用和访问速度的均衡,采用了ziplist转跳表skiplist的设计。跳表通过提升维度的方式,达到二叉树一样O(logN)的时间复杂度,感兴趣可以去看看跳表的实现,也可以尝试手写跳表。     应用场景:sorted_set提供了set的集合操作,同时加入了权重的概念,可以按照权重来聚合多个sorted_set。可以用在排行榜上面,如下面的歌曲排行榜:

60026d3a170ee0e66a36b05046b1c385.png

    还可以方便的将多个榜单,按照一定的权重聚合成一个总的榜单。参考命令:

f10b6cb5207310c06aab47f1f197761f.png

f3469fd2e6e4a40618ebe301ba5c3fd2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值