如题,希望提供具体的代码实现,多谢大佬
什么语言?
Java 的话 Redisson 里已经实现过了,org.redisson.api.RSemaphore
就是。开源的,随便看。
其他语言也可以参考 Redisson 的实现。
import redis
import time
def acquire_semaphore(conn, semname, limit, timeout=10):
identifier = str(uuid.uuid4())
now = time.time()
pipeline = conn.pipeline(True)
pipeline.zremrangebyscore(semname, '-inf', now - timeout)
pipeline.zadd(semname, {identifier: now})
pipeline.zrank(semname, identifier)
if pipeline.execute()[-1] < limit:
return identifier
conn.zrem(semname, identifier)
return None
def release_semaphore(conn, semname, identifier):
return conn.zrem(semname, identifier)