redis并发、穿透、雪崩

Redis如何实现高并发

  • 首先是单线程模型:redis采用单线程可以避免多线程下切换和竞争的开销,提高cpu的利用率,如果是多核cpu,可以部署多个redis实例。
  • 基于内存的数据存储:redis将数据存储在内存中,相比于硬盘访问速度更快。
  • 优化数据结构:redis使用多种高效的数据结构,如哈希表、跳跃表等提高数据的操作效率。
  • 多路复用和非阻塞IO:多路复用允许一个线程同时监听多个客户端,而非阻塞IO允许发起IO请求后不会阻塞当前线程,而可以执行其他任务,提高了响应速度和利用率。

redis4.0及之前都是单线程模式,之后慢慢往多线程方向发展,这是为什么呢?

  • 4.0之前机器大多是单核的,故使用单线程,但随着互联网发展,机器都是多核,为了提高性能慢慢往多线程方向发展。
  • 其次,实践中出现的部分问题不好解决,比如删除一个大key ——hash表,就需要将里面的键值对全部删除,非常耗时,如果是单线程会出现卡顿,导致其他连接用户不能及时响应。

到了redis6/7版本网络处理请求是多线程(瓶颈),命令执行是单线程。

开启多线程

配置文件redis.conf设置

io-threads 数量     //设置线程核心数

io-threads-do-reads  yes //开启多线程


缓存穿透

缓存穿透是指请求的数据在缓存中和数据库中都不存在,每次请求访问数据库。

场景:

  • 查询不存在的数据:缓存无法存储,故每次从数据库查询;
  • 查询热门数据:数据被访问频繁,导致缓存系统无法处理,只能从数据库中访问;
  • 查询异常数据:数据服务异常缓存无法访问。

解决方法:维护一个布隆过滤器(判断一个元素是否可能在一个集合中)。


缓存击穿

是指一个查询的热点数据不存在缓存,每次都需要访问数据库。

场景:

  • 未缓存存储的热点数据
  • 热点数据过期

解决方法:查询数据库前判断缓存中是否有,若没用使用redis查询数据库,写入缓存。


缓存雪崩

指某一时间大量缓存数据集体失效,导致数据库的访问量加大,对数据库产生极大负荷。

场景:

  • 缓存服务器宕机:当服务器宕机或重启时,大量访问将命中数据库;
  • 数据过期时间设置不合理。
  • 促销商品:打折等促销活动将带来高频的数据访问。

解决方法:

  • 将缓存过期时间分散开,即为不同的数据设置不同的过期时间;
  • 使用多级缓存结构,通过增加缓存层数来提高数据的保存时间;

实际生产上如何禁止keys */flushdb/flushall等危险命令?

将相应命令设置成空字符串。

在redis.conf配置命令为空字符串

rename- command keys ""

命令含义:重命名指令keys为空字符串

实际遍历可以通过scan来进行

命令:scan 游标(从0开始) match 模糊匹配 count 数量

例子 :

从0开始匹配前缀为k的15条记录

返回第一行表示下一个游标,如果为0表示遍历完毕。

多大算大key

String为超过10KB。

而集合如List Hash等超过5000即为大key。

危害

造成内存不均,集群迁移困难。

删除等会造成阻塞。

查询

redis-cli --bigkeys : 发现其中的大key

memory usage 键:查询某个key的大小

如何删除

先将大key中数据进行删除,里面大致清空时直接delete该key

如何调优

将大key移除改为非阻塞

 双检加锁策略

当redis中无数据,而需要向mysql查询时,如何保证数据一致性?

策略:

  • 先在redis缓存查询是否存在,命中直接返回;
  • 未命中则加锁,再进行一次缓存查询(因为在多线程中可能上次加锁的线程已经将数据更新到缓存)
  • 若未查到,访问数据库,并更新缓存。

数据库和缓存一致性的策略

先删除缓存再更新数据库:

让下次访问时,将数据从数据库中写回到缓存。

缺陷:可能存在更新不及时,导致线程访问到旧的数据写会缓存,导致后面请求访问的都是旧数据。

先更新数据库再删除缓存:

让下次访问时,将数据从数据库中写回到缓存。

缺陷:可能删除不及时,导致部分访问读取缓存中的旧值。

感谢观看——

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

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

相关文章

wireshark抓取Chrome浏览器quic协议的明文包

wireshark版本:Version 4.2.5 (v4.2.5-0-g4aa814ac25a1). 1.chromium浏览器启用quic: chrome://flags/#enable-quic 2.windows添加环境变量 SSLKEYLOGFILED:\sslkeylogfile.log 3.配置wireshark,编辑->首选项->Protocls->TLS:(Pre)-…

MyBatis(30)如何在 MyBatis 中使用 XML 和注解混合配置方式

在MyBatis中,你可以灵活地选择XML配置方式、注解方式,或者将这两种方式混合使用来配置你的映射器(Mapper)。使用混合配置方式,你可以结合两者的优势,例如,利用XML配置复杂查询和动态SQL&#xf…

【测试】系统压力测试报告模板(Word原件)

系统压力测试,简而言之,是在模拟高负载、高并发的环境下,对系统进行全面测试的过程。它旨在评估系统在面对极端使用条件时的性能表现,包括处理能力、响应时间、资源消耗及稳定性等关键指标。通过压力测试,开发团队能够…

上海-LM科技(面经)

上海-LM科技 hr电话面 个人简介 个人信息的询问 是否知道芋道框架 技术面 算法题 14. 最长公共前缀(写出来即可) 聊一下Docker Docker核心概念总结Docker实战 聊一下AOP Spring AOP详解 聊一下JWT JWT 基础概念详解JWT 身份认证优缺点分析 Spring…

企业选择云WAF的安全性考量

简介 云WAF(Web Application Firewall)是一种基于云计算平台的安全服务,旨在保护Web应用免受网络攻击。它通过监控和过滤HTTP/HTTPS流量,检测和阻止潜在的威胁和恶意行为,确保Web应用程序的安全性和可靠性。 云WAF的优…

代码随想录——单调递增的数字(Leetcode738)

题目链接 贪心 class Solution {public int monotoneIncreasingDigits(int n) {char[] digits String.valueOf(n).toCharArray();int flag digits.length;for (int i digits.length - 1; i > 0; i--) {if (digits[i] < digits[i - 1]) {flag i;digits[i - 1]--;}}…

一起学Hugging Face Transformers(13)- 模型微调之自定义训练循环

文章目录 前言一、什么是训练循环1. 训练循环的关键步骤2. 示例3. 训练循环的重要性 二、使用 Hugging Face Transformers 库实现自定义训练循环1. 前期准备1&#xff09;安装依赖2&#xff09;导入必要的库 2. 加载数据和模型1&#xff09; 加载数据集2&#xff09; 加载预训练…

玉石风能否接棒黏土风?一探AI绘画新风尚

在数字艺术的浪潮中,AI绘画平台以其独特的创造力和便捷性,正在逐步改变我们对艺术的传统认知。从黏土风的温暖质感到琉璃玉石的细腻光泽,每一次风格的转变都引领着新的潮流。今天,我们将聚焦玉石风,探讨它是否能成为下一个流行的艺术滤镜,并提供一种在线体验的方式,让你…

Python | Leetcode Python题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:if len(matrix) 0 or len(matrix[0]) 0:return 0maxSide 0rows, columns len(matrix), len(matrix[0])dp [[0] * columns for _ in range(rows)]for i in…

使用Python实现深度学习模型:模型监控与性能优化

在深度学习模型的实际应用中,模型的性能监控与优化是确保其稳定性和高效性的关键步骤。本文将介绍如何使用Python实现深度学习模型的监控与性能优化,涵盖数据准备、模型训练、监控工具和优化策略等内容。 目录 引言模型监控概述性能优化概述实现步骤数据准备模型训练模型监控…

梧桐数据库:语法分析模块概述

语法分析模块是数据库系统的重要组成部分&#xff0c;它负责将用户输入的 SQL 语句转换为内部表示形式&#xff0c;以便后续的处理和执行。在数据库系统中&#xff0c;语法分析模块是连接用户与数据库的桥梁。它的主要任务是将用户输入的 SQL 语句进行解析&#xff0c;检查语法…

Kafka(一)基础介绍

一&#xff0c;Kafka集群 一个典型的 Kafka 体系架构包括若Producer、Broker、Consumer&#xff0c;以及一个ZooKeeper集群&#xff0c;如图所示。 ZooKeeper&#xff1a;Kafka负责集群元数据的管理、控制器的选举等操作的&#xff1b; Producer&#xff1a;将消息发送到Broker…

随着云计算和容器技术的广泛应用,如何在这些环境中有效地运用 Shell 进行自动化部署和管理?

在云计算和容器技术的环境中&#xff0c;Shell 脚本可以被用于自动化部署和管理任务。下面是一些在这些环境中有效使用 Shell 进行自动化部署和管理的方法&#xff1a; 在云环境中&#xff0c;使用云服务提供商的 API 进行自动化管理。例如&#xff0c;使用命令行工具或 SDK 来…

14 - Python网络应用开发

网络应用开发 发送电子邮件 在即时通信软件如此发达的今天&#xff0c;电子邮件仍然是互联网上使用最为广泛的应用之一&#xff0c;公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的&#xff0c;而…

[AI 大模型] OpenAI ChatGPT

文章目录 ChatGPT 简介ChatGPT 的模型架构ChatGPT的发展历史节点爆发元年AI伦理和安全 ChatGPT 新技术1. 技术进步2. 应用领域3. 代码示例4. 对话示例 ChatGPT 简介 ChatGPT 是由 OpenAI 开发的一个大型语言模型&#xff0c;基于GPT-4架构。它能够理解和生成自然语言文本&…

学习笔记——动态路由——OSPF(特殊区域)

十、OSPF特殊区域 1、技术背景 早期路由器靠CPU计算转发&#xff0c;由于硬件技术限制问题&#xff0c;因此资源不是特别充足&#xff0c;因此是要节省资源使用&#xff0c;规划是非常必要的。 OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不…

电脑会议录音转文字工具哪个好?5个转文字工具简化工作流程

在如今忙碌的生活中&#xff0c;我们常常需要记录和回顾重要的对话和讨论。手写笔记可能跟不上速度&#xff0c;而录音则以其便捷性成为了捕捉信息的有力工具。但录音文件的后续处理&#xff0c;往往让人头疼不已。想象一下&#xff0c;如果能够瞬间将这些声音转化为文字&#…

spring-16

Spring 对 DAO 的支持 Spring 对 DAO 的支持是通过 Spring 框架的 JDBC 模块实现的&#xff0c;它提供了一系列的工具和类来简化数据访问对象&#xff08;DAO&#xff09;的开发和管理。 首先&#xff0c;我们需要在 Spring 配置文件中配置数据源和事务管理器&#xff1a; &l…

Java笔试|面试 —— 子类对象实例化全过程 (熟悉)

子类对象实例化全过程 (熟悉) &#xff08;1&#xff09;从结果的角度来看&#xff1a;体现为继承性 当创建子类对象后&#xff0c;子类对象就获取了其父类中声明的所有的属性和方法&#xff0c;在权限允许的情况下&#xff0c;可以直接调用。 &#xff08;2&#xff09;从过…

iptables实现端口转发ssh

iptables实现端口转发 实现使用防火墙9898端口访问内网front主机的22端口&#xff08;ssh连接&#xff09; 1. 防火墙配置(lb01) # 配置iptables # 这条命令的作用是将所有目的地为192.168.100.155且目标端口为19898的TCP数据包的目标IP地址改为10.0.0.148&#xff0c;并将目标…