Redis 是 Remote Dictionary Service 远程字典服务的首字母缩写
Redis 的 5 种数据结构分别为 string、list、hash、set 和 zset 也就是 字符串、列表、字典、结合 和 有序集合
Redis 所有的数据结构都以唯一的 key 字符串作为名称,然后通过这个唯一的 key 来获取相应的 value 数据。
不同类型的数据结构的差异就在于 value 的结构不一样。
- 字符串
字符串内部是一个字符数组,类似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 四种数据结构是容器类型数据结构
- 如果容器不存在,就创建一个再操作
- 如果元素没有了,就立即删除容器,释放内存
过期时间:
Redis 所有的数据结构都可以设置过期时间,时间到了,redis会自动删除对应的 对象。
需要注意的是,过期是以对象为单位的,如果hash结构的过期时间是整个hash对象,而不是某个key
另外,如果一个string对象设置了过期时间,然后你使用set方法修改了它,但是没有指定新的过期时间,它的过期时间会消失