Redis缓存更新策略

news2024/11/23 15:17:47

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

1.缓存更新三种策略:

  • 内存淘汰:redis自动进行,当redis内存达到咱们设定的max-memery的时候,会自动触发淘汰机制,淘汰掉一些不重要的数据(可以自己设置策略方式)
  • 超时剔除:当我们给redis设置了过期时间ttl之后,redis会将超时的数据进行删除,方便咱们继续使用缓存。
  • 主动更新:我们可以手动调用方法把缓存删掉,通常用于解决缓存和数据库不一致问题。

缓存更新策略

2. 主动更新策略

由于我们的缓存的数据源来自于数据库,而数据库的数据是会发生变化的,因此,如果当数据库中数据发生变化,而缓存却没有同步,此时就会有一致性问题存在,其后果是:用户使用缓存中的过时数据,就会产生类似多线程数据安全问题,从而影响业务,产品口碑等。

  • Cache Aside Pattern 人工编码方式:缓存调用者在更新完数据库后再去更新缓存,也称之为双写方案。(建议使用)
  • Read/Write Through Pattern : 由系统本身完成,数据库与缓存的问题交由系统本身去处理。
  • Write Behind Caching Pattern :调用者只操作缓存,其他线程去异步处理数据库,实现最终一致。

主动更新策略

如果采用第一个方案,那么假设我们每次操作数据库后,都操作缓存,但是中间如果没有人查询,那么这个更新动作实际上只有最后一次生效,中间的更新动作意义并不大,我们可以把缓存删除,等待再次查询时,将缓存中的数据加载出来

操作缓存和数据库时有三个问题需要考虑:

  • 删除缓存还是更新缓存?
    • 更新缓存:每次更新数据库都更新缓存,无效写操作较多
    • 删除缓存:更新数据库时让缓存失效,查询时再更新缓存**(建议使用)**
  • 如何保证缓存与数据库的操作的同时成功或失败?
    • 单体系统,将缓存与数据库操作放在一个事务
    • 分布式系统,利用TCC等分布式事务方案
  • 先操作缓存还是先操作数据库?
    • 先删除缓存,再操作数据库
    • 先操作数据库,再删除缓存**(建议使用)**

总结

案例代码:

package com.hmdp.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.Shop;
import com.hmdp.mapper.ShopMapper;
import com.hmdp.service.IShopService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.RedisConstants;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  服务实现类
 * </p>
 */
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    @Transactional
    public Result updateShop(Shop shop) {
        Long id = shop.getId();
        if (id == null){
            return Result.fail("商品ID不能为空");
        }
        // 更新数据库
        updateById(shop);
        // 删除缓存
        stringRedisTemplate.delete(RedisConstants.CACHE_SHOP_KEY + id);
        return Result.ok("商品信息更新成功!");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 自带环境变量

目录 Windows自带环境变量说明Windows自带环境变量总结 所谓 Windows 环境变量&#xff0c;指的是 Windows 指定操作系统工作环境的一些设置选项或属性参数&#xff0c;比方说指定系统文件夹或临时文件夹的位置等。与常量相比&#xff0c;一个环境变量往往由变量名称和变量值组…

深入了解Android系统中的音视频编解码器:MediaCodec

Media内核源码 Media内核是Android系统中负责音视频处理的核心模块&#xff0c;包括音视频采集、编解码、传输、播放等功能。Media内核源码位于Android源码树的/frameworks/av目录下&#xff0c;主要包括以下模块&#xff1a; media/libstagefright&#xff1a;包含了Media F…

设计模式——组件协作模式之策略模式

文章目录 前言一、“组件协作” 模式二、Strategy 策略模式1、动机2、模式定义3、代码示例4、结构 要点总结 前言 一、“组件协作” 模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”&#xff0c;“组件协作” 模式通过晚期绑定&#xff0c;来实现框架与应用…

【内网】WebStorm搭建Vue环境

文章目录 安装node.js和npm1、 Node.js和npm简介2、下载Node.js3、安装Node.js4、检查是否安装成功5、环境配置&#xff08;很重要&#xff01;&#xff09;6、配置内网离线库 安装WebStorm并运行Vue项目1、新建项目2、测试 安装node.js和npm 1、 Node.js和npm简介 简单的说 …

阿里云服务器-Linux

说明&#xff1a;自己想玩一下服务器&#xff0c;记录一下服务器安装的环境以及软件。包括JDK&#xff0c;Mysql&#xff0c;tomcat等。 一&#xff1a;JDK篇 服务器上也是需要安装JDK环境的&#xff0c;跑不掉的。阿里云服务器提供了命令安装&#xff0c;固定安装目录自动配…

【Jmeter】Oracle数据迁移,批量插入测试数据~

前言~1.准备事项1.1 梳理脚本 2.动起手来2.1 了解 JDBC Connection Configuration2.2 配置 JDBC请求 3.生成测试链路3.1 获取表主键信息3.2 获取目标表表结构3.3 拼接数据并生成sql3.4 插入数据 4.优化脚本&#xff08;主键信息4.1 添加Beshell后置处理器4.2 优化拼接数据请求&…

C++类与对象——this指针

文章目录 概述this指针的引出this指针的特性将this指针用于多个对象的比较this指针可以为空吗&#xff1f; 概述 本篇博客主要讲解C类和对象模块中的this指针的知识&#xff0c;将会深入探究this指针的使用细节即使用时需要注意的点&#xff0c;并且简单讲解一下底层的实现原理…

Maven(五):Maven的使用——依赖的测试

Maven&#xff08;五&#xff09;&#xff1a;Maven的使用——依赖的测试 前言一、实验六&#xff1a;测试依赖的范围1、依赖范围1.1 compile 和 test 对比1.2 compile 和 provided 对比1.3 结论 二、实验七&#xff1a;测试依赖的传递性1、依赖的传递性1.1 概念1.2 传递的原则…

内网渗透之横向移动rdpwinrmwinrsspnkerberos

0x00 准备 环境&#xff1a;god.org cs上线 win2008web 提权利用ms14-058 抓取hash和明文密码(当获取到其他主机就重复提权和抓取密码) 扫描存活主机&#xff0c;扫描端口 代理转发-转发上线&#xff0c;生成反向连接木马&#xff0c;绑定监听器&#xff0c;上传至web根目录(方…

hardhat 本地连接matemask钱包

Hardhat 安装 https://hardhat.org/hardhat-runner/docs/getting-started#quick-start Running a Local Hardhat Network Hardhat greatly simplifies the process of setting up a local network by having an in-built local blockchain which can be easily run through a…

制作一个高质量的FAQ页面需要考虑哪些因素?

作为现代企业不可缺少的知识库&#xff0c;FAQ页面&#xff08;Frequently Asked Questions&#xff09;是集中呈现重要信息供用户查询和解决问题的权威场所。如果您在网站上提供了不错的产品或服务&#xff0c;很多客户都会通过访问FAQ页面找到他们需要的答案。 在设计和创建…

Linux Ansible安装以及环境搭建

Ansible介绍 Ansible是一种基于Python的自动化配置工具&#xff0c;通过OpenSSH的方式管理被管理节点&#xff0c;实现批量系统配置、批量程序部署、批量运行命令等功能。 当管理节点需要管理被管理节点时&#xff0c;只需要在管理节点安装ansible&#xff0c;无需在被管理节…

23种设计模式-代理模式

代理模式 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对象提供…

【KingSCADA】什么是精灵图以及如何创建精灵图

大家好&#xff0c;我是雷工&#xff01; 本篇学习精灵图的制作&#xff0c;以下为学习内容及相关笔记。 一、什么是精灵图 精灵图是一种在外观上类似组合图&#xff0c;但内部嵌入了比较丰富的动画链接与逻辑控制&#xff0c;工程开发人员只要将其从精灵图库中调出来放置在开…

[Netty] Mpsc Queue (十七)

JCTools 是适用于 JVM 并发开发的工具&#xff0c;主要提供了一些 JDK 确实的并发数据结构&#xff0c;例如非阻塞 Map、非阻塞 Queue 等。其中非阻塞队列可以分为四种类型&#xff0c;可以根据不同的场景选择使用。 Spsc 单生产者单消费者Mpsc 多生产者单消费者Spmc 单生产者…

大模型(LLM)训练微调综述学习

总览 介绍大模型训练的微调方法&#xff0c;包括prompt tuning、prefix tuning、LoRA、p-tuning和AdaLoRA等。介绍使用deepspeed和LoRA进行大模型训练的相关代码。给出petals的介绍&#xff0c;它可以将模型划分为多个块&#xff0c;每个用户的机器负责其中一块&#xff0c;分…

PS学习记录-PPI与DPI

先说两者的重点&#xff1a; dpi是印刷图像时候用的&#xff0c;ppi是设计图像时候用的dpi&#xff1a;【点/英寸】 是印刷计量单位&#xff0c;是每英寸上所印刷的【墨点数】&#xff0c;打印图片一般300dpi左右&#xff0c;代表打印的解析度。ppi&#xff1a;【像素/英寸】是…

快速精通Git

一、 版本控制工具 1.1. 什么是版本控制系统&#xff1f; 版本控制系统&#xff08;Version Control System&#xff09;:是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件&#xff0c;而且…

温度调制式差示扫描量热法(MTDSC)中的正弦波温度控制技术

摘要&#xff1a;在调制温度式差式扫描量热仪&#xff08;MTDSC&#xff09;中&#xff0c;关键技术之一是正弦波加热温度的实现&#xff0c;此技术是制约目前国内无法生产MTDSC量热仪的重要障碍&#xff0c;这主要是因为现有的PID温控技术根本无法实现不同幅值和频率正弦波这样…

uie-base使用记录(paddlenlp)

参考文章&#xff1a;https://aistudio.baidu.com/aistudio/modelsdetail?modelId22 参考文章&#xff1a;https://paddlenlp.readthedocs.io/zh/latest/FAQ.html 参考文章&#xff1a;https://developer.aliyun.com/article/1066857 参考文章&#xff1a;https://github.com/…