redis04(link链表结构与命令详解)
link链表
Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。
当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。...


快速列表
如果再深入一点,你会发现 Redis 底层存储的还不是一个简单的 linkedlist,而是称之为快速链表 quicklist 的一个结构。

首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成 quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间,而且会加重内存的碎片化。比如这个列表里存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next 。所以 Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。...
//压缩链表内部和快速链表内部。水平境界目前有限,底层原理暂时不深入
https://juejin.im/book/5afc2e5f6fb9a07a9b362527/section/5b5c95226fb9a04fa42fc3f6
https://juejin.im/book/5afc2e5f6fb9a07a9b362527/section/5b5c963be51d45199154e82e
lpush key value1 value2 value3
左侧插入
rpush key value1 value2 value3
右侧插入
lrange list 0 -1
查看链表 左侧 0 , 右侧-1

rpop value
删除最右边的元素,并弹出
lrem count value
链表删除,删除count个value
count > 0 从表头删除,count < 0 从表尾删除
ltrim key start stop
截取一段链表
lindex key index
返回下标index上的值。index 可以为负数,index=-1表示倒数第一个元素,同样index=-2表示倒数第二个元素。
llist key
返回链表的长度
linsert key after|before serach value
开始搜索serach值,找到第一个serach值后,在第一个search值前|后插入value

rpoplpush source dest
把source的尾部拿出放在dest的头部,形成一个安全的双向链表

BITOP AND res key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到res
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到res
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到res
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到res
记录一亿人每天登录情况:

1 一亿人每天登录情况用一亿bit记录约为1200W byte,约等于 10M 就可以存储
2 计算方便