地址
五种数据类型
常用命令
String
Hash
List
Set
mset应用场景 : 实现对象存缓
mset支持嵌套
1 | mset user:class1:hyl:age 22 |
这种方法非常适合存储对象 : 我们可以将对象属性全部都这么存储
mhset应用场景 : 实现对象存缓
1 | hmset user hyl:age 21 hyl:name hyl hyl:sex:man |
存储的键为user
优点
- 同类数据归类整合储存,方便数据管理
- 相比 string操作消耗内存与cpu更小
- 相比 string储存更节省空间
缺点
- 过期功能不能使用在field上,只能用在key上
- Redis集群架构下不适合大规模使用
setnx应用场景 : 分布式锁
redis是单线程模型 , 他天生就可以预防多线程不安全问题
分布式锁
分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。
使用redis实现分布式锁
setnx key value
实现加锁del key
实现解锁
setnx
: SET if Not eXists , 存储不存在的键值对 (如果存在就不操作)- 利用这个特性
setnx
可以用于分布式 , 比如setnx name hyl
, 返回1表示获取锁成功 , 返回0代表获取锁失败- 只有第一条操作能成功 , 后来的操作失败 , 这样就保持了数据的一致性
- 但是最后要删掉这个键值对 :
del name
, 这样下一次就还能运行
最佳实践
1 | set name hyl ex 10 nx # 防止程序意外终止导致死锁 |
web集群session共享
web集群共享redis , 所有web服务器都将session放入redis即可.
incr应用场景 : 分布式锁
redis是单线程模型 , 他天生就可以预防多线程不安全问题
incr num
incrby num 10086
分布式系统全局序列号
大型项目可能会分库分表
, 为了防止自增ID
重复 , 我们可以使用redis
1 | incrby orderid 1000 # redis 批量生成序列号提升性能 |
List应用场景 : 实现各种数据结构
Set应用场景 : 集合操作
redis集群架构
示例
mhset应用 : 购物车
购物车
- 以用户id为key
- 商品id为filed
- 商品数量为value
购物车操作
- 添加商品 : hset cart:1001100881
- 增加数量 : hincrby cart:1001100881
- 商品总数 : hlen cart:1001
- 删除商品 : hdel cart:100110088
- 获取购物车所有商品 : hgetall cart:1001
list应用 : 微博消息和微信公号消息
小明关注了 MacTalk,备胎说车等大V
MacTalk发微博,消息ID为10018 .
存储消息 :
1
LPUSH msg:{小明-ID} 100182
备胎说车发微博,消息ID为10086
存储消息 :
1
LPUSH msg:{小明-ID} 10086
查看最新微博消息
查看消息 :
1
LRANGE msg:{小明-ID } 0 5
Set应用 : 抽奖
点击参与抽奖加入集合
1
SADD key(userID)
查看参与抽奖所有用户
1
SMEMBERS key
抽取 count 名中奖者
1
SRANDMEMBER key [count]
或者
1
SPOP key [count] # 已经中奖的人剔除出去
eg :
1 | sadd 活动:抽奖 用户ID |
一般都不会使用string存储 , 都使用int , 所以更多的是
sadd act:100 10086
(抽奖活动的ID为100 , 用户ID为10086)
Set应用 : 点赞,收藏,标签
点赞
1
SADD like:{消息ID} {用户ID}
取消点赞
1
SREM like:{消息ID} {用户ID}
检查用户是否点过赞
1
SISMEMBER like:{消息ID} {用户ID}
获取点赞的用户列表
1
SMEMBERS like:{消息ID}
获取点赞用户数
1
SCARD like:{消息ID}