分布式缓存获取以及设置

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.释放锁

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

相关推荐
一条泥憨鱼6 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
小小工匠8 小时前
Redis 缓存替换策略:8 种淘汰策略与 LRU 实现剖析
数据库·redis·缓存
weixin_5231853210 小时前
Java面试高频题:Integer缓存机制与 equals、== 区别
java·缓存·面试
weixin_3947580310 小时前
CRMEB Pro 商品字段二开:为什么加一个字段会牵动 SKU、缓存和前端展示?
前端·缓存
焦虑的说说12 小时前
redis和数据库的一致性如何保证
数据库·redis·缓存
暗夜猎手-大魔王12 小时前
hermes源码学习8-上下文压缩与缓存
人工智能·缓存
Konwledging12 小时前
Cache Coherent(缓存一致性)
缓存
IT策士15 小时前
Redis 从入门到精通:持久化RDB 与 AOF
数据库·redis·缓存
咖啡星人k15 小时前
MonkeyCode 开源协作指南:如何让分布式团队高效使用AI编程
分布式·开源·ai编程·monkeycode
阿坤带你走近大数据15 小时前
如何保证kafka中的数据一致性
分布式·kafka