redis数据结构

94 阅读2分钟

redis数据结构

String(字符串)

它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M

底层实现

  1. 内部编码:

    1. int(8字节长整型)
    2. embstr(小于等于39字节字符串)
    3. raw(大于39个字节字符串)
  2. SDS(字符串数据结构)

    struct SDS<T> {
    T capacity; // 数组容量
    T len; // 数组长度
    byte flags; // 特殊标识位,不理睬它
    byte[] content; // 数组内容
    }
    

常用命令

set key expire value
setnx key value
incr key #key的值加1
incyby key num key的值加num
get key
del key
mset key1 value1 key2 value2
mget key1 key2
​

应用场景

共享session、分布式锁,计数器、限流

List(链表)

列表(list)类型是用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素。

底层实现

  1. 内部编码:

    1. ziplist(压缩列表)
    2. linkedlist(链表)串)

常用命令

  1. lpush+lpop=Stack(栈)
  2. lpush+rpop=Queue(队列
  3. lpsh+ltrim=Capped Collection(有限集合
  4. lpush+brpop=Message Queue(消息队列)
  5. lindex 相当于 Java 链表的 get(int index)方法
  6. ltrim start_index end_index 截取start到end区间的值 负数表示倒数例如-2表示倒数第二个数

应用场景

实现数据结构:栈、队列 有序集合 、消息队列

Hash(字典)

与java中的HashMap相似,无序字典,不同的是该结构只能存储字符串,以及在发生hash碰撞时进行rehash方式不同,redis采用渐进式rehash。 image-20220109145337393.png 渐进式 rehash 会在 rehash 的同时,保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务中以及 hash 的子指令中,循序渐进地将旧 hash 的内容 一点点迁移到新的 hash 结构中。

set

Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一

底层实现:

  1. intset(整数集合)
  2. hashtable(哈希表)

应用场景:

用户标签,生成随机数抽奖、社交需求。

set 结构可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次

zset

已排序的字符串集合,同时元素不能重复

底层实现

  1. ziplist(压缩列表)
  2. skiplist(跳跃表)

应用场景:

排行榜,社交需求(如用户点赞)。

zset 可以用来存粉丝列表, value 值是粉丝的用户 ID, score 是关注时间

zset 还可以用来存储学生的成绩, value 值是学生的 ID, score 是他的考试成绩 获取排名