概述
常用 5 种数据类型 string, list, set, hash, zset
1. string
string 常用操作
set key value get key
对象缓存
1. set user:1 value(Json 格式化数据) 2. mset user:1:name huawei user1:balance 2000 mget user:1:name user:1balance
分布式锁
setnx product:10001 true // 返回 1 代表获取锁成功 setnx product:10001 true // 返回 0 代表获取锁失败 .... 执行业务逻辑 del product:10001 // 执行完业务释放锁 set product:10001 true ex 10 nx // 防止意外中断导致最终死锁
计数器
incr article:forward:{文章id} get article:forward:{文章id}
web 集群 session 共享
spring session + redis 实现 session 共享
分布式全局序列号
incrby orderId 1000 // redis 批量生成序列号提升性能 批量生成 ID, 这里有一个步长,通过空间换取时间的概念,来减少和 Redis 的交互,提升新跟那个
字符串常用操作
set key value // 存入字符串键值对 mset key value [key value] // 批量存储字符串键值对 setnx key value // 存入一个不存在的字符串键值对 get key // 获取一个字符串键值对 mget key [key ..] // 批量获取字符串键值对 del key [key ...] // 删除一个键 expire key seconds // 设置一个键的过期时间(秒)
原子加减
incr key // 将 key 中存储的一个数字加1 decr key // 将 key 中存储的一个数字减1 incrby key increment // 将 key 所存储的值加上 increment decrby key decrement // 将 key 所存储的值减去 increment
2. hash
hash 常用操作
hset key field value // 存储一个哈希表 key 的键值 hsetnx key field value // 存储一个不存在的哈希表 key 的键值 hmset key field [field value ... ] // 在一个 哈希表 key 中存储多个键值对 hget key field [field ... ] // 批量获取哈希表 key 中的 field 键值 hdel key field [field ... ] // 删除哈希表中的 field 键值 hlen key // 返回哈希表中 key 的field 的数量 hgetall key // 返回哈希表中 key 所有的键值 hincrby key field increment // 为哈希表 key 中 field 键的值增量 increment 注意:大量的数据存储在一个 key 种,容易存在 BigKey 问题,可以做分段处理
Hash 应用场景
对象缓存
hmset user {userid}:name zhangsan {userid:}:balance 1888 hmset user 1:name zhangsan 1:balance 1888 hmget user 1:name 1:balance
电商购物车
- 以用户id 为key
- 商品 id 为 field
- 商品数量为 value
购物车操作:
- 添加商品 hset cart:1001 1088 1
- 增加数量 hincrby cart:1001 1088 1
- 商品总数 hlen cart:1001
- 删除商品 hdel cart:1001 1088
- 获取所有展示的商品 hgetall cart:1001
Hash 的优点
- 同类数据归整合存储,方便数据管理
- 相比 String 操作消耗内存与 CPU 更小
- 相比 String 存储更节省空间
Hash 的缺点
- 过期功能不能在 field 上, 只能在 Key 上
- Redis 集群架构不太适合大规模使用
3. list
List 常用操作
lpush key value [value...] // 将一个或者多个值value 插入到 key 列表的表头(最左边) rpush key value [value...] // 将一个或者多个值value 插入到 key 列表的表尾(最右边) lpop key // 移除并返回 key 列表的头元素 rpop key // 移除并返回 key 列表的尾元素 lrang key srat stop // 返回列表 key 中指定区间内的元素, 区间内的偏移量 start 和 stop 指定 blpop key [key ,,,] timeout // 从 key 列表头弹出一个元素,若列表中没有元素,阻塞等待timeout 秒,如果timeout = 0, 一直阻塞等待 brpop key [key ...] timeout // 从 key 列表尾弹出一个元素,若列表中没有元素,阻塞等待timeout 秒,如果timeout = 0, 一直阻塞等待
使用场景
stack(栈) lpush + lpop = fifo
Queue (队列) lpush + rpop
Blocking MQ (阻塞队列) = LPUSH + BRPOP
微博和微信消息流
张三关注了 36氪 , 汽车之间等公众号