分布式缓存获取以及设置

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

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

相关推荐
许彰午2 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
Lyyaoo.2 小时前
Session粘滞性问题->Redis实现session共享
数据库·redis·缓存
Mr_sst2 小时前
文件上传并发控制:为什么选Redisson可过期信号量?(避坑指南)
网络·数据库·redis·分布式·安全架构
倚楼盼风雨2 小时前
Redis 为什么快
数据库·redis·缓存
6Hzlia3 小时前
Hot 100 刷题计划】 LeetCode 146. LRU 缓存 | C++ 哈希表+双向链表
c++·leetcode·缓存
Controller-Inversion3 小时前
146. LRU 缓存
缓存
深念Y3 小时前
当加密遇见分布式:Web3、去中心化与元宇宙的底层逻辑
分布式·web3·去中心化·区块链·元宇宙·加密·价值
运维老司机3 小时前
Kafka 单节点部署(Docker Compose + 数据持久化)
分布式·docker·kafka
yuzhiboyouye3 小时前
java redis(缓存)
java·redis·缓存
byoass3 小时前
企业云盘全文检索实战:Elasticsearch集成与分布式搜索
网络·分布式·安全·elasticsearch·云计算·全文检索