Redis常用数据结构和使用场景

Redis默认为16个库,在配置文件中可以修改,从0开始,每个库互相隔离,库中存储的是key,vaule键值对。value分为五种数据结构,分别是string、hash、list、set、sortedSet。

String

String结构又存在3种类型,分别是字符串、数值、bitmap。

  • 字符串

set k1 hello nx 只能新增,只有当k1不存在时才能设置成功。

set k1 hello xx 只能修改,只有当k1存在时才能设置成功。

getset 指令相比于先`get`再`set`而言,少了一次IO。

使用场景:分布式锁

  • 数值

set k1 999 type为string,而encoding为int,这样做`incr`操作的时候不需要判断类型,直接计算即可。

redis是二进制安全的,从socket中读取的是字节流,并不对字节流中的数据进行编码,保证了数据不会被破坏。比如说,如果编码后存储,两个客户端的编码解码不一致,A存储一个字符为两个字节,而B解析出来是四个字节,可能会造成溢出。

使用场景:在一些系统中看似不是很重要的统计,抢购,秒杀,详情页中数据统计,点赞,评论等。可以规避并发情况下对数据库的事务操作,完全由redis内存操作代替。

  • bitmap

setbit k1 1 1 将k1对应的bit位设置为1

使用场景:用户签到、在线用户统计、统计活跃用户。比如统计活跃用户:一个用户系统,要求统计用户登录天数,且窗口随机(某天到某天的数)。常规mysql:存储在表中,每个用户每天登录即为一行数据,每行数据至少需要id,日期等,在8个字节左右,当用户量特别大的时候,查询效率会很慢。会有磁盘IO,读取出来的数据进行解码,再做计算。利用redis的bitmap:一年固定有365天或366天,这样可以用366个二进制位,即最多50个字节就可以记录每个用户一年的登录情况。某天登录把对应的二进制位改为1即可,当查询时,使用bitcount计算即可。即节省了空间,又提高了效率。假如说有1000W用户,500M空间存储足以。

String常用命令

  • SET key value [EX seconds] [PX milliseconds] [NX|XX]: 将 key 和 value 关联
  • GET key: 获取key 关联的 value
  • GETSET key value: 将 key 和 value 关联,如果 key 已经存在返回旧值
  • STRLEN key: 获取 key 关联的 value 长度
  • APPEND key value: 将 value 追加到 key 已经关联的 value 末尾
  • SETRANGE key offset value: 从 offset 开始,用 value 覆 盖 key 已经关联的 value
  • GETRANGE key start end: 获取 key 关联的 value 从 start 到 end 的字符串INCR key: 将 key 已经存储的数字值加一
  • INCRBY key increment: 为 key 存储的数字值加上 increment 增量
  • INCRBYFLOAT key increment: 为 key 存储的数字值加上 increment 浮点数增量
  • DECR key: 将 key 已经存储的数字值减一
  • DECRBY key decrement: 为 key 存储的数字值减去 decrement 减量
  • MSET key value [key value ...]: 同时设置多个 key-value,该操 作为原子操作
  • MSETNX key value [key value ...]: 当所有 key 都不存在时设置 多个 key-value,该操作为原子操作
  • MGET key [key ...]: 获取多个 key 的 value 值

位图常用命令:

  • SETBIT key offset value: 对字符串 key 在 offset 位置处设置位
  • GETBIT key offset: 获取字符串 key 在 offset 的位置
  • BITCOUNT key [start] [end]: 获取区间内位值设为1的数量
  • BITPOS key bit [start] [end]: 获取区间内第一个位置设为 bit 的位 置
  • BITOP operation destkey key [key...]: 对一个或者多个 key 进行 位元操作(AND/OR/XOR/NOT)并将结果保存到 destkey
  • BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WARP|SAT|FAIL]: 对 key 进 行相关的位域操作

List

同向命令 lpush+lpop 或者 rpush+rpop

反向命令 push+rpop 或者 rpush+lpop

lindex 、lset 对索引进行操作

blpop、brpop 如果有十个客户端阻塞着,当有数据之后,先服务先到的,剩下的继续阻塞。

使用场景:

  • 队列,比如:关注队列、粉丝队列
  • 消息队列

常用命令

  • LPUSH key value [value...]: 将多个 value 依次插入 list 的表头
  • LPUSHX key value: 将 value 插入已经存在的 list 的表头
  • RPUSH key value [value...]: 将多个 value 依次插入 list 的表尾
  • RPUSHX key value: 将 value 插入已经存在的 list 的表尾
  • LPOP key: 移除并返回 list 的表头元素 RPOP key: 移除并返回 list 的表尾元素
  • BLPOP key [key...] timeout: 弹出第一个非空 list 的头元素,否则 阻塞等待 timeout 秒
  • BRPOP key [key...] timeout: 弹出第一个非空 list 的尾元素,否则 阻塞等待 timeout 秒
  • RPOPLPUSH source destination: 将 source 的尾元素弹出并插入 到 destination 的头部,同时返回该元素
  • BRPOPLPUSH source destination timeout: 将 source 的尾元素 弹出并插入到 destination 的头部,同时返回该元素;若 source 为空,则阻塞等待 timeout 秒
  • LREM key count value: 根据 count 值,移除 list 中值为 value 的 元素
  • LLEN key: 返回 list 长度
  • LINDEX key index: 返回 list 下标为 index 的元素
  • LINSERT key BEFORE|AFTER pivot value: 在值为 pivot 元素的之 前/之后插入 value
  • LSET key index value: 设置 list 下标为 index 的元素值为 value
  • LRANGE key start stop: 返回 list 指定区间内的元素
  • LTRIM key start stop: 删除 list 指定区间外的元素

Hash

相当于Java中的HashMap。可以对field进行数值计算,与文档型存储的区别是,value是个hash类型,但hash中的value不能再嵌套,只能是单一类型。

使用场景:点赞、收藏、详情页等

常用命令:

  • HSET hash field value: 将 hash 的 field 字段值设置为 value
  • HSETNX hash field value: 如果 field 字段不存在则设置为 value
  • HMSET key field value [field value ...]: 给 hash 设置多个 field- value 对
  • HDEL key field [field ...]: 删除 hash 的多个 field
  • HGET hash field: 获取 hash 的 field 字段值
  • HMGET hash field [field ...]: 获取 hash 多个 field 值
  • HEXISTS hash field: 判断 hash 是否存在 field 域 HKEYS key : 获取 hash 所有的 field 域
  • HVALS key : 获取 hash 所有 value 值
  • HGETALL key : 获取 hash 所有的域值对
  • HLEN key: 获取 hash 的 field 数量
  • HSTRLEN hash field: 获取 hash 的 field 的 value 长度
  • HINCRBY key field increment: 将 hash 的 field 的值加上增量 increment
  • HINCRBYFLOAT key field increment: 将 hash 的 field 的值加上 浮点数增量 increment

Set

  • 无序去重
  • 集合操作:交集、并集等,并提供存储到目标`key`的方法。
  • 随机事件

使用场景

  • 关注集合:共同关注、二度好友
  • 点赞集合
  • 抽奖集合
  • 用户标签

常用命令

  • SADD key member [member...]: 将多个元素放入 set 中
  • SISMEMBER key member: 判断 member 是否在 set 中
  • SPOP key: 移除并返回 set 中随机一个元素 SRANDMEMBER key [count]: 返回 set 中随机数组
  • SMEMBERS key: 返回 set 所有元素
  • SREM key member [member...]: 移除 set 中多个元素
  • SMOVE source destination member: 将 member 从 source 移动到 destination
  • SCARD key: 返回 set 的元素数量(集合的基数)
  • SINTER key [key...]: 返回多个 set 的交集
  • SINTERSTORE destination key [key...]: 将多个 set 的交集覆盖destination
  • SUNION key [key...]: 返回多个 set 的并集
  • SUNIONSTORE destination key [key...]: 将多个 set 的并集覆盖 destination
  • SDIFF key [key...]: 返回多个 set 的差集
  • SDIFFSTORE destination key [key...]: 将多个 set 的差集覆盖 destination

Sorted Set

维护顺序,按score值从小到大,且不随命令而改变。用于排序的值叫做score,实际存储的值叫做member。ZINCRBY 可以对数值进行计算,且改变score后自动维护顺序。使用ZREVRANGE倒序获取

集合操作:交集、并集。带权重/聚合指令

排序实现:ziplist 压缩链表 + skip list 跳跃表


使用场景

  • 排行榜
  • 时间轴
  • 优先级队列

常用命令:

  • ZADD key score member [[score member]...]: 将多个 member 元素 和 score 值设置到 sorted set 中
  • ZSCORE key member: 返回 member 元素的 score 值 ZINCRBY key increment member: 将 member 元素的 score 值加上 increment 增量
  • ZCARD key: 返回元素数目(集合基数)
  • ZCOUNT key min max: 返回 score 值在区间内的元素数目
  • ZRANGE key start stop [WITHSCORES]: 返回排名在区间内的元 素(以及 score 值),并按 score 值从小到大排列,相同 score 值按字典序排列
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]: (指定起始位置和数量)返回 score 值在区间内的元素 (以及 score 值),并按 score 值从小到大排列,相同 score 值 按字典序排列
  • ZRANGEBYLEX key min max [LIMIT offset count]: (指定起始位 值和数量)返回按字典序在区间内的元素,要求所有元素必须有 相同 score 值
  • ZREVRANGE key start stop [WITHSCORES]: 返回排名在区间内 的元素(以及 score 值),按 score 值从大到小排列,相同 score 值按字典序逆序排列
  • ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]: (指定起始位置和数量)返回 score 值在区间内的 元素(以及 score 值),并按 score 值从大到小排列,相同 score 值按字典序逆序排列;
  • ZRANK key member: 返回 member 元素的排名(按 score 值从 小到大排)
  • ZREVRANK key member: 返回 member 元素的排名(按 score 值从大到小排)
  • ZREM key member [member...]: 移除 sorted set 的多个元素
  • ZREMRANGEBYRANK key start stop: 移除排名在区间内的所有 元素
  • ZREMRANGEBYSCORE key min max: 移除 score 值在区间内的 所有元素
  • ZREMRANGEBYLEX key min max: 移除按字典序在区间内的所有 元素,要求所有元素有相同 score 值
  • ZLEXCOUNT key start stop: 计算字典序在区间内的元素数量,要 求所有元素有相同 score 值
  • ZINTERSTORE destination numkeys key [key...] [WEIGHTS weight [weight...]] [AGGREGATE SUM|MIN|MAX]: (指定 score 值的乘法因子)(相同元素按照 score 值之和/最小/最大)计算 多个 sorted set 的交集并覆盖 destination
  • ZUNIONSTORE destination numkeys key [key...] [WEIGHTS weight [weight...]] [AGGREGATE SUM|MIN|MAX]: (指定 score 值的乘法因子)(相同元素按照 score 值之和/最小/最大)计算 多个 sorted set 的并集并覆盖 destination

不断分享开发过程用到的技术和面试经常被问到的问题,如果您也对IT技术比较感兴趣可以「关注」我

举报
评论 0