建立缓存,防高并发代码demo

原创
2018/08/07 10:37
阅读数 440

我在之前的博客中提到过——缓存并发,当一个key过期时,访问这个key的请求量过大,穿透到数据库.解决办法:1,分布式锁,保证每个key同时只有一个线程去查询数据库,其他线程没有获得分布式锁的权限,只需要等待.具体实现如下

public AppUser findById(Long id) {
    if (redisService.exists("user:" + id)) {
        String appUserStr = redisService.get("user:" + id);
        return JSONObject.parseObject(appUserStr,AppUser.class);
    } else {
        //获取分布式锁
        if (RedisTool.tryGetDistributedLock(redisService,"useridlock:" + id,Long.toString(id),180)) {
            AppUser appUser = appUserDao.findById(id);
            redisService.set("user:" + id, JSONObject.toJSONString(appUser));
            redisService.expire("user:" + id, 864000);
            //释放分布式锁
            RedisTool.releaseDistributedLock(redisService,"useridlock:" + id,Long.toString(id));
            return appUser;
        } else {   //无获得分布式锁权限时
            LocalDateTime now = LocalDateTime.now();
            Future<AppUser> future = CompletableFuture.supplyAsync(() -> {
                while (true) {
                    if (redisService.exists("user:" + id)) {
                        String appUserStr = redisService.get("user:" + id);
                        return JSONObject.parseObject(appUserStr, AppUser.class);
                    }
                    if (LocalDateTime.now().isAfter(now.plusSeconds(3))) {
                        return null;
                    }
                }
            });
            try {
                AppUser user = future.get(3000, TimeUnit.MILLISECONDS);
                return user;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }
}

Redis分布式锁的写法可参考本人上一篇博客,谢谢!

展开阅读全文
加载中

作者的其它热门文章

打赏
0
3 收藏
分享
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部