基本信息

数据结构

Redis 存储的所有数据都是以唯一的 key 字符串作为名称,以及与之相应的 Value 数据;它有五种基础数据结构,分别为:string(字符串)、list(列表)、hash(字典)、set(合集)和 zset(有序合集)。

string

字符串是 Redis 最简单的数据结构,它的内部就是一个字符串数组;用途非常广泛,常见的如缓存用户信息

存储

Redis 的字符串是动态字符串,可以修改,采用预分配冗余空间的方式来减少内存的频繁分配;一般分配的空间会高于实际字符串长度(容量) len。
当字符串长度(容量)小于 1MB 时,扩容都是加倍现有的空间;如果长度(容量)超过 1MB,扩容时一次只会多扩 1MB 。
字符串最大长度(容量)为 512MB。

操作

  1. #设置
  2. set name junyu
  3. #获取
  4. get name
  5. #校验
  6. exists name
  7. #删除
  8. del name
  9. #批量设置
  10. mset name junyu age 30
  11. #批量获取
  12. mget name age

list

Redis 的列表是链表不是数组,意味着 list 的插入和删除操作非常快,时间复杂度为 O (1);但索引定位很慢,时间复杂度为 O (n)。
列表中的每一个元素都可以使用双向指针顺序,串起来可以同时支持向前或向后遍历;当列表弹出最后一个元素之后,该数据结构被自动删除,内存被回收。
Redis 的列表常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串,塞进 Redis 列表中,另一个线程从这个列表中轮询数据进行处理。

存储

  • 队列:先进先出的数据结构,常用于消息队列异步逻辑处理,确保元素的访问顺序性
  • 栈:先进后出的数据结构,跟队列正好相反(业务场景)

    操作

    1. #创建,入操作
    2. rpush l A B C
    3. #统计长度
    4. llen
    5. #出操作
    6. lpop
    1. #创建,入操作
    2. rpush l A B C
    3. #出操作
    4. rpop

    hash

    Redis 的字典是无序字典,内部存储了很多键值对;都是 “数组 + 链表”的二维结构,采用了渐进式 rehash 的策略。
    渐进式 rehash 会在 rehash 的同时,保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务或操作指令中,渐进的将旧的 Hash 内容一点点移动到新的 Hash 结构中。当移动完成,就会使用新的 hash 结构代替。

    存储

    当 hash 移除最后一个元素之后,该数据结构会被自动删除,内存被回收。
    hash 结构也可以用于存储用户信息,并且不需要序列化,可以直接对用户的每个字段单独存储。当我们需要获取用户信息时可以部分获取,而以字符串存储用户信息只能全部读取,这样会浪费网络流量。
    hash 也有缺点,hash 结构的存储消耗要远高于单个字符串,到底该使用 hash 还是字符串,应该根据实际情况再三权衡。

    操作

    1. hset
    2. hlen
    3. hget

    set

    Redis 的集合内部键值对是无序的,唯一的;相当于一个特殊的字典,字典中所有的 Value 值都是 NULL。
    因为有去重功能,set 可以用来存储活动中奖的用户 ID,可以确保同一用户不会多次中将。

    存储

    当集合中最后一个元素被移除后,数据结构被自动删除,内存被回收。

    操作

    1. #添加条目
    2. sadd
    3. #查看集合(无序)
    4. smembers
    5. #获取长度
    6. scard
    7. #出操作
    8. spop

    zset

    zset 可能是 Redis 中提供的最具有特色的数据结构,叫“跳跃列表”;一方面它是一个 set 保证了内部 Value 唯一性,另一方面它可以给每一个内部 Value 赋予一个 score,代表这个 value 的排位权重。

  • 存储粉丝列表,value 存粉丝 ID,score 为关注时间,按照关注时间进行排序

  • 存储学生成绩,value 存学生 ID,score 为考试成绩,按照分数排名得到名次

    存储

    zset 中的最后一个 value 被移除后,数据结构被自动删除,内存被回收。

    操作

    1. #插入数据
    2. zadd demo 1 "aaa"
    3. zadd demo 2 "bbb"
    4. zadd demo 3 "ccc"
    5. #按 score 顺序列出
    6. zrange demo 0 -1
    7. #按 score 逆序列出
    8. zrevrange demo 0 -1
    9. #计数
    10. zcard demo
    11. #获取指定 value 的 score 值
    12. zscore demo "ccc"
    13. #获取 value 的排名(从 0 开始)
    14. zrank demo "ccc"
    15. # 删除 value
    16. zrem demo "ccc"

    通用规则

    list、set、hash、set 这四种数据结构是容器型的数据结构,它们共享下面两条通用的规则:

  • create if not exists:容器不存在,那就创建一个,在进行操作

  • drop if no elements:容器为空,立即自动删除容器,释放缓存

    生命周期

    Redis 的所有数据都可以已对象为单位设置过期时间,时间一过自动删除相应的对象;都已经存在的对象使用了 set 方法过期时间会取消。
    1. #设置过期时间
    2. expire demo 5
    3. #查看剩余时间
    4. ttl demo