分布式缓存获取以及设置

1. 通用代码

java 复制代码
   public SysUser getCache(String sysUserId) {
        String cacheKey = "litgery:warehouse:" + sysUserId;
        // 尝试从缓存中获取数据
        CacheData cacheData = redisUtils.get(cacheKey);
        if (null != cacheData) {
            if (Boolean.TRUE.equals(cacheData.getExist())) {
                return cacheData.getSysUser();
            } else {
                return null;
            }
        }
        
        //   RedisLockClient 获取锁
        RLock rLock = redisLockClient.getRLock("litgery:warehouse:lock");
        try {
            // 尝试获取锁,如果锁已被其他线程持有,则等待
            rLock.lock();
            // 再次检查数据是否存在,因为可能在等待锁的过程中,其他线程已经填充了数据
            cacheData = redisUtils.get(cacheKey);
            if (null != cacheData && Boolean.TRUE.equals(cacheData.getExist())) {
                return cacheData.getSysUser();
            }
            //随机过期时间,随机生成0.5小时-1小时之内的时间(减少缓存同时失效的机会)
            Long expireTime = CacheUtils.getRandomExpireTimeInOneOrTowDay();
            
          
            SysUser sysUser = sysUserService.getById(sysUserId);
            if (null == sysUser) {
                // 如果数据仍然不存在,从数据库中获取数据并填充缓存,避免不存在的数据一直请求打到数据库
                CacheData emptyCache = new CacheData();
                emptyCache.setExist(Boolean.FALSE);
                redisUtils.setEx(cacheKey, emptyCache, expireTime);
                return null;
            }
            CacheData cache = new CacheData();
            cache.setSysUser(sysUser);
            cache.setExist(Boolean.TRUE);
            redisUtils.setEx(cacheKey, cache, expireTime);
            return sysUser;
        } finally {
            // 释放锁
            rLock.unlock();
        }
    }
复制代码
redisUtils 为redis工具类,例如:设置缓存获取缓存等等。
复制代码
redisLockClient  为:RedisLockClient 的分布式锁

2.整体步骤

  1. 获取缓存,若有值直接返回

2.获取一个分布式锁。

  1. 加锁

  2. 再次检查数据是否存在,因为可能在等待锁的过程中,其他线程已经填充了数据

5.从数据库获取。若为空,设置一个空值到redis。若不为空,直接返回,最好设置随机过期时间

6.释放锁

可优化的点,可添加布隆过滤器

相关推荐
Lisonseekpan6 小时前
Guava Cache 高性能本地缓存库详解与使用案例
java·spring boot·后端·缓存·guava
我真的是大笨蛋6 小时前
Redis的String详解
java·数据库·spring boot·redis·spring·缓存
Java战神8 小时前
Hadoop
大数据·hadoop·分布式
低调小一8 小时前
LRU缓存科普与实现(Kotlin 与 Swift)
开发语言·缓存·kotlin
不会写代码的加加10 小时前
告别重构噩梦:基于 Oinone 实现单体到微服务的平滑演进
spring boot·分布式
伐尘11 小时前
【计算机】常见的缓存和查看方法
缓存·电脑·笔记本
我梦之611 小时前
libevent输出缓存区的数据
服务器·网络·c++·缓存
szxinmai主板定制专家11 小时前
RK3588+AI算力卡替代英伟达jetson方案,大算力,支持FPGA自定义扩展
arm开发·人工智能·分布式·fpga开发
兜兜风d'13 小时前
redis字符串命令
数据库·redis·缓存
Pota-to成长日记14 小时前
Redisson 看门狗机制深度解析:分布式锁的守护者
分布式·wpf