Redis分布式锁如何实现?
怪我咯
怪我咯 2017-04-24 09:10:16
0
3
793

Redis 是一内存Key-Value数据库, 现在一般都用它来做缓存服务.目前在一次生产环境中使用了它做业务缓存, 主要用的使用场景是: 抽奖活动, 活动中对于不同的奖项有奖品数量限制, 这就相当于是一个抢购的功能一般, 由于后端的服务是分布式的, 这便衍生出一个问题, 这个奖品数量的控制如何实现? 参考了下一些网友的经验, 发现他们大部分都是使用 RedisSETNX命令+sleep 实现类似锁的概念. 但sleep的方法似乎会造成一些不必要的资源消耗, 官方推荐的是使用Redisson(Java语言), 它已经实现了RLock, 不过我们已经使用了Jedis实现对Redis操作. 不知道大家对此场景有更加好的建议? 如果有使用过RedissonJedis经验最好, 可以一起分析讨论下两者的差异与优缺点.谢谢.

怪我咯
怪我咯

走同样的路,发现不同的人生

모든 응답(3)
迷茫

계산에 사용되는 redsi는 단일 지점이어야 합니다. redis의 DECR은 원자적 연산입니다. 실행 후 잠금을 사용하는 이유는 무엇인가요? 밖으로

PHPzhong

네티즌들이 작성한 Redis 분산 잠금 전략은 다음과 같습니다
Redis 기반 분산 잠금 구현

Jedis는 나중에 Ression을 권장 Java 클라이언트로 구현하지 않습니다. 개발 단계에서는 버그가 많을 수 있으므로 권장하지 않습니다. 소스 코드를 구현하려면 Ression을 살펴보세요. 또는 소스 코드를 가져와 수정하고 대신 Jedis를 사용하여 연결할 수 있는지 확인하세요.

迷茫

b(r|l)pop을 사용하세요.
1, 요소를 미리 목록에 넣습니다.
2, 여러 클라이언트가 brpop을 수행하고, 단 하나의 클라이언트만 요소를 가져옵니다(즉, 잠금을 가져옵니다). )
3. 요소를 다시 목록에 넣고 다른 클라이언트가 이를 얻을 때까지 기다립니다.
4. brpop은 시간 제한을 설정할 수 있습니다.
단점:
1. 요소를 미리
2. Get it 잠금 후 클라이언트가 비정상적으로 종료되면 문제가 발생합니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿