• Redis中以key-value的结构存储数据,其中key都是以string类型存储,一般讨论数据类型都是指的value的类型。官方文档

string

  • 数值增减操作
操 作 作 用
incr  key key 增加 1
incrby  key increment key 增加 increment
incrbyfloat  key increment key 增加 increment (float)
decr  key key 减少 1
decrby  key decrement key 减少 decrement
  • 应用场景
    数据库分库分表后可能出现的自增主键重复,可以用Redis来生成主键,由于Redis是单线程执行的,故可以保证高并发下主键生成的唯一性。

  • 单指令操作与多指令操作的选择
    1. 单指令set发送给Redis时间短,但要发送多次。
    2. 多指令mset发送时间稍长,但只需发送一次。
  • 数据时效性
操 作 作 用
setex  key seconds value 设置 key-value seconds 秒后失效
psetex  key milliseconds value 设置 key-value milliseconds 毫秒后失效
  • 应用场景
    电视节目投票有一定时间内投票次数的限制,若投一次票后将投票人id存在Redis中并设置失效时间,再投票时查询Redis是否有投票人信息即可做到限制投票次数。

hash

  • 一个key值对应一个哈希表,hash的结构是field-value。

  • hash类型基本操作

操 作 作 用
hset  key field value 设置 key 值对应的 field-value
hget  key field 获取 key 值对应hash中 field 的 value 值
hgetall  key 获取 key 值对应的所有 field-value
hdel  key field [field …] 删除 key 值对应hash中一个或多个 field
hlen  key 获取hash中 field 的数量
  • 应用场景
    购物车中商品和数量可以作为一对 field-value,用户作为 key,hset 用于新增商品 hlen 用于获取购物车中商品数量,hgetall 用于全选,hdel 用于删除操作…

list

  • 一个 key 值对应一个 list,底层用双向链表实现。

  • list类型基本操作

操 作 作 用
lpush  key value [value …] 从 key 值对应list左侧添加一个或多个 value
rpush  key value [value …] 从 key 值对应list右侧添加一个或多个 value
lrange  key start stop 获取 key 值对应的list从索引 start 到 stop 的所有值
lrange  key index 获取 key 值对应的list中索引为 index 的值
llen  key 获取 key 值对应list的长度
lpop  key 获取 key 值对应list左侧的第一个值并移除
rpop  key 获取 key 值对应list右侧的第一个值并移除
blpop  key [key …] timeout 阻塞获取一个或多个 key 值对应list左侧的第一个值并移除,最多阻塞 timeout 秒
brpop  key [key …] timeout 阻塞获取一个或多个 key 值对应list右侧的第一个值并移除,最多阻塞 timeout 秒
lrem  key count value 删除 key 值对应list中 count 个 value
  • 应用场景
    1. 朋友圈点赞可以用 rpush 将点赞用户加入list,查看点赞的朋友可以用 lrange 获取点赞名单,取消点赞可以用 lrem 从list中移除该用户…
    2. 多台服务器产生日志,可以将日志发送到Redis中,由于Redis是单线程的,故可以将日志按照提交的时间顺序展示出来。

set

  • 底层采用和hash一样的结构,但 value 值放在 hash field 的位置,hash value 的位置置为 nil(类似Java中的HashMap和HashSet)。

  • set类型基本操作

操 作 作 用
sadd  key member [member …] 从 key 值对应的set中添加一个或多个 member
smembers  key 获取 key 值对应set中所有的 member
srem  key member [member …] 从 key 值对应的set中删除一个或多个 member
scard  key 获取 key 值对应的set中 member 的数量
  • 应用场景
    1. 统计网站访问量,记录不同 cookie 数量、不同 ip 地址。
    2. 实现黑白名单,过滤黑名单中的用户、设备、ip。
  • set类型操作随机数据
操 作 作 用
srandmember  key [count] 从 key 值对应的set中随机获取 count 个 member
spop  key [count] 从 key 值对应的set中随机获取 count 个 member 并移除
  • 应用场景
    从热点数据(热门歌单、热点新闻、热卖商品 …)中随机推荐一部分到用户首页,应用于随机推荐类信息检索。

  • set类型交并差操作

操 作 作 用
sinter  key [key …] 获取多个 key 对应的set的交集
sunion  key [key …] 获取多个 key 对应的set的并集
sdiff  key [key …] 获取多个 key 对应的set的差集
sinterstore  destination key [key …] 获取多个 key 对应的set的交集并存储到 destination 中
sunionstore  destination key [key …] 获取多个 key 对应的set的并集并存储到 destination 中
sdiffstore  destination key [key …] 获取多个 key 对应的set的差集并存储到 destination 中

图片加载失败

  • 应用场景
    获取共同好友、共同关注、共同群聊…还可以进行更深层次的关联搜索…

sorted_set

  • 在set的存储结构上增加可排序字段 score

  • sorted_set类型基本操作

操 作 作 用
zadd  key score member [score member …] 从 key 值对应的sorted_set中添加一个或多个 score-member
zrange  key start stop [WITHSCORES] 获取 key 值对应sorted_set中按照 score 值从小到大排序的第 start 个到第 stop 个 member,可选参数 WITHSCORES 可以同时获取 score
zrevrange  key start stop [WITHSCORES] 获取 key 值对应sorted_set中按照 score 值从大到小排序的第 start 个到第 stop 个 member,可选参数 WITHSCORES 可以同时获取 score
zrem  key member [member …] 从 key 值对应的sorted_set中移除一个或多个 member
zrangebyscore  key min max [WITHSCORES] [LIMIT offset count] 获取 key 值对应的sorted_set中 score 在 min~max 范围内的 member,可选参数 LIMIT 用法与 MySQL一致
zrevrangebyscore  key max min [WITHSCORES] [LIMIT offset count] 作用类比 zrangebyscore(逆序)
zremrangebyrank  key start stop 删除 key 值对应sorted_set中按照 score 值从小到大排序的第 start 个到第 stop 个 member
zremrangebyscore  key min max 删除 key 值对应sorted_set中 score 值在 min~max 范围内的 member
zcard  key 获取 key 值对应的sorted_set中 member 的数量
zcount  key min max 获取 key 值对应sorted_set中 score 值在 min~max 范围内 member 的数量
zrank  key member 获取 key 值对应sorted_set中 member 的排序
zscore  key member 获取 key 值对应sorted_set中 member 的 score
zincrby  key increment member 对 key 值对应sorted_set中 member 的 score 增加 increment
  • 应用场景
    1. 对于基于时间线的任务,可以采用sorted_set存储任务,并用 score 记录截止日期(时间戳),按照时间戳先后顺序执行任务。
    2. 对于带有权重的任务,可以用 score 记录权重,还可以通过对 score 做分段实现多个权重条件。