0%

【Redis学习】Redis数据类型与常用命令

String、List、Hash、Set、SortedSet的常用方法和底层编码实现

STRING (字符串)

实现原理

底层由SDS(Simple Dynamic String, 简单动态字符串)实现。

特点:

  • 1个 value 最大支持 512M 的数据
  • 可以存储二进制字符串

常用命令:

  • SET key value
    • 设置 key 的值的 value
  • GET key
    • 获取 key 的值
  • INCR key
    • key 的值自加1
    • key 的值必须要是整数 且要在64位int范围内 [-2^63, 2^63 - 1]
  • INCRBY key increment
    • key += increment
  • DECR key
    • key的值自减1
  • DECRBY key increment
    • key -= increment
  • GETSET key value
    • 设置key的值并返回老的值
  • SETRANGE key offset value
    • key 的值从 offset 开始设置为 value
    • key看做是一个指针, 这个命令把key + offert的地址开始设置为了value,不检查长度
  • MGET key [key …]
    • 获取多个 key 的值
  • MSET key value [key value …]
    • 同时设置多个键的值
  • SETNX key value
    • 只有 key 不存在的时候才设置 key 的值为 value
  • SETEX key seconds value
    • 设置 key 的过期时间, 过期就自动被删了

LIST (列表)

实现原理

底层使用 quicklist 实现,quicklist 是一个 ziplist 的双向链表, 每个 ziplist 最大值可在配置文件中的list-max-ziplist-size设置, 默认为 -2 (8kb)

Redis的列表与双端队列(deque)类似

常用方法

  • RPUSH key value [value …]
    • 将值推入到列表 key 的右端
    • 相当于 pythonappend()
  • LPUSH key value [value …]
    • 将值推入列表左端
    • 相当于 python 列表的 insert(0, value)
    • 将多个 value 按从左到右的顺序 lpush,最右边的值在最左边
  • LPOP
    • 列表左端弹出一个值并返回弹出的值
  • RPOP
    • 列表右端弹出一个值
  • LRANGE key start stop
    • 获取列表在指定范围上的所有值, 包括 startstop
  • LINDEX
    • 获取列表在给定位置上的单个元素
  • LSET key index value
    • 设置列表 key 的索引为 index 的值 value
  • LTRIM key start stop
    • 只保留索引 在 [start, end] 中的元素的值, 干掉其他的
  • LINSERT key BEFORE|AFTER pivot value
    • 在列表 key 的值为 pivot 的元素前或后插入一个值为 value 的元素
    • 存在多个相同值的元素只管最左侧的元素
    • 成功: 返回列表长度, 指定元素不存在不执行操作, 返回-1, 列表不存在返回0
  • LREM key count value
    • 移除列表中与value相等的元素
    • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
    • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
    • count = 0 : 移除表中所有与 VALUE 相等的值。

HASH (哈希表)

实现原理

底层由 hashtableziplist 实现

满足以下2个条件是使用 ziplist, 否则转化为hashtable编码

  • 哈希保存的键值对数量小于 hash-max-ziplist-entries (默认为 512 )个
  • 所有键值对的键和值的字符串长度都小于 hash-max-ziplist-value (默认为 64) 字节

和 Python 的字典类似, 不过 Redis 的 HASH 的 key 和 value 都只能是STRING, 不能嵌套

常用方法:

  • HSET key field value
    • 将哈希表 key 中的字段 field 的值设为 value
  • HGET key field
    • 获取哈希表 key 中字段 field 的值
  • HEXISTS key field
    • 查询哈希表 key 中,指定字段 filed 是否存在
  • HVALS key
    • 获取哈希表 key 中的所有值
  • HLEN key
    • 获取哈希表中键值对的数量
  • HKEYS key
    • 获取哈希表 key 中的所有键

SET (集合)

底层实现

底层由 hashtableintset 实现

当集合的元素都是整数 且 元素个数小于 set-max-intset-entries (默认为512) 时集合的编码对象是intset, 其他情况都是哈希表

常用命令

  • SADD key member [member …]
    • member添加到集合key
  • SMEMBERS key
    • 获取集合key的所有元素
  • SCARD key
    • 获取集合的元素数量
  • SDIFF key1 [key2 …]
    • 求给定所有集合的差集(s1-s2-s3-...)
  • SINTER key1 [key2]
    • 求给你所有集合的交集(s1&s2&s3...)
  • SUNION key1 [key1…]
    • 求给定所有集合的并集(s1|s2|s3...)
  • SDIFFSTORE destination key1 [key2 …]
    • 求给定所有集合的差集, 并存储到destination
  • SINTERSTORE destination key [key …]
    • 求给定所有集合的交集, 并存储到destination
  • SUNIONSTORE destination key [key …]
    • 求给定所有集合的并集, 并存储到destination
  • SREM key member [member …]
    • 从集合中删除一个或多个元素
  • SPOP key [count]
    • 随机删除count个幸运元素, 不指定count则随机删除一个
  • SMOVE source destination member
    • member从集合source移动到destination
    • 删掉source中的member同时向destination中添加member(不管destination中有没有)
  • SISMEMBER key member
    • 判断member是否是集合中的元素

SORTED_SET (有序集合)

底层实现

底层由ziplistskiplist(跳表实现)

常用命令

  • ZADD key [NX|XX] [CH] [INCR] score member [score member …]
    • 将一个或多个 member 元素及其 score 值加入到有序集合 key
    • 如果某个 member 已经是有序集合的元素,那么更新这个 memberscore
    • 参数:
      • XX: 仅更新已经存在的元素, 不添加元素。
      • NX: 只添加新元素, 不改变已有元素
      • CH: 将返回值修改为添加和修改的元素数量总数(不加此参数值返回添加的元素数量)
      • INCR: 将member的分值加上score(与ZINCRBY功能相同)
  • ZSCORE key member
    • 获取有序集合中指定元素的分数
  • ZCARD key
    • 获取有序集合key的元素数量
  • ZCOUNT key min max
    • 获取值在[min, max]之间的元素数量
  • ZRANGE key start stop [WITHSCORES]
    • 获取有序集合 key 中,索引在[start, stop]的元素(从小到大排序)
    • -1表示最后一个元素, -2表示倒数第二个元素
  • ZREVRANGE key start stop [WITHSCORES]
    • ZRANGE功能相同, 从大到小排序
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
    • 获取有序集合中分数在[min, max]中的元素
    • minmax可以是inf-inf
    • minmax 默认为开区间(包含最小值和最大值)
    • 可以在 minmax 前加( 表示使用闭区间(不包含), 如 ZRANGEBYSCORE zs (1 5 就表示返回 1 < socre <= 5的元素;
    • 开闭区间的判断与解析源码在 zslParseRange 函数中
  • ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
    • ZRANGEBYSCORE功能相同, 从大到小排序
  • ZRANK key member
    • 返回有序集合中member元素的排名(按分值从小到大排序), 分值相同按键的ascii字母排序
  • ZREVRANK key member
    • 返回 member 元素从大到小的排名
  • ZREM key member [member …]
    • 删除有序集合中指定的元素
  • ZREMRANGEBYRANK key start stop
    • 删除有序集合中排名在[start, stop]之间的元素
  • ZREMRANGEBYSCORE key min max
    • 删除值在[min, max]之间的元素
  • ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
    • 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination
  • ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
    • 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination
    • WEIGHTS 参数可指定权重
    • AGGREGATE 参数可指定聚合方式 和|最大值|最小值, 默认是 SUM