2 个回答

什么语言?

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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进