来辣!!!
整个列表对应一个key值,可以从头部也可以从尾部添加元素,没有元素时就自动删除。
少量列表项和少量键值对,Redis底层都会使用压缩列表实现。
quicklist和ziplist
quicklist
和 ziplist
都是 Redis 中为了提高存储效率和查询速度而设计的数据结构。它们在 Redis 的 List 数据类型中有应用。
ziplist (压缩列表)
- 是一个特别为内存存储优化的链表。
- 存储多个条目,每个条目可以是字符串或整数。
- 用于存储较小的列表,如小字符串和小整数。
- 通过连续的内存分配,实现了对空间的高效利用,提高读写效率。
- 但是,它不太适合非常长的列表,因为它的插入和删除操作在较长的列表上可能会变得较慢。
quicklist
- 是为了克服
ziplist
的局限性而设计的,结合了ziplist
和双向链表的特点。quicklist
由多个ziplist
节点组成,这些节点通过双向链表连接。- 当列表较小时,只需要一个
ziplist
节点。- 当列表增长并超出单个
ziplist
的最大容量时,quicklist
将添加更多的ziplist
节点。- 这种结构允许 Redis 在内存效率和操作速度之间达到一个平衡。
List 结构应用
在 Redis 的早期版本中,List 结构仅使用 ziplist
作为底层实现。但随着 ziplist
在较长的列表上的性能问题变得明显,Redis 开发者引入了 quicklist
作为 List 的默认实现。
在现代的 Redis 版本中,List 结构使用 quicklist
作为默认存储,它会根据配置和数据的大小智能地决定何时将数据存储在单独的 ziplist
节点中。
为了更好地控制性能和存储效率,Redis 允许用户通过配置文件参数(如 list-max-ziplist-size
和 list-max-ziplist-entries
)来调整 quicklist
和 ziplist
的行为。
ziplist扩展
Redis 的 hash 结构在元素数量较少或元素内容较小的情况下会使用 ziplist
作为其底层存储。这是一个优化策略,用于减少内存使用并提高读写效率。
Redis 的多种数据结构都使用了这种优化方法,包括:
- Hash:当字段数量较少时使用
ziplist
。- List:如前所述,当元素数量较少时,会使用
ziplist
存储,但包装在quicklist
结构中。- Set:当元素数量较少并且元素都是整数时,会使用
intset
(整数集合)。否则,它将使用哈希表。- Sorted Set:当元素数量较少且都是整数时,会使用
ziplist
存储。否则,它将使用一个组合结构,包括哈希表和跳表。
为什么要这样做?这种设计策略的原因是:
- 内存效率:较小的数据结构使用连续的内存分配和紧凑的存储格式,这有助于减少内存碎片和总体内存使用。
- 操作效率:在小数据集上,紧凑的数据结构通常提供更快的读写速度。
好好好,老师后面讲到了:
lpush代表头部,rpush代表尾部,lindex读取指定索引位置元素的值。
注意是lpush还是rpush,注意最终的index值!0是链表头部!
没有rrange,且必须是左参数>右参数!
小仙女的Redis:0>lrange list1 0 -1
1) "10"
2) "2"
3) "1"
小仙女的Redis:0>linsert list1 before 2 20
"4"
小仙女的Redis:0>lrange list1 0 -1
1) "10"
2) "20"
3) "2"
4) "1"
LTRIM起到截取的作用,和LRANG类似,但LRANG不修改列表,只是展示而已。
好好好,好好好,还差最后一个Set,冲啊!!!
和python一样,Set都是存储各不相同的元素,并且无序。
返回1表示移除成功!
还有随机获取元素SRANDMEMBER set count(从Set中随机抽取重复、不重复的元素,比如可以用于用户抽奖等)、随机移除元素SPOP key count、集合运算SINTER/SUNION/SDIFF set set多个集合求交集并集差集。
分值的定义!
ZREM删除成员,ZSCORE通过成员名称获取分数,ZINCRBY指定成员分值自增自减操作,ZRANK得到成员排名(升序,名次从0开始),ZREVRANK降序排名,ZRANGE给定分值排名范围,ZCOUNT成员数量
数值(表示开,是开区间,不仅仅是左开,可以作为右开使用,括号仍然是左括号
+Inf表示正无穷大,-inf表示负无穷大!