首页 > 其他分享 >dp商品缓存

dp商品缓存

时间:2024-05-24 17:28:49浏览次数:20  
标签:shop 缓存 return redis 商品 Result id dp

缓存更新策略

缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者把他叫为淘汰更合适。

内存淘汰:redis自动进行,当redis内存达到咱们设定的max-memery的时候,会自动触发淘汰机制,淘汰掉一些不重要的数据(可以自己设置策略方式)

超时剔除:当我们给redis设置了过期时间ttl之后,redis会将超时的数据进行删除,方便咱们继续使用缓存

主动更新:我们可以手动调用方法把缓存删掉,通常用于解决缓存和数据库不一致问题

商品缓存代码:(String类型)

public Result queryById(Long id) {
// 1、提交店铺id
String key = CACHE_SHOP_KEY + id;
// 2、从redis查询店铺信息
String shopJson = stringRedisTemplate.opsForValue().get(key);
// 3.是否缓存命中
if(StrUtil.isNotBlank(shopJson)) {
    // 4. 命中直接返回
    Shop shop = JSONUtil.toBean(shopJson, Shop.class);
    return Result.ok(shop);
}
// 5、 未命中则根据id查询数据库
Shop shop = getById(id);
// 6、 判断商铺是否存在
if(shop == null) {
    // 不存在返回404
    return Result.fail("店铺不存在!");
}
// 7、 存在则存入redis
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop));
// 8、返回
return Result.ok(shop);
}

商品类型缓存代码:(List类型)

public List<ShopType> queryTypeList() {
    // 1、构建key
    String key  = "cache:shopType:list";
    // 2、判断缓存是否命中
    List<String> shopTypeList = stringRedisTemplate.opsForList().range(key, 0, -1);
    List<ShopType> shopTypesByRedis = new ArrayList<>();
    if (shopTypeList != null && shopTypeList.size() > 0) {
        // 3、命中,将JSON数据转换成对象
        for (String shopType : shopTypeList) {
            ShopType type = JSONUtil.toBean(shopType, ShopType.class);
            shopTypesByRedis.add(type);
        }
        return shopTypesByRedis;
    }
    // 4、未命中,从数据库查询
    List<ShopType> shopTypeListMysql = query().orderByAsc("sort").list();
    // 5、将查询结果写入缓存
    if(shopTypeListMysql != null)  {
        for (ShopType shopType : shopTypeListMysql) {
            stringRedisTemplate.opsForList().rightPushAll(key, JSONUtil.toJsonStr(shopType));
        }
    } else {
        return null;
    }
    return shopTypeListMysql;
}

实现商铺和缓存与数据库双写一致

  • 根据id查询店铺时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间
// 7、 存在则存入redis
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);
  • 根据id修改店铺时,先修改数据库,再删除缓存
public Result updateShop(Shop shop) {
Long id = shop.getId();
if(id == null) {
    return Result.fail("店铺id不能为空");
}
// 1. 更新数据库
updateById(shop);
// 2. 删除缓存
stringRedisTemplate.delete(CACHE_SHOP_KEY + id);
return Result.ok();
}

解决缓存穿透问题

if(StrUtil.isNotBlank(shopJson)) {
    // 4. 命中直接返回
    Shop shop = JSONUtil.toBean(shopJson, Shop.class);
    return Result.ok(shop);
}
// 是否为空值
if(shopJson.equals("")) {
    return Result.fail("店铺不存在!");
}
// 5、 未命中则根据id查询数据库
Shop shop = getById(id);
// 6、 判断商铺是否存在
if(shop == null) {
    // 将空值写入redis
    stringRedisTemplate.opsForValue().set(key,"", CACHE_NULL_TTL, TimeUnit.MINUTES);
    // 不存在返回404
    return Result.fail("店铺不存在!");
}

解决缓存击穿问题

常见的解决方案有两种:

  • 互斥锁
  • 逻辑过期

标签:shop,缓存,return,redis,商品,Result,id,dp
From: https://blog.csdn.net/m0_47536537/article/details/139179861

相关文章

  • hmdp-短信验证
    基于Session实现登录流程发送验证码:用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户短信验证码登录、注册:用户将验证码和手机号进行输入,后......
  • redis自学(44)多级缓存
              就是把注释全都删了  这里指的是OpenResty的Nginx配置文件   请求参数处理    先修改Nginx配置文件 修改lua文件,然后重启nginx   查询Tomcat   写lua文件做工具类      ......
  • 【教程】WordPress资源下载主题 Modown 书面使用教程
    这篇文章介绍了WordPress资源下载主题Modown的书面使用教程。文章包括安装主题、设置主题选项、自定义分类法、菜单、登录页面、小工具等。使用Modown主题可以通过设置首页模板一和使用mocat短代码来显示分类模块。同时还介绍了如何设置标题模块和显示广告。安装将从模板兔......
  • Java并发编程之newFixedThreadPool线程池
    随着计算机硬件性能的不断提升,多核CPU的普及,现代计算机系统的性能越来越强大。在这样的环境下,如何更好地利用计算机系统的性能优势,提高程序的运行效率,是每一个Java开发者需要思考的问题。Java中提供了多线程编程的支持,但是在多线程编程中,线程的创建、启动、调度等都需要耗费一定的......
  • diffusion model(一):DDPM技术小结 (denoising diffusion probabilistic)
    发布日期:2023/05/18主页地址:http://myhz0606.com/article/ddpm1从直觉上理解DDPM在详细推到公式之前,我们先从直觉上理解一下什么是扩散对于常规的生成模型,如GAN,VAE,它直接从噪声数据生成图像,我们不妨记噪声数据为\(z\),其生成的图片为\(x\)对于常规的生成模型:学习一个解码函......
  • dpkg和rpm对比及常用命令
    dpkg(DebianPackage)和rpm(RPMPackageManager)是两种不同的Linux包管理工具,它们各自在特定的Linux发行版中占据核心地位。两者之间对比如下:所属发行版:dpkg主要用于Debian及其衍生系统,如Ubuntu、Knoppix等。而rpm则主要用于RedHat及其衍生系统,如CentOS和Fedora。软件包格式:d......
  • 线段(线性dp)
     题目链接:https://www.luogu.com.cn/problem/P3842思路:f[i][0]表示走完第i行且停在第i行的左端点最少用的步数f[i][1]同理,停在右端点的最少步数。那么转移就很简单了,走完当前行且停到左端点,那么一定是从右端点过来的,那么从上一行左端点转移的话就是f[i][0]=abs(上一行左端......
  • 背包dp
    P1064[NOIP2006提高组]金明的预算方案思路:有依赖的背包。主要的问题和解决方案,见代码注释.#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl"\n"constintN=2e5+10;typedefstructnode{intp,w,typ;}node;boolcmp(nodea,n......
  • Dplayer播放m3u8
    <!--引入DPlayer--><linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.css"><scriptsrc="https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"></script><scriptsrc=&quo......
  • 私有云和多云管理平台 | Cloudpods v3.10.15 正式发布
    功能优化【主机】裸金属详情页增加部分属性信息【监控】优化告警策略,支持同时设置多监控指标【主机】支持透传设备自动探测【主机】LVM块存储支持快照【监控】简化Telegraf容器的挂载点【主机】新建VMware支持同时填写备注信息【存储】KVM支持对接LVM存储问题修......