redis缓存

1.什么是缓存

缓存就是数据交换的缓冲区,称为cache,是存储数据的临时地方,一般读写性能较高

典型例子就是在计算机的CPU和内存、磁盘。CPU的运算能力非常强大,运算速度已经远远超过内存或者磁盘读写数据的能力。但是先读到数据才能进行处理,那么数据读写能力较低就限制了CPU的性能。CPU内部添加缓存之后,就直接从缓存中读取数据进行计算,充分应用了CPU的性能。

缓存的应用场景

缓存的作用

  • 降低后端负载
  • 提高读写效率,降低响应时间(可应对更高并发的场景了)

缓存的成本

  • 数据一致性成本(数据库数据更新了,缓存的数据还是旧数据,命中缓存就读到了旧数据,可能带来严重问题)
  • 解决问题需要进行代码维护,维护成本较高
  • 运维成本(集群模式的部署和维护、硬件成本)

 

添加redis缓存

2.缓存更新策略

针对 数据一致性 问题,提出了缓存更新策略,用来解决数据一致性问题、

更新策略主要分为三种

低一致性需求:使用内存淘汰机制

高一致性需求:使用主动更新,并以剔除超时时间兜底

主动更新策略:

Cache Aside Pattern:由缓存的调用者,在更新数据库时同时更新缓存
Read/Write Through Pattern:缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题
Write Behind Caching Pattern:调用者只操作缓存,用其他线程异步将缓存持久化到数据库,保证最终一致

一般使用的主动更新策略是第一种,操作缓存和数据库时还需要注意三个问题

1.删除缓存还是更新缓存?
更新缓存:每次更新数据库都更新缓存,无效写操作较多
删除缓存:更新数据库时让缓存失效,查询时再更新缓存(有人访问才更新,延迟加载,写的频率更低,有效更新更多,适合选择的方案)

2.如何保证缓存与数据库的操作的同时成功或失败?保证操作原子性
单体系统,将缓存与数据库操作放在一个事务
分布式系统,利用TTC等分布式事务方案

3.先操作缓存还是先操作数据库

先操作缓存再操作数据库

正常情况

异常情况: 

 

 删除缓存很快了,更新数据库相对较慢,查写操作也快,所以上述情况发生概率是不小的

再看先操作数据库,后删除缓存

正常情况

特殊情况:缓存失效

 

 

场景:并发、缓存失效

1和4步骤是写缓存的操作,相比线程进行数据库的更新速度(写操作)来说,速度是极快的,因此这种情况不易发生(如果发生了,可以在加一个超时时间,超时后就删除了)

综上所述,这两种方案都有可能的发生线程不安全问题,但是方案二(先操作数据库,再删除缓存)更加安全

3.缓存穿透

请求到达redis为命中,然后请求到达数据库,也为命中。如果大量的不存在于数据库中的数据同时打到数据库,数据库很可能会难以承载而崩溃。

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都打到数据库 

解决方案:

缓存null值

 

优点:实现简单维护方便

缺点:额外的内存消耗(设置TTL )、可能造成短期不一致(假如数据库真的插入了对应数据,之前redis写入的缓存是null,就数据不一致了,TTL过期后才能正确查询)

布隆过滤

4.缓存雪崩

缓存雪崩是同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量的请求到达数据库,带来巨大的压力

解决方案:

给不同的key的TTL添加随机值(控制过期时间)

利用redis集群提高服务的可用性(哨兵机制)

给缓存业务添加限流策略(拒绝服务,牺牲部分服务,保护数据库)

给业务添加多级缓存

5.缓存击穿

 缓存击穿问题也叫做热点key问题,就是一个被高并发访问的并且缓存重建业务较复杂的key突然失效了,无数的请求访问会瞬间非数据库带来巨大的冲击

缓存重建的时间比较长,后续的所有请求都会打到数据库上

解决方案:

互斥锁

只有获取锁成功的现线程才能重建,其它线程等待(保证了数据一致性)

其它线程都在等待,性能比较差 

逻辑过期

 发现数据过期后,获取锁,交由另一个线程进行重建。然后返回旧的过期数据,别的线程也是如此,在重建完成前都返回过期数据,在重建完成后返回最新的数据。所有的请求不会直接打到数据库上、不能保证数据的一致性

对比

 

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

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

相关文章

【内网穿透】内网穿透应用场景

伴随着科学技术的进步,我们身边出现了越来越多的电子设备,特别是移动电子设备的普及,给我们的生活带来极大的便利,而软件技术的发展,更为这些软件设备带来更多应用的可能。虽然移动设备覆盖了了我们生活的绝大部分场景…

Mac 补丁管理

Mac 补丁管理涉及通过扫描收集所有缺失补丁的完整列表、下载缺失的补丁、在非生产计算机上测试它们,最后将它们推广到生产环境中进行部署来管理 macOS 端点,修补 Mac 设备(又称 Mac 修补)可增强 macOS 环境的安全级别。 什么是 m…

Vue3基础知识(待续)

Vue是什么 构用户界面的js的渐进式框架,基于htlm、css、js,并提供声明式组件化的编程模型,帮你高效开发用户界面。无论简单或复杂的界面Vue都可以胜任。 vue是一个框架,同时也是一个生态。因为有很多程序员支持vue,开…

2023年第四届“华数杯”数学建模思路 - 案例:退火算法

## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上,退火(annealing)现象指物体逐渐降温的物理现象,温度愈低&#…

Git基础知识:常见功能和命令行

文章目录 1.Git介绍2.安装配置2.1 查看配置信息 3.文件管理3.1 创建仓库3.2 版本回退3.3 工作流程3.4 撤销修改3.5 删除文件 4.远程仓库4.1 连接远程库4.2 本地上传至远程4.3 从远程库克隆到本地 5.分支管理5.1 创建分支5.2 删除分支5.3 合并分支解决冲突 参考: Git…

《Kali渗透基础》12. 无线渗透(二)

kali渗透 1:无线协议栈1.1:ifconfig1.2:iwconfig1.3:iw1.4:iwlist 2:无线网卡配置2.1:查看无线网卡2.2:查看信道频率2.3:扫描附近 AP2.4:侦听接口添加与删除 …

键入网址到网页显示,期间发生了什么

HTTP 浏览器做的第一步工作是解析URL 首先浏览器做的第一步工作就是要对URL进行解析,从而生成发送给 web 服务器的请求信息。 所以图中长长的URL实际上是请求服务器里的文件资源。 如果图中的蓝色部分URL元素省略了,那应该请求哪个文件呢? 当…

ARM裸机-12(GPIO和LED)

1、点亮LED 1.1、硬件工作原理及原理图查阅 1.1.1、LED物理特性 LED本身有2个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给他的正负极上加正电压即可,要熄灭一颗…

HTTP 状态码的分类和含义

HTTP(Hypertext Transfer Protocol)状态码是由服务器向客户端传输的 HTTP 响应中的一个三位数字代码。它们提供了关于请求的处理状态和结果的信息。以下是一些常见的 HTTP 状态码及其含义: 1xx 信息响应:指示服务器已收到请求&…

【linux-zabbix】zabbix-agent启动报错:Daemon never wrote its PID file. Failing.

背景: 发现有部分的agent失联,排查发现机器正常,agent没起来。 排查日志发现: # journalctl -xe -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit zabbix-agent.service has begun start…

自学安全卷不动,是放弃还是继续?

有天我想去搜一下怎么约女孩子看电影比较不油腻的时候,突然看到一个话题“自学网络安全的人都是什么感受”。 因为我的粉丝们大部分都是在自学或者是准备入行的大学生,所以我很认真一个一个去看了下别人的回答。基本都是劝退自学为主,因为自学…

智能化RFID耳机装配系统:提升效率、精准追踪与优化管理

智能化RFID耳机装配系统:提升效率、精准追踪与优化管理 在当今的智能化时代,无线射频识别技术(RFID)被广泛应用于各个行业。本文将介绍一种基于RFID技术的智能耳机装配案例,通过RFID技术实现耳机装配过程的自动化控制…

vue 新学习 04 css样式绑定,渲染,key的重要意义

之前的html文件如何去绑定css样式&#xff1f; 01.首先在html文件中&#xff0c;在<head>标签中&#xff0c;用<style>中去写样式&#xff0c;通过html标签(每一个标签都有这样子的属性)中的class或者是id属性来完成<style>中的描绘的样式的用。 例子&#x…

【计算机网络】NAT及Bridge介绍

OSI七层模型 七层模型介绍及举例 为通过网络将人类可读信息通过网络从一台设备传输到另一台设备&#xff0c;必须在发送设备沿 OSI 模型的七层结构向下传输数据&#xff0c;然后在接收端沿七层结构向上传输数据。 数据在 OSI 模型中如何流动 库珀先生想给帕尔梅女士发一封电…

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循…

LeetCode题解:剑指 Offer 56 - I. 数组中数字出现的次数,哈希表,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/ 解题思路&#xff1a; 遍历nums&#xff0c;使用Set保存第一次遇到的数字。如果第二次遇到相同数字&#xff0c;将其从Set中删除。最终Set中只会留下2个数字&#xff0c;即…

操作系统启动后网络还需要比较慢的时间才启动(差不多二分钟)

环境 linux 4.14.61 systemd version 247.3 问题 启动时发现网络其实很快就起来了&#xff0c;但是mqtt和docker启动的很慢&#xff0c;导致相关依赖启动很慢。 问题分析 实际通过systemctl list-units发现systemd-networkd-wait-online启动失败 而且从字面上看也有延时…

数据结构和算法

数据结构和算法目录表 CCJava线性结构 1. 数组、单链表和双链表 2. Linux内核中双向链表的经典实现 数组、单链表和双链表 数组、单链表和双链表 栈 栈 栈 队列 队列 队列树形结构 二叉查找树 二叉查找树 二叉查找树 AVL树 AVL树 AVL树 伸展树 伸展树 伸展树 1. 红黑树(一)之…

图解TCP 三次握手和四次挥手的高频面试题(2023最新版)

大家好&#xff0c;最近重新整理了一版 TCP 三次握手和四次挥手的面试题&#xff08;2023最新版&#xff09;。 ----- 任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 巨巨巨巨长的提纲&#xff0c;发车&#xff01;发车&#xff01; img TCP 基本认识 TCP 头格式有哪些…

chrony服务器

目录 1.chrony简介 2.chrony安装配置 2.1 chrony安装及配置 非常重要&#xff1a;在配置之前&#xff0c;检查防火墙和selinux是否关闭 3.将chrony配置为其他主机的时间服务器 3.1 修改chrony配置文件 4.chronyc命令 1.chrony简介 chrony 是开源的遵循网络时间协议&…