当前位置: 首页 > news >正文

深入Redis:核心的缓存

Redis最主要的用途,主要有三个方面:存储数据、缓存、消息队列。

其中,缓存是Redis最常用的场景。Redis使用内存作为硬盘的缓存。把用户集中访问的20%数据放到缓存中去,可以应对80%的请求。

数据库是非常重要的组件,但是mysql的速度又比较慢,所以我们用Redis来作为mysql的缓存。

为什么说关系型数据库性能不高?

  1. 数据库把数据存储在硬盘上,硬盘的IO速度并不快。尤其是随机访问。
  2. 如果查询不能命中索引,就需要进行表的遍历,这就会大大增加硬盘IO次数。
  3. 关系型数据库对于SQL的执行会做一系列的解析,校验,优化工作。
  4. 如果是一些复杂查询,比如联合查询,需要进行笛卡尔积操作,效率更是降低很多。

对于mysql来说,服务器每处理一个请求,都要消耗一些硬件资源,任意一种资源的消耗超过了机器提供的性能上线,机器就很容易出故障。引入缓存就能够把大量查询的操作放到内存中去,又快又不用读写硬盘,资源消耗就少了。

更新策略

定期生成

Redis会把访问的数据,以日志的形式记录下来,比如搜索引擎中的“查询词”就是访问的数据。通过统计这些词出现的频率,取出前20%的词,这些词就可以认为是“热点词”。这些热点词就可以拿出来放到Redis中作为缓存。

实时生成

如果在Redis中查到了,就直接返回;如果Redis中不存在,就从数据库查,把查到的结果同时也写入Redis。

这样经过一段时间的“动态平衡”,redis中的key就逐渐都成为了热点数据了。

但是这种方式会让redis中的内存越占越多,直到达到上限。为了解决这种问题,Redis就引入了“内存淘汰策略”。

Redis 提供了多种内存淘汰策略,可以在配置文件中设置 maxmemory-policy 配置项来指定使用哪种策略。以下是 Redis 支持的内存淘汰策略:

  1. noeviction: 不淘汰任何数据,当内存使用达到限制时,所有写入操作(包括写入命令和有写入副作用的命令,如 DEL 和 EXPIRE)都会返回错误。

  2. allkeys-lru: 从所有键中挑选最近最少使用的键淘汰。

  3. volatile-lru: 从设置了过期时间的键中挑选最近最少使用的键淘汰。

  4. allkeys-random: 从所有键中随机挑选键淘汰。

  5. volatile-random: 从设置了过期时间的键中随机挑选键淘汰。

  6. volatile-ttl: 从设置了过期时间的键中挑选将要过期的键淘汰。

  7. stable: 从所有键中挑选“近似”最少使用的键淘汰。

  8. volatile-lfu: 从设置了过期时间的键中挑选使用频率最低的键淘汰。

  9. allkeys-lfu: 从所有键中挑选使用频率最低的键淘汰

缓存预热

缓存预热(Cache preheating),是针对于缓存实时生成的情况。

Redis服务器首次接入之后,服务器里面是没有数据的。此时所有的请求都会发给mysql,短时间内mysql的压力很大,一段时间之后redis上的数据才会渐渐多起来,mysql的压力才会下去。

缓存预热就是用来解决上述问题的,通过把定期生成和实时生成结合一下,先通过离线的方式,通过一些统计的途径,先把热点数据找到一批,导入到redis中,此时导入这些的这批热点数据就能够帮mysql承担很大的压力了。随着时间的推移就能够使用新的热点数据淘汰掉旧的数据。

缓存穿透

查询的某个key,在redis中没有,mysql中也没有,这个key肯定也不会被更新到redis中。反复查询都没有,但是会给mysql带来很大的压力。

  • 业务设计不合理,比如缺少必要的参数校验环节,导致非法的key被反复查询
  • 开发、运维误操作,把某个key从数据库上删除了
  • 黑客恶意攻击

解决办法:

  • 如果发现某个key在redis和mysql都不存在,仍然把这个值写入到redis中,value设成一个非法的值,如 " "  
  • 引入布隆过滤器,每次查询redis/mysql之前都先判定一下key是否在布隆过滤器上

缓存血崩

在短时间内,redis上大规模的key失效,导致缓存命中率陡然下降,并且mysql的压力迅速上升,甚至直接宕机。

  • redis大量节点宕机
  • 之前同时设置的key,过期时间是相同的

可以考虑给redis设置过期时间的时候,添加一些随机的因子,避免同一时刻过期。

缓存击穿

相当于缓存血崩的特殊情况,针对热点key,突然过期了,导致大量的请求直接访问到数据库上,甚至引起数据库宕机。

解决办法:

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

相关文章:

深入Redis:核心的缓存

Redis最主要的用途,主要有三个方面:存储数据、缓存、消息队列。 其中,缓存是Redis最常用的场景。Redis使用内存作为硬盘的缓存。把用户集中访问的20%数据放到缓存中去,可以应对80%的请求。 数据库是非常重要的组件,但…...

集群聊天服务器项目【C++】项目介绍和环境搭建

前言:学习一个基于C集群聊天服务器的项目,记录学习的内容和学习的过程。 1.项目介绍 在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册、用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。 2.技术栈 Json序列…...

c++ #include <memory> 智能指针介绍

#include <memory> 是 C 标准库中的头文件&#xff0c;用于支持智能指针的功能。智能指针是现代 C 的一种资源管理工具&#xff0c;用于自动管理动态分配的内存&#xff0c;从而减少内存泄漏和悬挂指针等问题的发生。它提供了多种类型的智能指针&#xff0c;包括 std::un…...

32.递归、搜索、回溯之floodfill算法

0.简介 1.图像渲染 . - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {int[] dx { 0, 0, 1, -1 };int[] dy { 1, -1, 0, 0 };int m, n;int prev;public int[][] floodFill(int[][] image, int sr, int sc, int color) {if (image[sr][sc]…...

Vue3.5+ 响应式 Props 解构

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 在 Vue 3.5 中&#xff0c;响应式 Props 解构已经稳定并默认启用。这意味着在 <script setup> 中从 defineProps 调用解构的变量现在是响应式的。这一改进大大简化了声明带有默认值的 props 的方…...

k8s中的认证授权

目录 一、kubernetes API 访问控制 1.1 UserAccount与ServiceAccount 1.1.1 ServiceAccount 1.1.2 ServiceAccount示例 二、认证(在k8s中建立认证用户) 2.1 创建UserAccount 2.2 RBAC&#xff08;Role Based Access Control&#xff09; 2.2.1 基于角色访问控制授权&…...

Leetcode 3291. Minimum Number of Valid Strings to Form Target I

Leetcode 3291. Minimum Number of Valid Strings to Form Target I 1. 解题思路2. 代码实现 题目链接&#xff1a;3291. Minimum Number of Valid Strings to Form Target I 1. 解题思路 这一题第一反应就是用一个字典树动态规划的方式&#xff0c;倒是也搞定了&#xff0c…...

PostgreSQL的查看主从同步状态

PostgreSQL的查看主从同步状态 PostgreSQL 提供了一些系统视图和函数&#xff0c;查看和监控主从同步的状态。 1 在主节点上查看同步状态 pg_stat_replication 视图 在主节点上&#xff0c;可以通过查询 pg_stat_replication 视图来查看复制的详细状态信息&#xff0c;包括…...

Java多态性的理解

方法的覆盖 子类的方法重写了父类的方法&#xff0c;相当于对原来的方法进行了增强&#xff0c;接口就是这样的思想。 属性的隔离&#xff08;Java中什么情况下都不会属性覆盖&#xff0c;python可能会覆盖&#xff09; public class Main {public static void main(String[…...

安全工具 | 使用Burp Suite的10个小tips

Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具&#xff0c;用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多&#xff0c;您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…...

企业项目中字符串工具类

此工具类暂时包含如下功能&#xff1a; isEmpty()判断字符串是否为空subSpecifiedString()判断字符串是否超出指定长度&#xff0c;超出则截取到指定长度yearMonthToDate()将年月的字符串转成年月日格式 yearMonthToDateTime()将年月的字符串转成年月日时分秒格式 package co…...

下载github patch到本地

以下是几种从 GitHub 上下载以.patch 结尾的补丁文件的方法&#xff1a; 通过浏览器直接下载 打开包含该.patch 文件的 GitHub 仓库。在仓库的文件列表中找到对应的.patch 文件。点击该文件&#xff0c;浏览器会显示文件的内容&#xff0c;在页面的右上角通常会有一个“Raw”…...

C++基础部分代码

C OOP面对对象 this指针 C:各种各样的函数定义 struct C&#xff1a;类》实体的抽象类型 实体(属性&#xff0c;行为)-》ADT&#xff08;abstract data type) OOP语言的四大特征是什么&#xff1f; 抽象 封装/隐藏 继承 多态 访问限定符&#xff1a;public公有的 private私有的…...

neo4j(spring) 使用示例

文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j&#xff1a;neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…...

链接升级:Element UI <el-link> 的应用

链接升级&#xff1a;Element UI 的应用 一 . 创建文字链接1.1 注册路由1.2 创建文字链接 二 . 文字链接的属性2.1 文字链接的颜色2.2 是否显示下划线2.3 是否禁用状态2.4 填写跳转地址2.5 加入图标 在本篇文章中&#xff0c;我们将深入探索Element UI中的<el-link>组件—…...

简单题26 - 删除有序数组中的重复项(Java)20240917

问题描述&#xff1a; java代码&#xff1a; class Solution {public int removeDuplicates(int[] nums) {if (nums.length 0) return 0; // 处理空数组情况int i 0; // 指向新数组中的最后一个不重复元素for (int j 1; j < nums.length; j) {if (nums[j] ! nums[i]) { …...

DFS:深搜+回溯+剪枝实战解决OJ问题

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 排列、子集问题 1.1 全排列I 1.2 子集I 1.3 找出所有子集的异或总和 1.4 全排列II 1.5 字母大小写全排列 1.6 优美的排列 二 组合问题 2.1 电话号码的数字组合 …...

命令语境中的“可以”的字词含义分析

摘要 在语言交流中&#xff0c;词汇的使用经常受到语境的影响。本文探讨了“可以”一词在上司与下属之间的互动中所表达的命令含义。通过分析语料和实例&#xff0c;发现“可以”在某些情况下并不传达许可的含义&#xff0c;而是被用作一种隐性命令。本文讨论了这一现象的成因…...

直播相关03-录制麦克风声音, ffmpeg 命名,使用命令行完成录音

一 ffmpeg 命令 ffmpeg arg1 arg2 -i arg3 arg4 arg5ffmpeg 全局参数 输入文件参数 -i 输入文件 输出文件参数 输出文件arg1&#xff1a;全局参数 arg2&#xff1a;输入文件参数 arg3&#xff1a;输入文件 arg4&#xff1a;输出文件参数 arg5&#xff1a;输出文件 二 ffprobe …...

VUE3中ref与reactive

ref&#xff1a;支持所有类型reactive&#xff1a;只支持引用类型(Obj&#xff0c;Array...)两者都是实现数据视图响应式 JS逻辑使用中 ref&#xff1a;需要使用.value reactive&#xff1a;不需要使用.value <el-button click"handle()" type"primary"…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...