案例总结之——redis缓存不一致的问题

news2024/11/19 7:48:13

1.是什么?

  • Redis:Remote Dictionary Server,即远程字典服务
    支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
  • Redis 是当前互联网世界最流行的 NoSQL(Not Only SQL)数据库。
  • Redis支持存储的value数据类型:
    String(字符串)、Hash(哈希类型)、list(链表)、set(集合)、zset(sorted set --有序集合)

2.作用
Redis以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在Redis之中
3.操作-缓存不一致的问题
问题所在:在数据库中添加了新的数据,但是页面加载缓存数据之后并没有显示出来新添加的数据
原因:添加新的数据,但是没有及时清空缓存,打开页面加载的还是上次的数据
步骤:
(1)查看缓存中的数据,还是上一次的数据(根据hash类型的key获取value,缓存是hash数据类型)
在这里插入图片描述
(2)往数据库里新添加一条数据
在这里插入图片描述
(3)再次查询缓存数据
在这里插入图片描述
看到缓存数据已经为空,往数据库添加数据的同时,清空缓存数据

在这里插入图片描述

(4)再次刷新页面的时候,执行方法

public List<TbContent> getContentListByCid(long cid) {
		//查询缓存
		try {
			//如果缓存中有直接响应结果
			String json = jedisClient.hget(CONTENT_LIST, cid + "");
			if (StringUtils.isNotBlank(json)) {
				//json转列表,TbContent.class是list中每个元素的类型
				List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class);
				return list;
			}
		} catch (Exception e) { 
			e.printStackTrace();
		}
		//如果缓存没有就查询数据库
		TbContentExample example = new TbContentExample();
		Criteria criteria = example.createCriteria();
		//设置查询条件
		criteria.andCategoryIdEqualTo(cid);
		//执行查询
		List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example);
		
		//把结果添加到缓存
		try {
			jedisClient.hset(CONTENT_LIST, cid + "", JsonUtils.objectToJson(list));
			jedisClient.expire(CONTENT_LIST, 400);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

因为操作(3)成功在数据库添加了一条数据,同时成功清空了缓存。所以方法判断缓存是否为空,不为空则从数据库中拿到最新数据存到缓存之中,然后渲染到页面上。
(5)再次查看缓存数据,多了新添加的那一条,这就对应上了
在这里插入图片描述
所以说,如何添加数据的时候如果没有及时清空缓存,那么方法判断缓存有数据,于是直接加载了现有的数据,数据库里最新的数据则没有显示出来。

4.总结
当开发一个需求,像上面这样,既涉及到了普通的关系型数据库,也用到了redis这种不同的数据库形式,要结合起来,练习起来看,明确其发挥作用,使用的界限,避免发生这样不对应的情况。

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

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

相关文章

js实现懒加载 最简单

实现前得先知道一下js里的几个高度&#xff1a; 视口高度&#xff1a;document.documentElement.clientHeight 滚动高度&#xff1a;document.documentElement.scrollTop || document.body.scrollTop 元素距离最顶端高度&#xff1a;dom元素.offsetTop 先说一下思路&#xff1…

k8s之list-watch,节点调度以及亲和性

一、list-watch机制1.1 list-watch介绍Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Po…

【mmdeploy部署系列】使用Tensorrt加速部署mmpose人体姿态库

【mmdeploy部署系列】使用Tensorrt加速部署mmpose人体姿态库0.引言1.安装mmcv2.使用mmpose&#xff08;1&#xff09;安装mmpose&#xff08;2&#xff09;运行mmpose3.使用mmdeploy&#xff08;1&#xff09;安装ppl.cv&#xff08;2&#xff09;编译安装mmdeploy&#xff08;…

【手把手一起学习】(八) Altium Designer 20修改和自定义原理图标题栏

1 修改原理图标题栏 直接对原理图标题栏属性进行修改&#xff0c;操作如图所示&#xff1a; 修改后&#xff0c;并不会显示&#xff0c;故该方法不可用&#xff1a; 正确的操作如下&#xff0c;先选择合适的模板&#xff1a; 然后&#xff0c;进行属性的修改&#xff1a; 此时…

Python3中ConfigArgParse模块的使用

ConfigArgParse是一个可以替换argparse的插件&#xff0c;可通过"pip install configargparse"直接安装,允许通过配置文件或环境变量设置选项.最新版本为1.5.3&#xff0c;源码地址为:https://github.com/bw2/ConfigArgParse, License为MIT. Python中的命令行…

分布式-分布式高可用笔记

高可用的保障方式 双十一限制退款 从业务角度考虑&#xff0c;由于活动期间流量巨大&#xff0c;订单产生数量过大&#xff0c;需要节省平台和商家的人力资源&#xff0c;节省库存盘点等工作&#xff1b;退款处理并不是核心流程&#xff0c;在双十一当天&#xff0c;商家也没…

vbscriptaspsql常用代码整理

1、前言 因为目前工作中一直有用到vbscript和asp和sql&#xff0c;所以就把一些常用的语法代码整理了一下。 2、vbscript 2.1、do while循环&if else&#xff08;遍历结果集&#xff09; Dim rs do while not rs.Eof rs.eof表示结果集无法获取更多的数据即&#xff08;…

呼吸机方案 以 MM32F3270 为主控板,MM32SPIN05PF 为电机控制主控

呼吸机的作用是让氧气进入肺部并排出二氧化碳&#xff0c;帮助病患顺利呼吸。呼吸机连接一条管子到患者的嘴或鼻子&#xff0c;氧气量可以通过监视器加以控制。 基于灵动微控制器的呼吸机&#xff0c;以 MM32F3270 为主控板&#xff0c;MM32SPIN05PF 为电机控制主控&#xff1…

【LeetCode每日一题】——605.种花问题

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 贪心算法 二【题目难度】 简单 三【题目编号】 605.种花问题 四【题目描述】 假设有一个很长…

SpringBoot 读取自定义Properties参数

目录 1. 概述 2. 实现方式 2.1 Value方式 2.2 PropertySource与ConfigurationProperties相结合 3. 结束 1. 概述 最近想尝试写一个定时任务管理&#xff0c;相关参数不想在Spring的配置文件Application.yml或者Application.properties获取。想自己新建一个properties文件。顺…

基于ANSYS的无约束梁的模态分析与实验结果比较

一、实验模型简介 该模型来源于文献&#xff1a;“Khatir, A., Capozucca, R., Khatir, S. et al. Vibration-based crack prediction on a beam model using hybrid butterfly optimization algorithm with artificial neural network. Front. Struct. Civ. Eng. 16, 976–98…

Pr 定格拍照动画

哈喽&#xff0c;各位小伙伴&#xff01;今天我们来学习一下如何制作定格拍照动画&#xff1f; ​ 新建序列 新建一个1920*1080的序列&#xff0c;将视频拖入序列中 选择定格画面右键—插入帧定格分段中间部分就会变成一张图片&#xff08;图片时长可伸缩&#xff09; 复制素…

数据结构与算法之堆排序

目录堆排序概述代码实现时间复杂度堆排序概述 堆排序&#xff08;Heap Sort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构&#xff0c;每个结点的值都大于或等于其左右孩子结点的值&#xff0c;称为大顶堆&#xff1b;或者每个结点…

LINE、SDNE和struc2vec图嵌入算法学习笔记

引言 在cs224w课程中&#xff0c;我先后总结了deepwalk、node2vec&#xff0c;这两种算是最经典也是最主流的做法&#xff0c;而在 图节点嵌入相关算法学习笔记 中&#xff0c;从头至尾&#xff0c;将一些经典算法用wiki的数据集复现了一下&#xff0c;所以本篇博文&#xff0…

2023版会声会影电脑配置要求及功能介绍

可能大家已经看到网络上关于会声会影2023新版的一些消息&#xff0c;今天coco玛奇朵在这里分享2023新版公布信息。会声会影2023中文版功能非常强大的视频编辑软件&#xff0c;非常专业的使用效果&#xff0c;会声会影2023可以针对剪辑电影进行使用&#xff0c;非常强大的色彩校…

借助CatGPT让turtlesim小乌龟画曲线

注意这里是CatGPT&#xff0c;不等同OpenAI的ChatGPT&#xff0c;但是用起来十分方便&#xff0c;效果也还行。详细说明ROS机器人turtlesim绘制曲线需要注意哪些ROS机器人turtlesim绘制曲线需要注意以下几点&#xff1a;绘制曲线前需要设置好turtlesim的初始位置和方向&#xf…

【matplotlib】条形图及垂线显示小技巧 |一些有用参考帖子收集

最近在画图。一方面看论文看思路&#xff0c;一方面用数据跑图出论文雏形。 有些帖子写得很好&#xff0c;不记录的话下次还想看就只能随缘了。 帖子 博客&#xff1a;nxf_rabbit75 matplotlib技巧—9.共享坐标轴、创建多个subplot、调整横坐标、放置文本框、latext文字、平移…

组播详解及示例代码

写在前面 由于公司业务需要用到组播实现&#xff0c;这里就记录下学习过程。在学习组播之前&#xff0c;我们先来看看另外两种数据包传输方式&#xff1a;单播和广播。 单播&#xff1a;简单来说就是数据一对一发送&#xff0c;如果需要给多个主机发送数据时&#xff0c;就需…

Unity入门精要02---纹理

纹理和材质不可分割 本节知识结构 实践&#xff1a;简单贴一张纹理到模型上 首先在属性处添加相关属性 Properties {_Color ("Color Tint", Color) (1, 1, 1, 1)_MainTex ("Main Tex", 2D) "white" {}//加入纹理_Specular ("Specular&q…

虚拟机VirtualBox下载与安装+虚拟机配置

1、虚拟机VirtualBox下载与安装官网地址&#xff1a;Oracle VM VirtualBox进入官网&#xff0c;点击左侧Dwonlaods点击Windows hosts&#xff0c;开始下载3.打开文件.出现报错&#xff1a;Oracle VM VirtualBox 7.0.4 needs the Microsoft Visual C 2019 Redistributable Packa…