基于Redis 的信号量实现
造轮子的过程也是学习的过程。
如果公司的 Redis 不支持发布订阅指令的话,是没法用 Redisson 的,因为 Redisson 的大部分功能都依赖于 Redis 的发布订阅指令。
这是完整实现的代码仓库:https://gitee.com/wu0916/redis-semaphore
下面是获取信号量的lua代码:
local millis=tonumber(ARGV[3])
redis.call("ZREMRANGEBYSCORE",KEYS[1],0,millis-tonumber(ARGV[4]))
if redis.call("ZCARD",KEYS[1])>=tonumber(ARGV[2]) then
return 0
end
redis.call("ZADD",KEYS[1],millis,ARGV[1])
return 1
下面是释放信号量的lua代码:
if redis.call("ZSCORE",KEYS[1],ARGV[1]) then
redis.call("ZINCRBY",KEYS[1],tonumber(ARGV[2]),ARGV[1])
return 1
else
return 0
end
有任何换题欢迎指出。
------------------------------我是博客签名------------------------------
座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
版权声明:自由转载-非商用-非衍生-保持署名。
本作品采用知识共享署名 4.0 国际许可协议进行许可。
----------------------------------------------------------------------
座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
版权声明:自由转载-非商用-非衍生-保持署名。
本作品采用知识共享署名 4.0 国际许可协议进行许可。
----------------------------------------------------------------------