分布式缓存获取以及设置

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

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

相关推荐
lisanmengmeng3 小时前
Ganglia分布式集群监控系统安装手册
分布式
Smoothcloud润云10 小时前
GPU算力平台推荐:新手租GPU时,镜像环境和显存应该怎么选?
大数据·人工智能·pytorch·分布式·深度学习·gpu算力
程序员大阳12 小时前
副队长大数据教程(6)--四节点分布式集群搭建
大数据·分布式·集群·搭建·四节点
马六六i12 小时前
目前知名的分布式Ai数智共享商城哪家好
人工智能·分布式
大鹏说大话13 小时前
分布式事务怎么选型?2PC、TCC、SAGA、本地消息表一次讲清
分布式
Eloudy14 小时前
ASTRA-sim 3.0:通过高保真GPU和基础设施建模进行下一级分布式机器学习模拟
人工智能·分布式·机器学习
hflmwl814 小时前
RedisDesktopManager安装包中文版官方下载,redis可视化客户端工具下载
数据库·redis·缓存·可视化客户端工具
一枕槐安48714 小时前
大模型应用后端设计:上下文管理、缓存、降级策略的工程方案总结
java·spring·缓存
泡海椒15 小时前
JQuick-SQL 模块架构:从 SQL AST 到分布式执行
分布式·sql·架构
梦想平凡15 小时前
棋牌游戏技术实战(十三):缓存对局历史时控制容量,命中以后仍然检查成员权限
游戏·缓存