缓存知识回顾

- 缓存的使用场景
系统查询性能较低,且对数据实时性要求不高的

- 两种常见的缓存

  1. 本地缓存:
    java中的Map、List 的确这种方式简单有效,但是带来的弊端就是过于简单,功能也就过于缺乏,而且如果使用不当,将带来可怕的内存溢出 java private static final Map<K,V> LOCAL_CACHE = new ConcurrentHashMap<>();

  2. 第三方中间件缓存:redis等 。可以同时多台服务器依赖于同一个缓存实现数据的一致性

Redis缓存的常见问题:
1. 缓存穿透:访问不存在的key,导致请求打到了数据存储层
策略:对空值也进行缓存,使用布隆过滤器过滤掉不存在的key的请求
2. 缓存击穿:热点key失效,导致大量请求打到了数据存储层
策略:热点key永不过期
3.缓存雪崩:短时间内大量缓存过期,导致大量请求打到了数据存储层
策略:避免key过期时间一致
使用互斥锁:在缓存失效时,可以使用互斥锁来控制对数据库的访问,确保只有一个请求可以去数据库加载数据并重建缓存,其他请求等待缓存重建完成后再进行访问。

- 缓存不一致问题 更新缓存与更新数据库不是一个原子操作

常见真实场景: (1)代码先执行更新缓存操作成功,后执行更新数据库操作失败了。 (2)同时有两个进程在交替执行更新缓存,更新数据库的操作,可能最终结果缓存是A进程更新的值,数据库是B进程更新的值。

解决策略:
使用分布式锁,保证不同进程的操作顺序;
采用延迟双删策略:

首次删除缓存:当有数据更新时,首先删除Redis中对应的缓存数据。这是为了确保后续的读操作不会读取到旧的缓存数据。
更新数据库:紧接着更新数据库中的数据,以确保所有持久化存储的数据都是最新的。
延时等待:在更新数据库后,不立即进行第二次删除操作,而是等待一段时间(通常是几百毫秒)。这个延时是为了确保数据库的更新操作能够完成。如果在数据库更新完成之前就进行第二次删除,可能会导致在这段时间内有请求访问到过期的数据。
再次删除缓存:延时结束后,再次删除Redis中的缓存数据。这次删除是为了处理在第一次删除和更新数据库之间可能已经读取了旧数据的请求。这些请求可能在第一次删除后仍然持有旧数据,通过第二次删除可以确保这些请求在下一次访问时会去数据库中获取最新的数据。
需要注意的是,延时双删策略并不是强一致性保证,它只能减轻数据不一致的问题,但无法完全避免。此外,对于经常修改的数据表,不建议使用Redis作为缓存,因为频繁的更新操作会增加维护缓存的复杂性和成本。

不同服务器结点的缓存数据不一致(本地缓存)
本地缓存更新时只更新到了处理该请求的服务节点,其他结点的缓存没有更新。
常见解决方案:发送更新请求到mq,广播更新缓存

应用:热搜使用了redis缓存中的zset

伙伴匹配系统中使用redis的GEO实现搜索附近用户功能
在 User (用户) 表中添加两个字段 longitude (经度)和 dimension (维度),用以存储用户的经纬度坐标。因为Redis GEO 通过每个用户的经纬度坐标计算用户间的距离,同时其 Redis 数据结构为ZSET,ZSET 是一个有序的 List 类似 Java 的 SortedSet。在此场景 value 就是用户id,score 是经纬度信息 ( ZSET 根据 score值升序排序) 。

@Test
public void importUserGEOByRedis(){List<User> userList = userService.list0; // 查询所有用户String key = RedisConstant.USER GEO KEY// Redis的keyList<RedisGeoCommands.GeoLocation<String>> locationList = new ArrayList<>(userList.size(); // 初始化地址(经纬度) for (User user : userList) locationList.add(new RedisGeoCommands.GeoLocation<>String.value0f(user.getId0), new Point (user.getLongitude(),user.getDimension0))); // 往locationList添加每个用户的经纬度数stringRedisTemplate.opsForGeo .add(key,locationList); // 将每个用户的经纬度信息写入Redis中
}

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

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

相关文章

知识管理软件那么多,怎么挑选才适合初创企业?

对于初创企业来说&#xff0c;资源有限&#xff0c;效率显得尤其重要。此时&#xff0c;一个强大的知识管理软件就显得必不可少。它不仅利于信息的录入、查找和共享&#xff0c;还可以帮助团队更好的组织和协作&#xff0c;提高工作效率。那么&#xff0c;在众多的知识管理软件…

SQL-Labs靶场“34-35”关通关教程

君衍. 一、34关 POST单引号宽字节注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 二、35关 GET数字型报错注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 SQL-Labs靶场通关教程&#xff1a; SQL注入第一课 SQL注入思路基础 SQL无列…

第 6 章 ROS-xacro练习(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.4.3 Xacro_完整使用流程示例 需求描述: 使用 Xacro 优化 URDF 版的小车底盘模型实现 结果演示: 1.编写 X…

24计算机考研调剂 | 江西理工大学

能源、化工、计算机&#xff08;0854&#xff09;等相关方向有3个调剂名额 考研调剂招生信息 学校:江西理工大学 专业:工学->治金工程 年级:2024 招生人数:3 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 能源、化工、计…

使用Dockerfile打包java项目生成镜像部署到Linux

1、Dockerfile 介绍 如果说容器就是“小板房”&#xff0c;镜像就是“样板间”。那么&#xff0c;要造出这个“样板间”&#xff0c;就必然要有一个“施工图纸”&#xff0c;由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。 比起容…

VUE3.0(一):vue3.0简介

Vue 3 入门指南 什么是vue Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界…

0基础 三个月掌握C语言(13)-下

数据在内存中的存储 浮点数在内存中的存储 常见的浮点数&#xff1a;3.141592、1E10等 浮点数家族包括&#xff1a;float、double、long double类型 浮点数表示的范围&#xff1a;在float.h中定义 练习 关于&#xff08;float*)&n&#xff1a; &n&#xff1a;这是一…

2549.统计桌面上的不同数字:数学O(1) / 模拟O(n^3)

【LetMeFly】2549.统计桌面上的不同数字&#xff1a;数学O(1) / 模拟O(n^3) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-distinct-numbers-on-board/ 给你一个正整数 n &#xff0c;开始时&#xff0c;它放在桌面上。在 109 天内&#xff0c;每天都要执行下…

Java transient 关键字

Java字段不想序列化怎么办 在 Java 中&#xff0c;如果某个字段不想被序列化&#xff08;即不希望被写入到序列化的数据流中&#xff09;&#xff0c;可以使用 transient 关键字进行标记。通过在字段前加上 transient 关键字&#xff0c;可以告诉 Java 序列化机制忽略该字段&am…

53、Qt/信号与槽、QSS界面设计20240322

一、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

Stable Diffusion训练图片时,简陋的数据处理

0 图片从命名 如果有强迫症&#xff0c;看到似乎乱码的命名会不舒服&#xff0c;那么就批量从命名 import osdef rename_files_in_directory(directory, key_word, new_suffix):i 1for filename in os.listdir(directory):new_file key_word str(i).zfill(3) new_suffixsou…

yolov6实现遥感影像目标识别|以DIOR数据集为例

1 目标检测是计算机视觉领域中的一项重要任务&#xff0c;它的目标是在图像或视频中检测出物体的位置和类别。YOLO&#xff08;You Only Look Once&#xff09;是一系列经典的目标检测算法&#xff0c;最初由Joseph Redmon等人于2016年提出。YOLO算法具有快速、简单、端到端的特…

证书(公钥):网络安全的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

YOLOv5全网首发改进: 注意力机制改进 | 上下文锚点注意力(CAA) | CVPR2024 PKINet 遥感图像目标检测

💡💡💡本文独家改进:引入了CAA模块来捕捉长距离的上下文信息,利用全局平均池化和1D条形卷积来增强中心区域的特征,从而提升检测精度,CAA和C3进行结合实现二次创新,改进思路来自CVPR2024 PKINet,2024年前沿最新改进,抢先使用 💡💡💡小目标数据集,涨点近两个…

【亚马逊云AI课程上新】「生成式 AI 精英速成计划」 即刻成为炙手可热 AI 人才

文章目录 1. 生成式 AI 精英速成计划介绍2. 重磅课程 增亮你的职业生涯3. 多种身份 全面赋能4. 关于「商业应用技能」课程5. 关于「技术开发技能」课程介绍6. 化身学霸得好礼 好礼双周送附&#xff1a;亚马逊云科技海外账号注册流程 1. 生成式 AI 精英速成计划介绍 &#x1f4…

解决大型语言模型中的幻觉问题:前沿技术的综述

大型语言模型中的幻觉问题及其解决技术综述 摘要 大型语言模型(LLM)如GPT-4、PaLM和Llama在自然语言生成能力方面取得了显著进步。然而&#xff0c;它们倾向于产生看似连贯但实际上不正确或与输入上下文脱节的幻觉内容&#xff0c;这限制了它们的可靠性和安全部署。随着LLM在…

公司调研 | Agility | 网红人形机器人Digit | 商业化情况

最近做的一些公司 / 产品调研没有从技术角度出发&#xff0c;而更关注宏观发展&#xff1a;主营方向、产品介绍、商业化落地情况、融资历程、公司愿景、创始人背景等。部分调研放在知乎上&#xff0c;大部分在飞书私人链接上 最近较关注人形Robot的发展情况&#xff0c;欢迎感兴…

在云上部署我的个人博客!!!

这和上一篇是连起来的&#xff0c;大家先整体看一遍&#xff0c;不要跟&#xff0c;前面有些弯路&#xff01;&#xff01;&#xff01; 【这是按时计费的&#xff0c;欠费不能用&#xff0c;交了好几次哈哈哈哈 】 【我买的域名是&#xff1a;128.1.61.228】 【把域名这个位置…

C#面:什么是不可变字符串

C# 中的字符串类型&#xff08;string&#xff09;是不可变的&#xff0c;这意味着一旦创建了一个字符串对象&#xff0c;就不能再对其进行修改。 当对一个字符串进行拼接、替换、删除等操作时&#xff0c;实际上是创建了一个新的字符串对象&#xff0c;而原始的字符串对象保持…

鸿蒙Harmony应用开发—ArkTS(@Link装饰器:父子双向同步)

子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 限制条件 Link装饰器不能在Entry装饰的自定义组件中使用…