简言

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分布式锁相关推荐

  1. redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...

    在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...

  2. 快来学习Redis 分布式锁的背后原理

    以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这 ...

  3. Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!

    点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6854573212831842311 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本篇文章主要是基于我们实际项目 ...

  4. Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本 ...

  5. 秒杀商品超卖事故:Redis分布式锁请慎用!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 来源:juejin.im/post/6854573 ...

  6. 记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 juejin.im/post/5f159cd8f2 ...

  7. 简单介绍redis分布式锁解决表单重复提交的问题

    在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...

  8. Redis 分布式锁没这么简单,网上大多数都有 bug

    Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写? 因为看过很多文章没有将分布式锁的各种问题讲明白,所以准备写一篇,也当做自己的学习总结. 在进入正文之前,我 ...

  9. 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

    ‍‍‍‍‍‍‍‍‍‍‍‍阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...

最新文章

  1. 学JS的心路历程 -数组常见处理方法
  2. 2017年html5行业报告,云适配发布2017 HTML5开发者生态报告 期待更多行业标准
  3. golang学习之旅:使用go语言操作mysql数据库(自己测试了)
  4. union distinct_当面试官问你UNION 和UNION ALL之间的区别时该怎么答?
  5. 连接局域网的SQL Server数据库配置
  6. 信捷伺服刚性调整_信捷電氣(603416):伺服與PLC增長將加速,口罩機解決方案帶來新增量...
  7. MySQL双向主从复制
  8. python支付系统_GitHub - zhuf/alipay_python: 支付宝 alipay python接口,支持担保交易,即时到帐和自动发货接口...
  9. 使用pt-query-digest进行日志分析
  10. 扇贝有道每日一句180904
  11. 中兴新支点操作系统上的快捷键
  12. 20190105 东非大裂谷
  13. Win10 电脑磁盘分区
  14. 颜色迁移之四——模糊聚类(FCM)算法
  15. 张宏 :移动机器人全局定位技术与方法是啥?道翰天琼认知智能机器人平台API接口大脑为您揭秘-1。
  16. zuul 里面的 prefix 和 strip-prefix 怎么使用
  17. 均方根误差(RMSE),平均绝对误差(MAE),标准差(Standard Deviation);平均值、标准差、相关系数、回归线及最小二乘法
  18. 包载信使RNA(mRNA)的虫草多糖脂质体|冬虫夏草多糖脂质体包载小干扰RNA(siRNA)
  19. 【计算摄影】图像与视频超分辨,深度学习核心技术与展望
  20. lintcode 解码方法

热门文章

  1. TI C64X DSP中断向量表的配置(硬件中断)-- 转自新浪博客
  2. ADO.NET Entity Framework建模和映射(实体框架)
  3. 游戏的乐趣和任务设计
  4. ……OleContainer中嵌入WORD后,用什么办法显示滚动条???……
  5. CodeForces - 1208F Bits And Pieces(SOSdp+贪心)
  6. 牛客 - 弦(卡特兰数)
  7. Web开发-Django表单
  8. mysql协议重传_TCP协议详解
  9. DVWA设置mysql_解决DVWA配置报错
  10. 最小公倍数和最大公约数