Redis 基础-基础数据结构(第三章)

数据结构

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

  • string(字符串)
  • list(列表)
  • hash(哈希)
  • set(集合)
  • zset(有序集合)

1. string(字符串)

1.1. 使用

  • Redis 的字符串是动态字符串,内部结构实现上类似于 JavaArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,最大长度为 512M
  • 常用来做缓存
  • 常用操作:批量操作,过期设置,自增操作

1.2. 函数

1.2.1. SET <key> <value> [EX seconds] [PX milliseconds] [NX|XX]

  • 如果 key 已经持有其他值, SET 就覆写旧值, 无视类型
  • SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除
  • Redis>=2.6.12 后,
    • EX seconds : 将键的过期时间设置为 seconds 秒,等于SETEX <key> <seconds> <value>
    • PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒,等于PSETEX <key> <milliseconds> <value>
    • NX : 只在键不存在时, 才对键进行设置操作,等于SETNX <key> <value>
    • XX : 只在键已经存在时, 才对键进行设置操作

1.2.2. GET <key>

  • 如果键key不存在, 那么返回特殊值nil,否则,返回键key的值
  • 只用于字符串,如果键key的值并非字符串类型, 那么返回一个错误

1.2.3. GETSET <key> <value>

  • 将键key的值设为value, 并返回键key在被设置之前的旧值,如果key的旧值不存在,命令返回nil
  • 当键key存在但不是字符串类型时, 命令返回一个错误

1.2.4. 其他

函数 返回 备注
STRLEN <key> key储存的字符串值的长度 没有值则返回0,不是字符串则报错
APPEND <key> <value> 追加到键key现有值的value之后,键key的值的长度 没有值则等于SET <key> <value>
SETRANGE <key> <offset> <value> 从偏移量offset开始,用value参数覆写键key储存的字符串值之后,字符串值的长度 如果键key 原来储存的字符串长度比偏移量小,那么原字符和偏移量之间的空白将用零字节(zerobytes,\x00)进行填充
GETRANGE <key> <start> <end> 返回键key储存的字符串值的指定部分,字符串的截取范围由startend(包含)两个偏移量决定 值域超出,忽略超长部分,负数偏移量表示从字符串的末尾开始计数, -1 表示最后一个字符, -2 表示倒数第二个字符
INCR <key> 返回键key在执行+1操作之后的值 如果键key不存在,那么它的值会先被初始化为 0,再执行;如果键key储存的值不能被解释为数字,则报错
INCRBY <key> <increment> 加上增量increment之后,键key当前的值 类同INCR
INCRBYFLOAT <key> <increment> 加上浮点数增量increment之后,键key当前的值 INCR,可以使用指数增量,如2.0e7、3e5、 90e-2;键key的值不是字符串类型或键key的值或给定增量后不能被解释为双精度浮点数
DECR <key> key在执行-1操作之后的值 类同INCR
DECRBY <key> <increment> 减去decrement之后,键key当前的值 类同INCRBY
MSET [key value …] 总是返回 OK 同时为多个键赋值;其是一个原子操作, 所有给定键都会在同一时间内被设置

2. list(列表)

2.1. 使用

  • 相当于 Java 语言里面的 LinkedList,是链表而不是数组,即插入和删除操作非常快,但是索引定位很慢
  • 常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理
  • 常用操作:队列(右进边出),栈(右进右出)
  • 底层是快速链表 quicklist

2.2. 函数

2.2.1. PUSH

函数 返回 备注
LPUSH <key> <value> [value …] 将一个或多个值value插入到列表key表头后列表的长度 按从左到右的顺序原子性地插入,如果key不存在、会创建,当key存在但不是列表类型时,返回一个错误
RPUSH <key> [value …] 将一个或多个值value插入到列表key表尾后列表的长度 类同LPUSH
LPUSHX <key> [value …] 插入表头后表的长度 key不存在时,不操作,其余类同LPUSH
RPUSHX <key> [value …] 插入表尾后表的长度 类同LPUSHX

2.2.2. POP

函数 返回 备注
LPOP <key> 移除并返回列表key的头元素 key不存在时,返回nil
RPOP <key> 移除并返回列表key的尾元素 类同LPOP

2.2.3. 其他

函数 返回 备注
RPOPLPUSH <sour> <dest> 将列表sour中的尾元素弹出并展示,之后再将之作为头元素插入到dest 如果sour不存在,值nil 被返回,并且不执行其他动作
LLEN <key> 返回列表key的长度 如果key不存在,返回0,如果不是列表,返回错误
LREM <list> <count> <value> 根据参数count的值,移除列表中与参数value相等的元素,当key不存在时,返回0 count = 0指移除所有与value相等的值,大于0从头开始,小于0从尾开始
LINDEX <list> <index> 列表中下标为index的元素,如果不在范围区间,返回nil 大于零表示从头开始,小于零表示从尾开始,非列表返回错误

3. hash(哈希)

3.1. 使用

  • 相当于 Java 语言里面的 HashMap,它是无序字典
  • 可来做缓存存储
  • 可自增

4. set(集合)

4.1. 使用

  • 相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL
  • 可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次

5. zset(有序集合)

5.1. 使用

  • 类似于 JavaSortedSetHashMap 的结合体,它既是 set,保证 value 唯一性,又可给每个 value 赋予一个 score,代表这个 value 的排序权重
  • 内部实现是一种叫做“跳跃列表”的数据结构
  • 可以用来存粉丝列表,value 值是粉丝的用户ID,score 是关注时间,我们可以对粉丝列表按关注时间进行排序