分布式缓存获取以及设置

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

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

相关推荐
CoderIsArt1 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
P.H. Infinity4 小时前
【RabbitMQ】03-交换机
分布式·rabbitmq
ketil275 小时前
Redis - String 字符串
数据库·redis·缓存
龙哥·三年风水6 小时前
群控系统服务端开发模式-应用开发-个人资料
分布式·php·群控系统
生命几十年3万天7 小时前
redis时间优化
数据库·redis·缓存
funnyZpC8 小时前
quartz集群增强版🎉
java·分布式·开源·集群·定时任务
明达技术9 小时前
工业4.0时代下的分布式IO模块
分布式
java知路10 小时前
springboot 基于google 缓存,实现防重复提交
spring boot·后端·缓存
天冬忘忧10 小时前
Spark 程序开发与提交:本地与集群模式全解析
大数据·分布式·spark
_.Switch11 小时前
Serverless架构与自动化运维
运维·python·缓存·自动化·运维开发