使用hiredis实现redis分布式锁
简言
1. redis实现分布式锁的原理,这里不再赘述,不清楚的可以参见笔者的这篇博客
https://blog.csdn.net/yzf279533105/article/details/100524700
2. 解锁时使用lua脚本,由于hiredis是根据空格来解析cmd参数的,但是lua中肯定有空格,所以解锁的redis命令要分开格式化
3. 重点关注 Unlock()函数即可,关注里面如何调用lua脚本的
代码如下:
头文件(仅贴出主要代码)
// redis锁
struct RedisLock
{string key; // 锁的keyint randval; // 随机值
};// 加锁(锁数据,过期时间,单位:秒)
bool Lock(RedisLock lockkey, uint32_t expire);// 解锁
bool Unlock(RedisLock lockkey);
cpp文件
// 加锁(锁数据,过期时间,单位:秒)
bool CRedisClient::Lock(RedisLock lockkey, uint32_t expire)
{bool bSuc = connect();if (!bSuc) {ERROR("CRedisClient::Lock(), connect failed");return false;}ostringstream os;os<< "set " << lockkey.key <<" "<< lockkey.randval << " ex " << expire << " nx";// set命令CAutoRedisReply autoR;redisReply* r = (redisReply*)redisCommand(m_redisCtx, os.str().c_str());if (NULL == r) {ERROR("CRedisClient::Lock(),call redisCommand() error,command=%s, redis break connection,m_redisCtx: %p",os.str().c_str(), m_redisCtx);m_bConnected = false;return false;}autoR.set(r);if (r->type!=REDIS_REPLY_STATUS || r->str==NULL || strcasecmp(r->str, "OK") != 0){ERROR("CRedisClient::Lock(),result error, type=%d, command=%s, errmsg=%s", r->type, os.str().c_str(), r->str);return false;}return true;
}// 解锁
bool CRedisClient::Unlock(RedisLock lockkey)
{// 注意:由于hiredis是根据空格来解析cmd参数的,但是lua中肯定有空格,所以这里的命令要分开格式化;不要像上面的那样直接用ostringstream来合成所有的字符串char script[256] = {0};sprintf(script, "if redis.call('get', KEYS[1]) == '%d' then return redis.call('del', KEYS[1]) else return 0 end", lockkey.randval);CAutoRedisReply autoR;// 注意命令格式,不要把参数key格式化到script中,那样会报参数个数不够的错误redisReply* r = (redisReply*)redisCommand(m_redisCtx, "eval %s 1 %s", script, lockkey.key.c_str());if (NULL == r) {ERROR("CRedisClient::Lock(),call redisCommand() error,command=%s, redis break connection,m_redisCtx: %p",script, m_redisCtx);m_bConnected = false;return false;}autoR.set(r);if (r->type!=REDIS_REPLY_INTEGER || r->integer!= 1 || r->str != NULL){ERROR("CRedisClient::Lock(),result error, type=%d, command=%s, r->interger=%d, errmsg=%s", r->type, script, r->integer, r->str);return false;}return true;
}
使用hiredis实现redis分布式锁相关推荐
- redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...
在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...
- 快来学习Redis 分布式锁的背后原理
以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这 ...
- Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6854573212831842311 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本篇文章主要是基于我们实际项目 ...
- Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本 ...
- 秒杀商品超卖事故:Redis分布式锁请慎用!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 来源:juejin.im/post/6854573 ...
- 记一次由Redis分布式锁造成的重大事故,避免以后踩坑!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 juejin.im/post/5f159cd8f2 ...
- 简单介绍redis分布式锁解决表单重复提交的问题
在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...
- Redis 分布式锁没这么简单,网上大多数都有 bug
Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写? 因为看过很多文章没有将分布式锁的各种问题讲明白,所以准备写一篇,也当做自己的学习总结. 在进入正文之前,我 ...
- 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!
阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...
最新文章
- 学JS的心路历程 -数组常见处理方法
- 2017年html5行业报告,云适配发布2017 HTML5开发者生态报告 期待更多行业标准
- golang学习之旅:使用go语言操作mysql数据库(自己测试了)
- union distinct_当面试官问你UNION 和UNION ALL之间的区别时该怎么答?
- 连接局域网的SQL Server数据库配置
- 信捷伺服刚性调整_信捷電氣(603416):伺服與PLC增長將加速,口罩機解決方案帶來新增量...
- MySQL双向主从复制
- python支付系统_GitHub - zhuf/alipay_python: 支付宝 alipay python接口,支持担保交易,即时到帐和自动发货接口...
- 使用pt-query-digest进行日志分析
- 扇贝有道每日一句180904
- 中兴新支点操作系统上的快捷键
- 20190105 东非大裂谷
- Win10 电脑磁盘分区
- 颜色迁移之四——模糊聚类(FCM)算法
- 张宏 :移动机器人全局定位技术与方法是啥?道翰天琼认知智能机器人平台API接口大脑为您揭秘-1。
- zuul 里面的 prefix 和 strip-prefix 怎么使用
- 均方根误差(RMSE),平均绝对误差(MAE),标准差(Standard Deviation);平均值、标准差、相关系数、回归线及最小二乘法
- 包载信使RNA(mRNA)的虫草多糖脂质体|冬虫夏草多糖脂质体包载小干扰RNA(siRNA)
- 【计算摄影】图像与视频超分辨,深度学习核心技术与展望
- lintcode 解码方法