我是靠谱客的博主 沉默星星,最近开发中收集的这篇文章主要介绍Java爬坑--stringRedisTemplate 分布式锁双重检测,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.查询缓存,如果缓存存在,返回结果

 

2.缓存不存在,查询数据库

 

3.争夺分布式锁

 

4.成功获得锁,再次判断缓存的存在

 

5.如果缓存仍旧不存在,把查询数据库的结果循环放入缓存

 

6.释放分布式锁

 

 1
public List getCouponList(String key){
 2
 3
String lockKey = generateLockKey(key);
 4
 5
 6
// 如果优惠券列表在缓存中存在,从缓存查取
 7
if(stringRedisTemplate.hasKey(key)){
 8
return stringRedisTemplate.boundListOps(key).range(0, -1);
 9 
}
10
// 缓存不存在,从DB查询
11
List<String>
couponList = getCouponListFromDB(key);
12
// 争夺分布式锁,过期时间1秒
13
if(stringRedisTemplate.getConnectionFactory().getConnection().setNX(lockKey.getBytes(),new byte[0])){
14
stringRedisTemplate.expire(lockKey, 1, TimeUnit.SECONDS);//暂设置为1s过期
15
try {
16
// 如果优惠券列表在缓存中存在,从缓存查取(再次判断)
17
if(stringRedisTemplate.hasKey(key)){
18
return stringRedisTemplate.boundListOps(key).range(0, -1);
19 
}
20
// 将查出来的数据放入缓存
21
for (String coupon : couponList) {
22 
stringRedisTemplate.boundListOps(key).leftPush(coupon);
23 
}
24
} catch (Exception e) {
25 
e.printStackTrace();
26 
unlock(key);
27
}finally {
28 
unlock(key);
29 
}
30 
}
31
32
return couponList;
33 
}
34
private String generateLockKey(String key) {
35
String REDIS_LOCK = "String RedisLock:";
36
return String.format(REDIS_LOCK + "%s", key);
37 
}
38
39
public void unlock(String key) {
40
String lockKey = generateLockKey(key);
41
42
RedisConnection connection = stringRedisTemplate.getConnectionFactory().getConnection();
43 
connection.del(lockKey.getBytes());
44 
connection.close();
45
}

还没测试.....

转载于:https://www.cnblogs.com/chuzihang/p/8250680.html

最后

以上就是沉默星星为你收集整理的Java爬坑--stringRedisTemplate 分布式锁双重检测的全部内容,希望文章能够帮你解决Java爬坑--stringRedisTemplate 分布式锁双重检测所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部