Redis 数据结构

Redis 是 Remote Dictionary Service 远程字典服务的首字母缩写

Redis 的 5 种数据结构分别为 string、list、hash、set 和 zset 也就是 字符串、列表、字典、结合 和 有序集合

Redis 所有的数据结构都以唯一的 key 字符串作为名称,然后通过这个唯一的 key 来获取相应的 value 数据。
不同类型的数据结构的差异就在于 value 的结构不一样。

  1. 字符串

字符串内部是一个字符数组,类似Java的ArrayList,小于 1M 大小的空间时是全增的,直接 double 一倍容量,超过1M 大小时,每次增加 1M,最大 512M

虽然可以使用 set age 30 来存储 数字,而且可以使用 incr age 来使它自增,但是 数字实际上也是 string

2 列表

Redis 的 list 相当于Java的 LinkedList,是一种链表 而不是 数组。插入 和 删除 非常快 O(1),但是索引定位很慢 O(n),列表的每个元素都使用双向指针顺序,可以同时支持向前向后遍历。

在列表元素较少的情况下,会使用一块连续内存,这个结构是 ziplist,将所有的元素彼此紧挨着一起存储。当数据量较多的时候会改成普通链表,所以redis将列表和ziplist结合起来组成了 quicklist,也就是将 多个 ziplist 使用双向链表串起来使用。

3 hash字典

类似Java的HashMap是一种无序字典, 数组 + 链表 的 二维结构,第一维的 hash 数组位置碰撞时,就会将碰撞的元素使用链表串起来

Redis的字典值只能是 字符串

另外 java 的 hashmap 在 rehash 的时候需要阻塞,redis为了高性能不阻塞,采用的是渐进式rehash策略。

4 set集合

Redis 的集合 相当于 Java的 HashSet,内部是 无序键值对,并且是 唯一的。
它的内部实现是一个 所有value值都为 NULL的特殊字典。Set结构天生自带去重功能。

5 zset 有序列表

zset 类似 java 的 SortedSet 和 HashMap 的结合体,一方面它是一个set保证了value的唯一性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重。

zset 的内部实现使用的是一种叫做 跳跃列表 的数据结构

通用规则:

list、set、hash 和 zset 四种数据结构是容器类型数据结构

  1. 如果容器不存在,就创建一个再操作
  2. 如果元素没有了,就立即删除容器,释放内存

过期时间:

Redis 所有的数据结构都可以设置过期时间,时间到了,redis会自动删除对应的 对象。

需要注意的是,过期是以对象为单位的,如果hash结构的过期时间是整个hash对象,而不是某个key

另外,如果一个string对象设置了过期时间,然后你使用set方法修改了它,但是没有指定新的过期时间,它的过期时间会消失

Send a Message