Redis
是一内存Key-Value
数据库, 现在一般都用它来做缓存服务.目前在一次生产环境中使用了它做业务缓存, 主要用的使用场景是: 抽奖活动, 活动中对于不同的奖项有奖品数量限制, 这就相当于是一个抢购的功能一般, 由于后端的服务是分布式的, 这便衍生出一个问题, 这个奖品数量的控制如何实现? 参考了下一些网友的经验, 发现他们大部分都是使用 Redis
的 SETNX
命令+sleep
实现类似锁的概念. 但sleep
的方法似乎会造成一些不必要的资源消耗, 官方推荐的是使用Redisson
(Java
语言), 它已经实现了RLock
, 不过我们已经使用了Jedis
实现对Redis
操作. 不知道大家对此场景有更加好的建议? 如果有使用过Redisson
和Jedis
经验最好, 可以一起分析讨论下两者的差异与优缺点.谢谢.
계산에 사용되는 redsi는 단일 지점이어야 합니다. redis의 DECR은 원자적 연산입니다. 실행 후 잠금을 사용하는 이유는 무엇인가요? 밖으로
네티즌들이 작성한 Redis 분산 잠금 전략은 다음과 같습니다
Redis 기반 분산 잠금 구현
Jedis는 나중에 Ression을 권장 Java 클라이언트로 구현하지 않습니다. 개발 단계에서는 버그가 많을 수 있으므로 권장하지 않습니다. 소스 코드를 구현하려면 Ression을 살펴보세요. 또는 소스 코드를 가져와 수정하고 대신 Jedis를 사용하여 연결할 수 있는지 확인하세요.
b(r|l)pop을 사용하세요.
1, 요소를 미리 목록에 넣습니다.
2, 여러 클라이언트가 brpop을 수행하고, 단 하나의 클라이언트만 요소를 가져옵니다(즉, 잠금을 가져옵니다). )
3. 요소를 다시 목록에 넣고 다른 클라이언트가 이를 얻을 때까지 기다립니다.
4. brpop은 시간 제한을 설정할 수 있습니다.
단점:
1. 요소를 미리
2. Get it 잠금 후 클라이언트가 비정상적으로 종료되면 문제가 발생합니다