redis做缓存(cache)

news2024/12/22 18:37:46

什么是缓存

缓存(Cache)的核心思路就是把一些常用的数据放到访问速度更快的地方,方便获取。
关于硬件的访问速度来说

CPU寄存器>内存>硬盘>网络

因此常见使用内存作为硬盘的缓存,例如redis。使用硬盘作为网络的缓存,例如浏览器通过http/https从服务器上获取到数据(html,css,js,图片,视频,音频,文字)像这种体积大,又不太会改变的数据,就可以保存到浏览器本地,后续在打开该网页,就不必重新从网络获取上述数据了。
根据“二八原则”,20%的热点数据,能够应对80%的访问场景。因此只需要把这些少量的热点数据缓存起来,就可以应对大多数的场景,从而在整体上有明显的性能提升。

使用redis作为缓存

在网站开发中,我们经常使用mysql来存储数据。mysql虽然功能强大,但是有一个致命的缺点,就是性能不高(进行一次查询操作要消耗很多系统硬件资源)。
:::info
为什么关系型数据库性能不高?

  1. 硬件原因
    1. 数据库把数据存储在硬盘上,硬盘的IO速度不快,尤其是随机访问
    2. 如果查询不能命中索引,就需要进行表的遍历,这就会增加磁盘IO次数
  2. 软件原因
    1. 关系型数据库对于sql的执行会做一系列解析,校验,优化工作
    2. 对于复杂查询,比如联合查询,需要进行笛卡尔积,效率很低
      :::
      因此,如果访问数据库的并发量很高,对于数据库的压力就很大,容易使数据库宕机。
      :::success
      为什么并发量高了就会宕机?
      服务器每次处理一个请求,就需要消耗一定的硬件资源,例如cpu,内存,硬盘,网络带宽。
      而一个服务器的资源是有限的,一个请求消耗一份资源,当把资源耗尽,后续请求就没有资源可用,就无法正确处理,更严重的还会导致服务器程序的代码崩溃。
      :::
      如何让数据库能够承担更大的并发量?
  • 开源:引入更多机器,部署更多数据库,构成数据库集群(主从复制,分库分表)
  • 节流:引入缓存,使用其他方式保存经常访问的热点数据,从而降低直接访问数据库的请求数量

实际开发中两种方案搭配使用

image.png

缓存更新策略

缓存更新策略

定期生成

访问的数据会以日志的形式记录下来,我们可以写个程序(如python,shell脚本代码),针对这些日志进行统计,统计这一天/周/月,每个词出现的频率,在根据频率降序排序,取出前20%的词,就是“热点词”。将这些“热点词”放大redis中

实时生成

如果在redis中查到,就直接返回;如果redis中不存在,就从数据库查,把查到的结果同时写到redis中。经过一段时间“动态平衡”,redis中的key就逐渐变成热点数据了。

内存淘汰机制

不停的写入redis,就会使redis的内存占用越来越多,当达到内存上限,就会触发redis的“内存淘汰机制”。

  1. FIFO(first in first out)先进先出:把缓存中存在时间最久的(先来的数据)淘汰掉
  2. LRU(least recently used)淘汰最久未使用:记录每个key的最近访问时间,把最近访问时间最老的key淘汰掉
  3. LFU(least frequently used)淘汰访问次数最少的:记录每个key最近一段时间的访问次数,把访问次数最少的淘汰掉
  4. Random随机淘汰:随机抽取key删除掉

redis配置文件中内置的淘汰策略

  • volatile-lru 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中使⽤LRU算法(最近最少使⽤)进⾏淘汰
  • allkeys-lru 当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LRU算法(最近最少使⽤)进 ⾏淘汰.
  • volatile-lfu4.0版本新增,当内存不⾜以容纳新写⼊数据时,在过设置了过期时间的key中,使⽤LFU算法 进⾏删除key.
  • allkeys-lfu 4.0版本新增,当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LFU算法进⾏淘汰
  • volatile-random 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中,随机淘汰数 据.
  • allkeys-random 当内存不⾜以容纳新写⼊数据时,从所有key中随机淘汰数据
  • volatile-ttl 在设置了过期时间的key中,根据过期时间进⾏淘汰,越早过期的优先被淘汰. (相当于 FIFO, 只不过是局限于过期的 key)
  • noeviction 默认策略,当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错

缓存常见问题

缓存预热

缓存更新中,有定期更新,不需要预热;定期更新,需要预热。
在redis服务器首次接入的时候,服务器中没有数据。此时所有请求都会打给mysql,随着时间推移,redis上的数据越积累越多,mysql承担的压力逐渐变小。但就怕刚开始mysql就垮了,因此需要进行缓存预热(将定期生成和实时生成结合),先通过离线的方式,通过一些统计的途径,先把热点数据找到一批,导入到redis中,此时导入的这批热点数据,就能帮mysql承担很大的压力,随着时间推移,逐渐使用新的热点数据淘汰掉旧的数据。

缓存穿透(cache penetration)

查询某个key时,redis中没有,mysql中也没有。这次查询没有,下次查询还是没有,如果像这样的数据非常多,并且还反复查询,就会给mysql带来很大压力。
出现的可能原因

  1. 业务设计不合理,例如缺少必要的参数校验环节,导致非法的key也被进行查询
  2. 开发/运维误操作,不小心将部分数据从数据库上误删除
  3. 黑客攻击

解决方案

  1. 改进业务/加强监控报警(亡羊补牢)
  2. 如果发现这个key在redis和mysql中都不存在,仍然写入redis,value设成一个非法值如“”
  3. 引入布隆过滤器,每次查询redis/mysql之前都先判定key是否在布隆过滤器上存在。

布隆过滤器:结合了hash+bitmap,以比较小的空间,比较快的时间速度,实现对key是否存在的判定

缓存雪崩(cache avalanche)

短时间内,redis上大规模的key失效,导致缓存命中率陡降,并且mysql压力迅速上升,甚至导致宕机。
出现的可能原因

  1. redis挂了,redis宕机/redis集群模式下大量节点宕机
  2. redis正常,但是之前短时间内设置了很多key给redis,并且设置的过期时间正好相同

解决方案

  1. 加强监控报警,加强redis集群可用性的保证
  2. 不给key设置过期时间/设置过期时间的时候添加随机因子,避免同一时刻过期

缓存击穿(cache breakdown)

缓存雪崩的特殊情况,针对热点key突然过期,导致大量请求直接打到mysql上,甚至引起数据库宕机。
解决方案

  1. 基于统计方式发现热点key,并设置永不过期
  2. 进行必要的服务降级,例如访问数据库的时候使用分布式锁,限制同时请求的数据库的并发数

服务降级:本身服务器有十个功能,特定情况下,适当关闭一些不重要的功能,只保留核心功能(省点模式)

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

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

相关文章

2023-9-25 货仓选址

题目链接&#xff1a;货仓选址 #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n; int a[N];int main() {cin >> n;for(int i 0; i < n; i ) cin >> a[i];sort(a, a n);int res 0;for(int i 0; i < …

生产管理看板系统助力高压线束生产车间实现生产任务的可视化管理

随着企业对生产智能化的追求不断提升&#xff0c;生产现场设备联网进行数据采集成为实现生产智能化的第一步&#xff0c;也是打造并实现数字化工厂最基础的一步。在这个过程中&#xff0c;生产管理看板系统发挥着重要的作用&#xff0c;能够实时在线统计车间工业生产设备的运行…

删除链表的倒数第N个节点-双指针法

【题目描述】 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 【示例】 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 输入&#xff1a;head [1,2], n …

CHAPTER 11: DESIGN A NEWS FEED SYSTEM

Step 1 - Understand the problem and establish design scope Candidate: Is this a mobile app? Or a web app? Or both? Interviewer: Both Candidate: What are the important features? Interview: A user can publish a post and see her friends’ posts on the ne…

《红警3》因计算机中丢失d3dx9_35.dll无法打开游戏怎么办?最新解决方法推荐

d3dx9_35.dll 是 DirectX 9.0c 的一部分&#xff0c;它是一个动态链接库 (DLL)&#xff0c;包含了许多用于支持 DirectX 9.0c 功能的函数和类。DirectX 是一种由微软开发的游戏和多媒体应用程序编程接口&#xff0c;它提供了许多功能&#xff0c;如 3D 图形、音频、输入等&…

电子器件系列55:lm339比较器

以这个比较器为例 电压比较器可以看作是放大倍数接近“无穷大”的运算放大器。 电压比较器的功能&#xff1a;比较两个电压的大小(用输出电压的高或低电平&#xff0c;表示两个输入电压的大小关系)&#xff1a; 当””输入端电压高于”&#xff0d;”输入端时&#xff0c;电压…

阿里巴巴中国站获得1688商品详情 API 返回值说明

1688商品详情API接口可以获得1688商品详情原数据。 这个API接口有两种参数&#xff0c;公共参数和请求参数。 公共参数有以下几个&#xff1a; apikey&#xff1a;这是您自己的API密钥&#xff0c;可以在1688开发者中心获取。 请求参数有以下几个&#xff1a; num_iid&…

115V/400Hz 中频交流航空电源系统测试负载箱

中频交流航空电源系统测试负载箱主要面向战斗机、教练机以及民航飞机的生产及使用单位&#xff0c;用于对航空电源系统&#xff08;28V低压直流电源系统、270V/540V高压电源系统和115V/230V三相400HZ交流电源系统&#xff09;进行维护测试、功能性验证、可靠性负载试验。 系统加…

uni-app:实现图片周围的图片按照圆进行展示

效果 代码 <template><view class"position"><view class"circle"><img src"/static/item1.png" class"center-image"><view v-for"(item, index) in itemList" :key"index" class&q…

通俗讲解MobileNet-v1/v2/v3网络

MobileNet网络是由google团队在2017年提出的&#xff0c;专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络&#xff0c;在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%&#xff0c;但模型参数只有VGG的1/32)。MobileNet网络…

智慧电力平台打造无人值守配电房、变电所

随着科技的发展&#xff0c;电力行业也在不断进步。为了提高电力供应的可靠性和效率&#xff0c;智慧电力平台应运而生。通过智慧电力平台&#xff0c;打造无人值守配电房和变电所成为行业趋势。 一、无人值守配电房和变电所的概念 无人值守配电房和变电所是指通过数字化、…

夜莺启动时报dialector() not supported

sudo nohup /opt/n9e/n9e &>> /opt/n9e/n9e.log &启动的时候&#xff0c;ss -tlnp|grep 17000查看一下监控端口状态&#xff0c;发现提示的信息是[1] Exit 1 sudo nohup /opt/n9e/n9e &>> /opt/n9e/n9e.log&#xff0c;这表明没有正常启动。 原来以为…

linux系统中通过docker安装python包

前提 已经安装docker 已经安装python,python镜像是jetz_python3.7.13 1、将需要安装的python包都写入txt文件中 2、拷贝文件 (1)、通过已安装的python包找到python安装路径 首次安装镜像后,容器启动,进入容器中 docker run -it --name py37 jetz_python3.7.13 /bin/ba…

C语言连接MySQL并执行SQL语句(hello world)

1.新建一个控制台项目 参考【VS2022 和 VS2010 C语言控制台输出 Hello World】VS2022 和 VS2010 C语言控制台输出 Hello World_vs2022源文件在哪_西晋的no1的博客-CSDN博客 2.安装MySQL 参考【MySQL 8.0.34安装教程】MySQL 8.0.34安装教程_西晋的no1的博客-CSDN博客 3.复制MySQ…

【2-SAT】【前缀和优化建图】【ICPC网络赛第二场】C. Covering

题目 思路 对于限制2&#xff0c;可以发现&#xff0c;如果 i i i 不选&#xff0c;那么 i − 1 i-1 i−1 和 i 1 i1 i1 就一定要选&#xff0c;2-SAT可以很好地解决 对于限制1&#xff0c;其实就是把 i i i 分成了若干个集合&#xff0c;每个集合只能选1个点。但如果用…

2、SpringBoot_依赖介绍

三、SpringBoot介绍 1.parent 前言&#xff1a;之前是使用spring/springmvc 开发&#xff0c;整合不同的组件会有很多依赖&#xff0c;这些依赖会涉及到很多的版本信息&#xff0c;版本信息多了之后可能会导致版本冲突问题概述&#xff1a;把很多组件技术的搭配放到一起&…

ruoyi-vue项目的打包、与运行

ruoyi-vue项目的打包、与运行 打包打包后文件&#xff0c;及其运行 打包 打包后文件&#xff0c;及其运行 注意&#xff1a;要&#xff08;带配置&#xff09;打开redis redis-server.exe redis.windows.conf

细胞机器人系统的概念

摘要 本文讨论了一种新型机器人系统的理论和工程的概念基础。该系统由协作完成任务的自主机器人单元组成。本文在描述了该系统与细胞自动机和神经网络的相关性和差异后&#xff0c;建立了该系统的基础属性及其对机器人单元结构的影响、它们操作的空间以及它们完成全局任务的算法…

SPA项目的登录注册实现,post/get请求以及跨域问题

目录 前言 一. 登录&#xff0c;注册静态页面 1.1 ElementUI简介 1.2 基于SPA项目完成登录 1.2.1 在SPA项目中添加elementui依赖 1.2.2 在main.js中添加elementui模块 1.2.3 在src目录下创建views目录&#xff0c;用于存放vue组件 1.2.4 配置路由 1.2.5 修改项目端口并启…

企业如何实现设备管理数字化?企业有什么办法做到降本增效?

随着时代的发展&#xff0c;科学技术的进步以及自动化水平的不断提高&#xff0c;设备的维护保养成为日常工作中不可或缺的事项。但是&#xff0c;许多工作人员对于设备操作和保养规程的不熟悉&#xff0c;导致误操作、保养不到位或不能及时发现设备故障隐患等情况的大量出现。…