蜗牛大师

吴庆龙的学习笔记

导航

基于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

有任何换题欢迎指出。

 

posted on 2022-09-06 15:36  蜗牛大师  阅读(264)  评论(0编辑  收藏  举报