Redis主要问题(缓存问题)

devtools/2024/9/19 21:49:34/ 标签: redis, 数据库, 缓存, 个人开发, 学习

Redis

Redis主要面向缓存、分布式锁、消息队列等问题。

而在缓存中常存在穿透、击穿、雪崩、双写一致、持久化、数据过期、数据淘汰等问题。

1.缓存穿透

通过get请求查询redisredis响应查数据库,正常情况下,若查询到数据,则正常返回数据值,get请求结束。
缓存击穿,则是当数据库中,并不存在get请求所需要查询的值,使得redis反复查询数据库。若存在恶意攻击,反复请求数据库数据库并发量有限,则会击垮数据库使其宕机。

一般解决方法,查询结果为空时,把空结果(null)进行缓存。但是消耗内存,不是最优解。

其他解决办法为布隆过滤器(站在布隆后面…),在redis之前设置一个布隆过滤器,存储预热数据。利用位图检索数据是否存储在一个集合中。但存在数组太大时,存在误判问题,需设置误判率。(5%以内)。

2.缓存击穿

通俗点来讲,就是当地有一家卖的很好的早餐店,吗喽们每天都会来买早餐,然后有一天这家店铺租约到期了,搬走了,但恰好这个时间点大家都来买早餐,就造成买不到早餐都站在店铺面前,给店铺挤爆了。

也就是说,正常通过redis查数据,但是key过期了,从redis中查不到数据,最后大量请求输送给数据库,导致数据库吃不下,爆了。

解决方法就是互斥锁、逻辑过期
互斥锁无非就是等待其他线程完成数据提取任务以后,再继续进行。(就像早餐铺子,你排队买早餐,你得等你前面的人买完了,你才能买)。(强一致、性能不好)
而逻辑过期,就像是你去买早餐,发现了早餐到期了、不见了,然后你另辟蹊径,去另一家早餐店买相同的早餐。(过期时间的设置)可用性较好。

3.缓存雪崩

雪崩,顾名思义,大范围的崩了。那就是大量的key过期了,或者redis直接G了,导致大量的请求直接面向数据库,给数据库压垮了。

解决方法,使得过期时间随机,避免大量的key同时过期。或是启动集群,利用哨兵模式,使得主从结点自动替换。

4.双写一致

数据库redis的数据进行同步。也就是数据库的数据变了,缓存里面的也要跟着变,保证数据的一致性。
数据的删除修改时,会导致脏数据。

读写时添加互斥锁,能解决一些不一致的问题。(或是共享锁(锁住,只准你读)、排它锁(当前执行,阻塞其他线程的读写操作))。

5.持久化

一般情况下使用数据备份文件or数据快照 RDB (Redis Database Backup file),将缓存的数据记录到磁盘中,若Redis出现故障、重启等问题是,可以从磁盘读取文件恢复数据,避免数据丢失。

AOF(Append Only File)追加文件。也就是redis每写入一个命令都会记录下来,像日志文件。文件很大。

6.数据过期

惰性删除:key自动过期以后,不会立即删除,只会在再次利用这个key时,判断过期以后删除掉。(内存占用问题)
定期删除:定期对一定数量的key进行检查,发现过期就干掉。分为(slow不超过25ms、fast不低于2ms 模式)

7.数据淘汰

内存满了怎么办?缓存不是无穷大的
那么就需要合理的对redis内的数据进行合理的淘汰。
一般的方法,要么就是写死,满了就不让写进去了(noeviction),没用幸存者,全部干掉。
要么对全体key随机淘汰一部分(allkeys-random)
要么就是,通过判断key的过期时间,快要过期的就先干掉(volatile-ttl),或是对设置了过期时间的key随机淘汰(volatile-random)
或是对全体key or 使用了过期使用的key 根据使用次数,使用少的淘汰(LRU)
或是基于使用频率,使用越少的优先淘汰。


http://www.ppmy.cn/devtools/113065.html

相关文章

anaconda安装manim

anaconda安装manim (安装时间2024年9月15日,后续版本变化再做更新) 创建环境test 等一下我们创建一个manim项目作为试水 切换到test环境 {:height 430, :width 780} 输入以下代码 # using conda or mamba conda create -n my-manim-envi…

【C++11 —— 线程库】

C11 —— 线程库 thread类介绍线程函数参数原子性操作库(atomic)lock_guard与unique_lockmutex的种类lock_guardunique_lock 两个线程交替打印奇偶数 thread类介绍 在C11之前,涉及到多线程的问题,都是和平台相关的,比如windows和Linux下各有…

利用LlamaIndex构建ARG本地知识库

文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式,以及启用流式响应 在现代的人工智能应…

【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑

目录 🍸前言 🍻一、台式电脑基本组成 🍺二、组装 🍹三、安装系统 👋四、系统设置 👀五、章末 🍸前言 小伙伴们大家好,上篇文章分享了在平时开发的时候遇到的一种项目整合情况&…

通信工程学习:什么是HFC混合光纤同轴电缆

HFC:混合光纤同轴电缆 HFC(Hybrid Fiber Coaxial)混合光纤同轴电缆是一种结合了光纤与同轴电缆的宽带接入网技术。以下是对HFC混合光纤同轴电缆的详细解释: 一、HFC混合光纤同轴电缆的定义与概述 定义:HFC是一种结合光…

windows系统docker装milvus向量数据库

首先创建一个文件夹比如milvus,在创建如下文件 docker-compose.yml文件如下: version: 3.5services:etcd:container_name: milvus-etcdimage: quay.io/coreos/etcd:v3.5.5environment:- ETCD_AUTO_COMPACTION_MODErevision- ETCD_AUTO_COMPACTION_RETENTION1000- ETCD_QUOTA_B…

2024.9.11(k8s环境搭建)

一、k8s环境搭建 编号主机名称ip配置1k8s-master192.168.8.1772k8s-node1192.168.8.1783k8s-node2192.168.8.168 1、免密登录 [rootk8s-master ~]# ssh-keygen [rootk8s-master ~]# ssh-copy-id root192.168.8.178 [rootk8s-master ~]# ssh-copy-id root192.168.8.168 2、3台…

解决:Vue3 - defineProps 设置默认值报错问题

目录 1&#xff0c;问题2&#xff0c;分析2.1&#xff0c;按报错提示信息测试2.2&#xff0c;测试 vue-i18n 3&#xff0c;解决 1&#xff0c;问题 使用 defineProps 指定默认值时报错&#xff0c;代码如下&#xff1a; <template><input type"text" :pla…

数据结构(Day13)

一、学习内容 内存空间划分 1、一个进程启动后&#xff0c;计算机会给该进程分配4G的虚拟内存 2、其中0G-3G是用户空间【程序员写代码操作部分】【应用层】 3、3G-4G是内核空间【与底层驱动有关】 4、所有进程共享3G-4G的内核空间&#xff0c;每个进程独立拥有0G-3G的用户空间 …

React项目中使用发布订阅模式

React项目中使用发布订阅模式 1.创建发布订阅器2.在组件中使用发布订阅器3. 订阅数据 发布订阅模式&#xff08;也称观察者模式&#xff09;是一种管理跨组件通信的有效方式&#xff0c;尤其是在不希望直接依赖于特定组件的情况下。这种模式允许一个对象&#xff08;发布者&…

SAP B1 学习笔记 - 易混淆字段名(持续更新中)

背景 在 SAP B1 的单据中&#xff0c;由于同一单据时常对应着多个后台表单&#xff0c;且后台表单内包含的字段信息往往远大于单据显示出来的&#xff0c;在配置时经常出现多个字段混淆、无系统信息提示字段名模糊的情况&#xff0c;这里总结常见的易混淆难查找的后台字段名。…

Linux whereis和which的区别

功能概述 whereis命令 whereis主要用于查找二进制文件、源代码文件和手册页文件的位置。它会在特定的目录列表中查找&#xff0c;这些目录包括二进制文件目录&#xff08;如/bin、/sbin、/usr/bin、/usr/sbin等&#xff09;、源代码目录&#xff08;如/usr/src&#xff09;和手…

C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&…

Taro + Vue 的 CSS Module 解决方案

一、开启模块化配置 Taro 中内置了 CSS Modules 的支持&#xff0c;但默认是关闭的。如果需要开启使用&#xff0c;请先在编译配置中添加如下配置&#xff1a; weapp: {module: {postcss: {// css modules 功能开关与相关配置cssModules: {enable: true, // 默认为 false&…

【C++知识扫盲】------初识命名空间

在 C 中&#xff0c;using namespace std; 和 std:: 都与命名空间的使用相关。命名空间是为了防止不同库或模块中的同名符号&#xff08;函数、变量等&#xff09;发生冲突的机制。 1. std:: std:: 是用于访问 C 标准库中定义符号的前缀。std 代表标准&#xff08;standard&a…

AI创意引擎:优化Prompt提示词的高效提问技巧

AI内容创作的精髓&#xff1a;提示词&#xff08;Prompt&#xff09; 在AI领域中&#xff0c;提示词&#xff08;Prompt&#xff09;是与模型沟通的关键工具。提示词不仅决定了AI生成内容的方向和质量&#xff0c;还在优化模型输出、提升用户体验中扮演着至关重要的角色。因此…

HTTPS和HTTP区别是什么?

HTTP和HTTPS是两种协议&#xff0c;分别是HyperText Transfer Protocol和HyperText Transfer Protocol Secure。 HTTPS还经常被称为HTTP over SSL或者HTTP over TSL&#xff0c;HTTPS经由HTTP进行通信&#xff0c;但利用SSL/TLS来加密数据包。 他们的区别主要由以下几个方面&…

Git常用指令整理【新手入门级】【by慕羽】

Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪和管理源代码的更改。它允许多名开发者协作&#xff0c;同时提供了强大的功能来管理项目的历史记录和不同版本。本文主要记录和整理&#xff0c;个人理解的Git相关的一些指令和用法 文章目录 一、git安装 & 创建git仓…

如何用Appium实现移动端UI自动化测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用App…

计算机毕业设计:Java体育成绩管理系统开题报告+源代码效果图

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…