缓存学习实战篇

缓存练习题(用户查询操作)

java 复制代码
    public List<ShopType> queryAllType() throws JsonProcessingException {
        //从缓存中查数据
        String shopTypeJson = stringRedisTemplate.opsForValue().get("cache:shopType");
        //如果缓存命中,
        if (StrUtil.isNotBlank(shopTypeJson)) {
            return new ObjectMapper().readValue(shopTypeJson, new TypeReference<List<ShopType>>() {
            });
        }
        //如果缓存不命中,查数据库
        List<ShopType> shopTypeList = shopTypeMapper.selectList(null).stream().sorted(Comparator.comparingInt(ShopType::getSort))
                .collect(Collectors.toList());
        if (shopTypeList == null) {
            return null;
        } else {
            stringRedisTemplate.opsForValue().set("cache:shopType", new ObjectMapper().writeValueAsString(shopTypeList));
        }
        //如果过数据库不命中,则返回错误
        //如果过数据库命中,则更新缓存
        return null;
    }

缓存更新策略(更新商品操作)

缓存操作很快,操作数据库很慢

方案1:如果先删除缓存,再操作数据库,线程1 ,清空缓存,线程2 查询缓存未命中,写入数据库数据是10,此时线程1,数据库更新

方案2:缓存因为某种原因失效了 ,线程1缓存未命中查出数据库10,另外一个线程2更新数据库,删除缓存,写缓存时数据为20,但是这种情况基本不存在

结论:由于缓存速度很快,所以第二种情况发生概率很低,采用先操作数据库,再删除缓存

bash 复制代码
    @Override
    @Transactional
    public Result update(Shop shop) {
        if (shop.getId() == null) {
            return Result.fail("500");
        }
        //1、更新数据库
        updateById(shop);
        //2、删除缓存
        stringRedisTemplate.delete(CACHE_SHOP_KEY + shop.getId());
        return Result.ok();
    }

缓存穿透

缓存空对象

空的值缓存到Redis

优点:实现简单,维护方便

缺点:额外的内存消耗;造成短期的不一致(如果此时数据库真的增加了,在TTL过期以后才能查询到真数据)

设置TTL,比如5分钟,方式恶意用户访问

布隆过滤

优点:内存占用较少,没有多余key

缺点:存在误判可能

相关推荐
言乐6几秒前
Python视频相对亮度检测
数据库·python·计算机视觉·小程序·音视频
snow@li24 分钟前
中台:中台即复用 / 理解企业架构中的能力抽象与分层共享 / 中台体系全景梳理 / 共性能力抽象、沉淀并复用
数据库
心中有国也有家28 分钟前
AtomGit Flutter 鸿蒙客户端:初始化流水线
学习·flutter·华为·harmonyos
SelectDB技术团队29 分钟前
AB 实验指标计算场景:Apache Doris / SelectDB 的技术能力、选型对比与实践
大数据·数据库·数据分析·apache·用户运营·apache doris·selectdb
snow@li41 分钟前
数据库:B+ 树 / 数据库索引的底层支柱
数据库
a1117761 小时前
SLAM 学习笔记(三)视觉里程计2(VO) 特征点法
人工智能·笔记·学习
三品吉他手会点灯1 小时前
嵌入式机器学习 - 学习笔记1.1.2 - 机器学习的局限性与伦理
人工智能·笔记·嵌入式硬件·学习·机器学习
Xpower 171 小时前
详细解释 Codex 最近一次功能更新,以及 GPT-5.6 Sol、Terra、Luna 的能力、价格、使用方式和适用场景。
人工智能·python·gpt·学习
梦想的旅途21 小时前
企业微信二次开发实战:基于RPA接口的私域中台架构设计与选型指南
数据库·企业微信·rpa
许彰午1 小时前
87_Python Django模型与数据库
数据库·python·django