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 指令相比于先getset而言,少了一次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
  • 描述队列:
  • 反向命令 lpush+rpop 或者 rpush+lpop
  • 描述数组:
  • lindexlset 对索引进行操作
  • 阻塞单播队列(FIFO):
  • blpopbrpop 如果有十个客户端阻塞着,当有数据之后,先服务先到的,剩下的继续阻塞。

使用场景:

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

常用命令:

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