Redis 五种常用数据类型
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是单线程执行的,故可以保证高并发下主键生成的唯一性。 - 单指令操作与多指令操作的选择
- 单指令
set发送给Redis时间短,但要发送多次。 - 多指令
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 |
- 应用场景
- 朋友圈点赞可以用 rpush 将点赞用户加入
list,查看点赞的朋友可以用 lrange 获取点赞名单,取消点赞可以用 lrem 从list中移除该用户… - 多台服务器产生日志,可以将日志发送到
Redis中,由于Redis是单线程的,故可以将日志按照提交的时间顺序展示出来。
- 朋友圈点赞可以用 rpush 将点赞用户加入
set
-
底层采用和
hash一样的结构,但 value 值放在hashfield 的位置,hashvalue 的位置置为 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 的数量 |
- 应用场景
- 统计网站访问量,记录不同 cookie 数量、不同 ip 地址。
- 实现黑白名单,过滤黑名单中的用户、设备、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 |
- 应用场景
- 对于基于时间线的任务,可以采用
sorted_set存储任务,并用 score 记录截止日期(时间戳),按照时间戳先后顺序执行任务。 - 对于带有权重的任务,可以用 score 记录权重,还可以通过对 score 做分段实现多个权重条件。
- 对于基于时间线的任务,可以采用