Redis 常见问题

什么是Reids

Redis是一个使用C语言写的开源的高性能key-value非关系型数据库. 

Redis中包含string, list ,set, zset, hash 等数据类型. 

Redis的数据都基于缓存的, 每秒可以处理10万次读写, 是已知最快的key-value 数据库. 

Redis可以实现写入磁盘, 保证数据安全.  

Redis的操作是原子性的. 

Redis为什么快

  1. 完全基于内存. 
  2. 数据结构简单
  3. 采用单线程, 避免了不必要的上下文切换和竞争条件. 
  4. 使用多路I/O复用模型, 非阻塞IO
  5. 底层通信协议不同. 

Redis的持久化机制是什么

Reids提供了2中持久化机制: RDB(默认) 和 AOF机制. 

RDB: 是Redis DataBase缩写快照. 

RDB是Redis默认持久化方式, 按照一定时间将内存的数据以快照的形式保存到硬盘中, 对应产生的数据文件为dump.rdb

通过配置文件中的save参数定义快照周期. 

优点:

  1. 只有一个文件dump.rdb, 方便持久化
  2. 容灾性好. 
  3. 性能最大化
  4. 相对于数据集大时, 比AOF的启动效率更高. 

缺点:

1. 数据安全性低: RDB是间隔一段时间进行持久化, 可能丢失间隙数据. 

AOF持久化(Append Only File)

将Redis执行的每次写命令记录到单独的日志文件中, 当重启Redis会重新回复数据. 

两种方式都开启时, 优先选择AOF. 

优点: 

  1. 数据安全, AOF持久化可以配置appendfsync数据,有always 保证每次都记录. 

缺点: 

  1. AOF 文件比RDB文件大

Redis过期键的删除策略

Redis 提供了多种过期键删除策略,包括:

  • 定时删除:在设置键的过期时间的同时,创建一个定时器,当键的过期时间来临时,立即执行对键的删除操作。
  • 惰性删除:放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。
  • 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。
  • 随机删除:随机选择一部分过期键并对其进行删除

Redis 服务器实际使用的是定时删除、惰性删除和定期删除。这些策略可以在 Redis 的配置文件中进行设置,也可以通过 Redis 命令进行动态配置。

以下是一些常见的配置和使用删除策略的方法:

  1. 配置文件设置:可以在 Redis 的配置文件(通常是redis.conf)中设置删除策略的相关参数。例如,可以设置maxmemory-policy参数来指定使用的删除策略,如volatile-lruallkeys-lruvolatile-random等。

  2. Redis 命令设置:可以使用 Redis 命令来动态设置删除策略。例如,可以使用CONFIG SET命令来设置maxmemory-policy参数。

  3. 选择合适的删除策略:根据实际应用的需求和场景,选择合适的删除策略。例如,如果对内存限制较为严格,可以选择定时删除或定期删除策略;如果对 CPU 资源较为敏感,可以选择惰性删除策略。

  4. 监控和调整:在使用删除策略时,需要监控 Redis 的内存使用情况和性能指标,并根据实际情况进行调整。如果发现内存占用过高或性能下降,可以考虑调整删除策略或其他相关参数。

需要注意的是,不同的删除策略在内存占用和 CPU 资源消耗方面存在差异,因此需要根据具体情况进行选择和优化。此外,Redis 还提供了一些其他的配置参数,如maxmemorymaxmemory-samples等,可以进一步调整删除策略的行为. 

Redids内存淘汰策略

Redis 提供了多种内存淘汰策略,用于在内存使用达到上限时,决定清理哪些数据以释放内存空间。以下是一些常见的 Redis 内存淘汰策略:

  • noeviction:不会继续服务写请求(DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。
  • allkeys-lru:从数据集(server.db(i).dict)中挑选最近最少使用的数据淘汰,该策略要淘汰的 key 面向的是全体 key 集合,而非过期的 key 集合。
  • allkeys-random:从数据集(server.db(i).dict)中选择任意数据淘汰。
  • volatile-lru:从设置过期时间的数据集(server.db(i).expires)中挑选出最近最少使用的数据淘汰。没有设置过期时间的 key 不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。
  • volatile-ttl:除了淘汰机制采用 LRU,策略基本上与 volatile-lru 相似,从设置过期时间的数据集(server.db(i).expires)中挑选将要过期的数据淘汰,ttl 值越大越优先被淘汰。
  • volatile-random:从已设置过期时间的数据集(server.db(i).expires)中任意选择数据淘汰。当内存达到限制无法写入非过期时间的数据集时,可以通过该淘汰策略在主键空间中随机移除某个 key。

这些策略可以根据具体的应用需求进行选择和配置。例如,如果希望保留最近使用过的数据,可以选择 allkeys-lru 策略;如果希望优先删除即将过期的数据,可以选择 volatile-ttl 策略。同时,还可以通过调整相关参数来进一步优化内存淘汰的行为。

什么是Reids事务

Redis 事务是一组命令的集合,可以将多个命令打包一次性执行,保证这些命令执行的原子性。

在一个 Redis 事务中,所有命令都会被序列化并按顺序执行。要么所有命令都成功执行,要么都不执行。

在执行事务时,通常的步骤如下:

  1. 使用 MULTI 命令开启事务。
  2. 依次发送要执行的命令。
  3. 使用 EXEC 命令执行事务中的所有命令。

如果在事务执行过程中出现错误,有以下情况:

  • 如果是在执行命令时发生错误(比如语法错误等),则整个事务会失败,所有命令都不会执行。
  • 如果是命令执行后返回错误结果(比如对一个不存在的键进行操作等),其他命令仍然会执行,只是出错的命令会有相应错误结果。

Redis 事务可以保证一定程度上的一致性和隔离性,但它并不像传统关系型数据库的事务那样严格。例如,它不能保证回滚到事务开始前的状态。

Redis事务相关命令

Redis 中与事务相关的命令主要包括以下几种:

  1. MULTI:标记事务的开始。当你调用 MULTI 命令后,Redis 会进入事务状态,之后发送的所有命令都不会立即执行,而是被放入一个队列中等待执行;
  2. EXEC:执行事务。当所有要执行的命令都已通过 MULTI 收集完毕后,调用 EXEC 命令会使 Redis 服务器顺序执行队列中的所有命令。这些命令作为一个整体被提交,实现了事务的原子性,尽管这种原子性是有限的,不包括失败回滚;
  3. DISCARD:取消事务。如果你在 MULTI 后、EXEC 前决定不执行事务中的命令,可以使用 DISCARD 来清空命令队列并退出事务状态;
  4. WATCH:为事务提供乐观锁机制。使用 WATCH 命令可以监视一个或多个键,如果在 WATCH 后、EXEC 前这段时间内,被监视的键被其他客户端修改了,那么当执行 EXEC 时,事务会失败并返回一个错误,从而可以实现基于条件的事务执行;

Redis哨兵模式

Redis 哨兵模式是一种高可用解决方案,用于监控 Redis 主节点的状态,并在主节点发生故障时自动进行故障转移。以下是关于 Redis 哨兵模式的一些关键信息:

  • 功能

    • 监控:持续监控 Redis 主节点和从节点的运行状态。
    • 通知:在主节点发生故障时,通过 API 通知监控系统或其他应用程序。
    • 自动故障恢复:当主节点发生故障时,自动将从节点提升为主节点,并通知客户端使用新的主节点。
    • 配置中心:为客户端提供 Redis 主节点的地址信息。
  • 工作原理

    • 每个 Sentinel 实例会以每秒一次的频率向主节点、从节点和其他 sentinel 实例发送 PING 命令,以检查它们的状态。
    • 如果一个实例在指定的时间内(down-after-milliseconds)没有响应 PING 命令,或者返回错误,sentinel 会将该实例标记为主观下线。
    • 如果多个 sentinel 实例都认为主节点主观下线,并且达到了 quorum 数量的 sentinel 实例达成共识,那么主节点将被标记为客观下线。
    • 一旦主节点被标记为客观下线,sentinel 会开始进行故障转移。它会从从节点中选择一个合适的节点作为新的主节点,并通知其他从节点切换到新的主节点进行复制。
    • 客户端可以通过连接 sentinel 实例来获取当前主节点的地址信息。
  • 搭建哨兵模式

    • 准备多个 Redis 实例,包括主节点和从节点。
    • 为每个 sentinel 实例创建配置文件,指定监控的主节点信息和其他 sentinel 实例的地址。
    • 启动 Redis 实例和 sentinel 实例。

通过使用 Redis 哨兵模式,可以提高 Redis 系统的可用性和可靠性,减少人工干预和故障恢复时间。但需要注意的是,哨兵模式仍然存在一些局限性,例如在网络分区等情况下可能会出现误判。在实际应用中,需要根据具体需求和场景进行评估和选择。

Redis 哨兵模式的工作原理主要包括以下几个方面:

  1. 监控:哨兵节点会定期向主节点、从节点和其他哨兵节点发送 PING 命令,以检查它们的状态。如果一个节点在指定的时间内没有响应 PING 命令,或者返回错误,哨兵会将该节点标记为主观下线。
  2. 通知:当一个节点被标记为主观下线时,哨兵会向其他哨兵节点发送通知,询问它们是否也认为该节点下线。如果多个哨兵节点都认为该节点下线,那么该节点将被标记为客观下线。
  3. 选举 Leader Sentinel:当主节点被标记为客观下线时,哨兵节点会进行选举,选出一个 Leader sentinel。Leader sentinel 负责进行故障转移操作,将从节点提升为主节点。
  4. 故障转移:一旦选举出 Leader sentinel,它会开始进行故障转移。首先,它会从从节点中选择一个合适的节点作为新的主节点。选择的标准通常包括节点的健康状况、数据完整性等。然后,Leader sentinel 会向其他从节点发送命令,让它们切换到新的主节点进行复制。
  5. 通知客户端:故障转移完成后,Leader sentinel 会通知客户端新的主节点的地址,以便客户端能够重新连接到 Redis 集群。

通过以上工作原理,Redis 哨兵模式可以实现自动故障检测和转移,提高了 Redis 集群的可用性和可靠性。同时,哨兵模式还可以实现对 Redis 集群的监控和管理,方便管理员进行维护和管理。

Redis主从架构

实现 Redis 主从架构的一般步骤:

  1. 配置主节点

    • 在主节点的 Redis 配置文件(通常是 redis.conf)中,无需特殊配置来明确其为主节点。
  2. 配置从节点

    • 在从节点的配置文件中添加以下配置:
      • slaveof <主节点 IP> <主节点端口> ,指定主节点的地址和端口。
  3. 启动主从节点:分别启动主节点和从节点的 Redis 服务。

  4. 验证

    • 可以在从节点上使用 INFO replication 命令查看复制状态,确认从节点是否成功连接到主节点并开始同步数据。

另外,也可以通过命令行动态地设置从节点:在从节点上执行 SLAVEOF <主节点 IP> <主节点端口> 命令来建立主从关系。

Redis实现分布式锁

Reids缓存穿透, 缓存雪崩

Redis缓存降级

在 Redis 中进行缓存降级可以通过以下一些方式来实现:

基于策略的降级

  • 可以设置一些规则,例如当缓存命中率低于一定阈值时,采取降级措施。比如不再从缓存中获取数据,直接从数据源(如数据库)获取并返回。

手动触发降级

  • 在某些特定场景下,比如系统面临高并发压力或缓存出现故障时,手动将系统切换到从数据源获取数据的模式。

数据分层降级

  • 可以将缓存数据分为不同的重要级别。当出现问题时,先放弃不太重要数据的缓存,保证关键数据的缓存正常服务。

失效时间调整

  • 临时调整某些缓存数据的失效时间,加快数据的更新频率,以适应特殊情况。

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

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

相关文章

【GUI软件】小红书蒲公英数据批量采集!高效筛选优质博主,助力品牌商

文章目录 一、背景介绍1.0 爬取目标1.1 演示视频1.2 软件说明 二、代码讲解2.0 关于接口2.1 爬虫采集模块2.2 cookie获取2.3 软件界面模块2.4 日志模块 三、获取采集软件 一、背景介绍 1.0 爬取目标 众所周知&#xff0c;蒲公英是小红书推出的优质创作者商业合作服务平台&…

海思SS928/SD3403开发笔记1——使用串口调试开发板

该板子使用串口可以调试&#xff0c;下面是win11 调试 该板子步骤 1、给板子接入鼠标、键盘、usb转串口 2、下载SecureCRT&#xff0c;并科学使用 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11dIkZVstvHQUhE8uS1YO0Q 提取码&#xff1a;vinv 3、安装c…

2024最新宝塔面板8.1.0企业版开心版

官方更新记录 【增加】增加【网站】-【HTML项目】 【优化】优化Docker模块使用体验 【优化】优化文件压缩和解压的速度 【修复】修复在上一版本中出现的所有已知问题 开心版更新记录 1.在 PHP切换页面&#xff0c;出现报错弹窗属于正常情况&#xff0c;是因爲没安装 企业…

uni-app实现扫码

uni.scanCode(OBJECT) 调起客户端扫码界面&#xff0c;扫码成功后返回对应的结果。 平台差异说明 AppH5微信小程序支付宝小程序百度小程序抖音小程序、飞书小程序QQ小程序快手小程序京东小程序√x√√√√√√√ OBJECT 参数说明 参数名类型必填说明平台差异说明onlyFromC…

JAVA反射代码

java在运行过程中&#xff0c;构建类&#xff0c;并获取方法集和属性集&#xff0c;构建实例并调用方法。 package com;import java.lang.reflect.Method;public class Test {public static void main(String args[]) {Class<?> c1 null; // 声明Class对象c1Person pe…

服务器上线的一些事

最近不少人在上线上遇到问题 对于最近的上戏 进行一个坑或操作步骤的总结 以及遇到这些之后如何做 关于选项的选择 1 对于是否要在一个小时前释放 这个是看个人的 2 对于选择一台服务器还是两台呢&#xff1f;这个是最后限制 一台 这个免费的服务器 是有一个两百的额度的 选择…

【C语言】解决C语言报错:Undefined Reference

文章目录 简介什么是Undefined ReferenceUndefined Reference的常见原因如何检测和调试Undefined Reference解决Undefined Reference的最佳实践详细实例解析示例1&#xff1a;缺少函数定义示例2&#xff1a;函数声明和定义不匹配示例3&#xff1a;未链接必要的库示例4&#xff…

Linux驱动开发(一)--字符设备驱动开发基础

1、字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节 流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI&#xff0c; LCD 等等都是字符设备&#xff0c…

【自动驾驶技术】自动驾驶汽车AI芯片汇总——TESLA篇(FSD介绍)

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本篇文章是这个自动驾驶汽车AI芯片系…

ObTypeIndexTable 在win7x86 和win10x64对比

当作备忘录,其他概念请自行搜索 对象类型和对象结构体类型 win7 x86win10 x64 寻找_object_type结构的地址 过程不一样,但是总归是在全局变量_ObTypeIndexTable数组中寻找 win7 的寻找过程

基于稀疏学习现代信号处理方法的旋转机械故障诊断(MATLAB)

通过对滚动轴承故障诊断研究现状及稀疏表示方法在滚动轴承故障诊断领域中应用现状的调研&#xff0c;发现稀疏表示方法与故障特征提取和故障分类的关联&#xff0c;针对故障诊断问题&#xff0c;通过构造合理的故障稀疏表示模型&#xff0c;选取适合的模型优化算法&#xff0c;…

Pycharm的基础使用

Pycharm的基础使用 一、修改主题 第一步&#xff1a;点击file->settings 第二步&#xff1a;找到Appearance&Behavior->Appearance->Theme选择主题 有五种主题可以选 二、修改默认字体和大小 第一步&#xff1a;打开设置与上面修改主题第一步一样&#xff1b…

C# 索引器与迭代器分部类详情

文章目录 一、迭代器二、查看Foreach执行中间语言三、foreach实现过程总结四、实现迭代器最常用的方法五、分布类概述及其使用六、索引器概述及声明七、索引器在类中的使用八、索引器在接口中的使用九、总结 一、迭代器 1、迭代器&#xff08;iterator&#xff09;解决的是集合…

零信任是对抗AI威胁的“解药”

人工智能的变革力量正在重塑众多行业的业务运营。通过机器人流程自动化&#xff08;RPA&#xff09;&#xff0c;人工智能正在将人力资源从重复的、基于规则的任务中解放出来&#xff0c;并将其重点放在战略性的、复杂的操作上。此外&#xff0c;人工智能和机器学习算法可以以前…

线程池内的交响乐章:揭秘线程间通信的奥秘

1. 线程池概述 线程池是一种多线程处理模式,旨在通过维护一组预先创建的线程,来优化线程的管理和调度。线程池中的线程是后台线程,它们被组织起来以处理添加到队列中的任务。线程池的主要目标是减少线程创建和销毁的开销,同时保证内核的充分利用和防止过分调度。 2. 线程池…

ASM之FieldVisitor创建变量

FieldVisitor使用abstract 修饰&#xff0c;用于创建变量&#xff0c;在使用时调用 ClassWriter.visitField即可创建FieldVisitor 方法介绍 visitField(Opcodes.ACC_PUBLIC, “str”, “Ljava/lang/String;”, null, “Hello World”) 第一个参数是修饰类型&#xff0c;第二…

数据库 |试卷1试卷2

1.数据库语言四大语句 4.四大类&#xff08;DDL、DML、DQL、DCL&#xff09;_中度ddl-CSDN博客 数据定义&#xff08;data defination language&#xff09; 查询、创建、删除、使用 #查询所有数据库 show databases;#查询当前数据库 select database();#创建数据库 create …

C++ 65 之 模版的局限性

#include <iostream> #include <cstring> using namespace std;class Students05{ public:string m_name;int m_age;Students05(string name, int age){this->m_name name;this->m_name age;} };// 两个值进行对比的函数 template<typename T> bool …

[思考记录]未来已近 - AI带来的变化,以及简单思考

最近在我们的内部知识库系统中引入了个比较有意思的功能——借助AI大模型&#xff0c;对思考总结类日志做要点提炼。这个想法来自涛哥&#xff0c;目前做了初步的验证性实现。尽管还没有对输出结果做调优&#xff0c;但已展现出的效果仍让我略感惊艳。不由地感叹&#xff0c;&a…

如何掌握 Java 中的安全机制,如权限控制和加密解密

Java是一门具有强大安全功能的编程语言&#xff0c;它内置了多种安全机制&#xff0c;包括权限控制、加密解密、认证授权等。 一、权限控制 权限控制是Java安全模型的重要组成部分&#xff0c;它主要通过Java安全管理器&#xff08;Security Manager&#xff09;和权限&#…