使用hiredis实现redis分布式锁
生活随笔
收集整理的這篇文章主要介紹了
使用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实现简单限流
- 下一篇: centos虚拟机ping不通 报错 n