redis对hash字段加锁
评论中有人指出文案不对,修正一下
之前提了一个问题 , 见 问答:redis中,只能对key加锁吗
现在我大概清楚了,redis可以针对hash里面的某一个k-v加过期机制,因此不用对整个hash加过期机制,减少并发时的报错次数;提高体验;
下面演示具体的实现
# 先添加一个hash数据
> HMSET 1:item 10001_10 "{'a':1,'b':3}" 10002_20 "{'a':5, 'c':10}"
# 查看一下
127.0.0.1:6379> HGETALL 1:item
1) "10001_10" //字段
2) "{'a':1,'b':3}" // 值
3) "10002_20" // 字段
4) "{'a':5, 'c':10}" // 值
每个字段和值组成一条数据
# 假如我现在要操作 1:item 的 10001_10 这条数据,为了避免并发问题,需要给其加锁;
# 为了针对这一条数据加锁,我们可以将其field字段名包含到加锁的set的键名中去;
> set 1:item:10001_10:lock 1 EX 5 NX
可以看这里的键名称,很关键, 值可以随便给一个, 过期时间是5秒, 如果不存在才创建; 不能创建则表示别人正在使用这条数据,已经加锁了;
ttl key 可以查看过期时间还剩多少
当我们处理完业务后,需要解锁,也就是
> del 1:item:10001_10:lock
设置过期时间,是为了避免意外造成死锁问题
补上一个图
我对f1加锁了, 此时别人操作f3的数据,是没有锁冲突的,可以直接去操作的
不对之处,欢迎大家纠正和评论!
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: