Redis原理及应用

Redis简介

        Redis是开源的(BSD许可),数据结构存储于内存中,被用来作为数据库,缓存和消息代理。它支持多种数据结构,例如:字符串(string),哈希(hash),列表(list),集合(set),带范围查询的排序集合(zset),位图(bitmap),hyperloglog,带有半径查询和流的地理空间索引(geospatial)。 Redis具有内置的主从复制机制,Lua脚本,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供高可用性。

Redis各数据结构常用命令

String 类型常用命令

命令行 含义
set key value 赋值key的值为value
get key / del key 获取key的value值 / 删除key
expire key seconds 设置key在seconds秒后过期
setex key seconds value SET + EXPIRE的组合指令
ttl key 查看key还有多久过期
setnx key value 如果key不存在,才新增key和value
strlen key 计算指定key的值的长度
incr key value值加1
incrby key numbers 指定增加值,numbers可以是负值
mset key1 value1 key2 value2 ... 批量添加
mget key1 key2 key3 … 批量获取

List类型常用命令

命令行 含义
lpush key value1 value2 左侧插入value
rpush key value1 value2 右侧插入value
lrange key startIndex endIndex 查看指定元素,下标从0开始,-1为倒数第一个
lpop key 左侧弹出value
rpop key 右侧弹出value
llen key 查看key的长度
lindex key index 查看列表中某个index对应的value值
ltrim key startIndex endIndex仅保留某区间的列表,其余元素全被删除

Set类型常用命令

命令行 含义
sadd key value1 value2 添加元素到集合中
smembers key 查看集合中的所有元素
sismember key value 查看value是否在集合中
scard key 查询集合的长度
spop key 取出集合中的一个元素
del key 删除集合

Zset类型常用命令

命令行 含义
zadd key score1 value1 score2 value2 添加元素到有序集合中
zscore key value查看value的score值,输出score>=负无穷,score<=正无穷的所有元素
zrange key 0 -1 [withscores] 正序输出
zrangebyscore key -inf +inf [withscores] 正序输出
zrevrange key 0 -1 [withscores] 倒序输出
zcard key 查看key中的元素个数
zrangebyscore key minScore maxScore获得key中score>=minScore 且score<=maxScore 的元素,正序排列
zrevrangebyscore key maxScore minScore 同上,倒序排列
zrem key value 删除key中的元素value

Hash类型常用命令

命令行 含义
hset key name value 添加属性元素name和value到key中
hget key name 查看key的name值
hmset key name1 value1 name2 value2 批量添加key的属性元素
hmget key name1 name2 批量获取key的属性元素
hlen key 获得key的属性元素个数
hgetall key 查询key中的所有元素

Redis的持久化

RDB

RDB持久化支持 手工执行和服务器定期执行,RDB持久化产生的文件是一个 经过压缩的二进
制文件,对应文件为dump.rdb
,因为它保存在磁盘上,所以可以用它来还原数据库中的数据。
        手动执行RDB保存有两个命令:
         SAVE命令:  阻塞Redis服务器进程,直到RDB文件生成完毕,都会一直处于阻塞状态,不能处理任何的Redis命令请求;
         BGSAVE命令:  fork一个子进程来生成RDB文件,Redis服务器进程不受影响,可以继续处理命令请求。
        当服务器启动的时候,RDB自动执行加载,没有专门的命令来加载RDB文件。只要Redis启
动时检测到RDB文件的存在,那么就会自动载入RDB文件。加载过程中,会一直处于阻塞状
态,直到加载完毕为止。由于 AOF文件的更新频率一般比RDB文件的更新频率高,所以,如
果服务期开启了AOF持久化功能,那么就优先加载AOF文件,否则,加载RDB文件。

AOF

        AOF 是通过 保存Redis执行命令 来记录数据库数据变更。
        分为三步: 命令追加—— > 文件写入—— > 文件同步 ,如果打开AOF后,每 次执行完一个写命令之后,都会把写命令以请求协议格式保存到 aof_buf缓冲区 的末尾。
开启AOF:   appendonly yes   (默认为no 打开为yes)
配置 AOF路径 appendfilename:"appendonly.aof" (默认配置,路径为...-/redis-3.0.0/src/appendonly.aof)
AOF持久化机制:
AOF加载还原流程:
AOF文件重写机制: AOF文件不可能一直无限制的累加增大, 当Redis到达配置的某些阈值条件时, 就会触发重写机制, 也可以通过手动执行  bgrewriteaof 命令来触发, 它是把redis进程内的数据转换为写命令同步到新AOF文件的过程.
重写机制降低了AOF文件占用空间,更小的AOF文件可以更快被redis加载.

auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64M 
auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。


重写后的AOF文件为什么可以变小?

  • 进程内已经超时的数据不再写入文件。
  • 旧的AOF文件含有无效命令,如del key1,hdel key2,srem keys,set a 111,set a222
  • 重写使用进程内数据直接生成,这样新的AOF文件只保留最终的数据的写入名。
  • 多条写命令可以合并为1个。如 lpush list a,lpush list b,lpush list c,可以转换为lpush list a b c .为了防止单条命令过大造成客户端缓冲区溢出,
  • 对于list,set,hash,zset类数据类型,以64个元素为界限拆分为多条。

Redis主从复制

主从复制是指 将一台Redis服务器的数据复制到其他的Redis服务器。前者称为 主节点(Master/Leader),后者称为 从节点(Slave/Follower);数据是从主节点复制到从节点的。其中, 主节点负责写数据(当然有读的权限), 从节点负责读数据(它没有写数据的权限)。默认配置下,每个Redis都是主节点。主从节点是1对N的关系。

主从复制的好处:

  • 数据冗余: 主从复制实现了数据的备份,实际上提供了数据冗余的实现方式。
  • 故障恢复: 当主节点出现异常时,可以由从节点提供服务,实现快速的故障恢复,实际上提供了服务冗余的实现方式。
  • 负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器的负载;在写少读多的业务场景下,通过多个从节点分担读负载,可以大大提高Redis服务器是并发量。
  • 高可用:  哨兵配合主从复制,可以是实现Redis集群的高可用.

Redis的主从复制可以分为两个阶段:sync阶段(首次启动的全量同步)commandpropagate阶段(后续的增删改命令同步).

        但是每次主从节点重新链接都要全量同步也是很耗费资源的, 后续Redis2.8做出优化引入了 psync指令来代替sync指令。psync指令会根据不同的情况,来确定执行全量重同步还是分重同步

主从同步防止数据丢失---复制偏移量

        Master节点和Slave节点都保存着一份 复制偏移量 。当Master节点每次向Slave节点发送n字 节数据的时候,就会在Master节点偏移量加上n;而Slave节点每次接收到n个字节的时候,也会在Slave节点偏移量上加n。 在命令传播阶段,Slave节点会定期的发送心跳REPLCONFACK{offset}指令,这里的offset就是Slave节点的offset。当Master节点接收到这个心跳指令后,会对比自己的offset和命令里的offset,如果发现有数据丢失,那么Master节点就会推送丢失的那段数据给Slave节点

Redis哨兵模式

        哨兵本质就是一个Redis实例节点。哨兵模式是一种特殊的模式,它能够后台监控主机是否故障,如果主机故障了,则根据投票数自动将Slave节点转换为新的Master节点。 首先Redis提供了哨兵的命令,哨兵是一个独立的进程,会独立的运行。它的原理是:哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

选举流程
        
当一个Sentinel判断主节点不可用的时候,会首先进行“主观下线”。此时,这个Sentinel
通过sentinel is-masterdown-by-addr指令获取其他哨兵节点对主节点的判断,如果当
前哨兵节点对主节点主观下线的票数超过了我们定义的quorum值,则主节点被判定为
“客观下线”。
        Sentinel节点会从原主节点的从节点中选出一个新的主节点,选举流程如下:
① 首先,过滤掉所有主观下线的节点。
② 然后,选择slave-priority最高的节点,如果有则返回,没有就继续下面的流程。
③ 选择出复制偏移量offset最大的节点,如果有则返回,没有就继续下面的流程。
④ 选择run_id最小的节点,其中,run_id表示服务器运行 ID。
⑤ 在选择完毕后,Sentinel节点会通过SLAVEOF NO ONE命令让选择出来的从节点成为主
节点,然后通过SLAVEOF命令让其他的节点成为该节点的从节点。

Redis Cluster集群

        Redis3.0开始引入了去中心化分片集群Redis Cluster
        传统的Redis集群是基于主从复制+哨兵的方式来实现的。但是集群中都只有一个主节点提供写服务
        Redis Cluster则采用多主多从的方式,支持开启多个主节点,每个主节点上可以挂载多个从节点。
        Cluster会将数据进行分片(虚拟节点 + 一致性哈希)将数据分散到多个主节点上,而每个主节点都可以对外提供读写服务。这种做法使得Redis突破了单机内存大小限制,扩展了集群的存储容量。并且Redis Cluster也具备高可用性,因为每个主节点上都至少有一个从节点,当主节点挂掉时,Redis Cluster 的故障转移机制会将某个从节点切换为主节点。
        Redis Cluster是一个去中心化的集群每个节点都会与其他节点保持互连,使用gossip协议来交换彼此的信息,以及探测新加入的节点信息。并且Redis Cluster无需任何代理,客户端会直接与集群中的节点直连。

 数据分片:一个集群包含16384个哈希槽(hashslot)也就是16384个虚拟节点。将虚拟节点分配给实际节点,然后由虚拟节点来抢占由整个哈希值空间组织成的一个虚拟的圆环.

 Redis面试题

分布式锁 (getset命令/lua脚本)

缓存穿透(Redis和数据库都没有的数据) 解决方案:

1.将数据库返回的空数据也缓存到Redis, 并设置合理过期时间

2. 布隆过滤器(它可以判断某个数据一定不存在,但是无法判断一定存在)

缓存击穿(某热点数据在过期的情况下有大量高并发请求) 解决方案:

1. 设置热点数据永不过期

2. 加锁,过期时只允许一个线程去数据库查询并缓存

缓存雪崩(大量数据同一时间过期或者Redis宕机) 解决方案:

1.搭建集群

2.服务限流降级

3.将数据的过期时间尽量打散, 别集中在同一时间

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

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

相关文章

Ubuntu ESP32开发环境搭建

文章目录 ESP32开发环境搭建安装ESP-IDF搭建一个最小工程现象 ESP32开发环境搭建 最近有个小项目需要用到能够联网的mcu驱动&#xff0c;准备玩玩esp的芯片&#xff0c;记录下ESP32开发环境搭建的过程。 ESP-IDF 是乐鑫科技为其 ESP32 系列芯片提供的官方开发框架。这个框架主…

【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】

前言 责任链模式通过将请求和处理者解耦&#xff0c;关联多个处理者形成一个链条&#xff0c;使每个处理者都有机会处理请求&#xff0c;避免了将所有处理逻辑集中在一个对象中的复杂性。 代码 //请求者 public class Requestor {private string content;public string Cont…

用python将一个扫描pdf文件改成二值图片组成的pdf文件

使用墨水屏读书现在似乎越来越流行&#xff0c;这确实有一定的好处&#xff0c;例如基本不发热&#xff0c;电池续航时间超长&#xff0c;基本不能游戏所以有利于沉浸式阅读&#xff0c;还有不知道是不是真的有用的所谓防蓝光伤害。但是&#xff0c;如果阅读的书籍是扫描图片组…

vue3封装Element Plus table表格组件

支持绝大部分Element Plus原有设置属性&#xff0c;支持分页&#xff0c;支持动态适配高度 效果展示 组件代码&#xff1a; <template><div class"table-wrap" ref"tableWrap"><el-tableclass"w100 h100":data"tableInfo.…

IText创建加盖公章的pdf文件并生成压缩文件

第一、前言 此前已在文章&#xff1a;Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧&#xff0c;本篇以一个案例为基础&#xff0c;主要介绍IText根据pdf模板填充生成pdf文件&#xff0c;并生成压缩文件。 第二、案例 以下面pdf模板为例&#xff0c;生成一个p…

组会 | 大语言模型 + LoRA

目录 1 大语言模型概述1.1 模型的架构1.2 模型的细节&#xff1a;标记化和嵌入化1.3 模型的核心 2 多头注意力机制3 LoRA 概述3.1 冻结部分模型参数3.2 低秩适配&#xff08;LoRA&#xff09;3.2.1 核心工作原理&#xff1a;冻结模型参数3.2.2 核心工作原理&#xff…

对象:是什么,使用,遍历对象,内置对象

对象使用&#xff1a; 对象访问&#xff1a;&#xff08;对象每个属性之间用逗号隔开&#xff09; 补充&#xff1a;也可以通过 对象名[‘属性名’] 对象方法&#xff1a; 方法名:匿名函数 调用方法不需要控制台打印&#xff0c;只要调用就自动输出值 遍历对象&#xff1a; …

小程序24-滚动效果:scroll-view组件详解

在微信小程序中如果想实现内容滚动&#xff0c;需要使用 scroll-view 组件 scroll-view&#xff1a;可滚动视图区域&#xff0c;适用于需要滚动展示内容的场景&#xff0c;用户可以通过手指滑动或者点击滚动条滚动内容。 scroll-x允许横向滚动scroll-y允许纵向滚动 实现横向…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

AUTOSAR_EXP_ARAComAPI的7章笔记(6)

☞返回总目录 相关总结&#xff1a;ara::com 与 AUTOSAR 元模型的关系总结 7.4 ara::com 与 AUTOSAR 元模型的关系 在本文档中&#xff0c;我们一直在不涉及具体的AP元模型&#xff08;其清单部分&#xff09;的情况下解释 ara::com API的思想和机制&#xff0c;AP元模型是正…

LINUX系统编程之——环境变量

目录 环境变量 1、基本概念 2、查看环境变量的方法 三、查看PATH环境变量的內容 1&#xff09;不带路径也能运行的自己的程序 a、将自己的程序直接添加到PATH指定的路径下 b、将程序所在的路径添加到PATH环境中 四、环境变量与本地变量 1、本地变量创建 2、环境变量创…

MacOS通过X11转发远程运行virt-manager进行虚机分配

今天需要通过本地macbook机器连接远程物理机&#xff0c;执行虚机分配&#xff0c;现有文档仅提供window环境安装&#xff0c;如下整理Mac环境下的安装步骤 操作篇 前提条件 支持x11转发的terminal&#xff0c;我本地使用iTerm2&#xff1b;本地安装XQuartz&#xff0c;作为…

【AI系统】AI 基本理论奠定

虽然 AI 在今年取得了举世瞩目的进展与突破&#xff0c;但是其当前基于的核心理论神经网络等&#xff0c;在这波浪潮开始前已经基本奠定&#xff0c;并经历了多次的起起伏伏。神经网络作为 AI 的前身&#xff0c;经历了以下的发展阶段&#xff1a; 萌芽兴奋期&#xff08;约 19…

网络安全服务人才发展路线图

到2023年&#xff0c;全球网络安全支出规模将达到1512亿美元&#xff08;约合10640.4亿元人民币&#xff09;&#xff0c;并将以9.4%的年复合增长率持续增长。与火爆的产业现状相比&#xff0c;中国的网络安全服务人才面临巨大缺口。相关数据显示&#xff0c;我国网络安全人才缺…

STM32 ADC 读取模拟量

问题 我有一个调速开关&#xff0c;模拟量输入&#xff0c;因此需要使用 STM32 读取模拟量&#xff0c;并通过串口输入来调试。串口相关知识参考 STM32 串口输出调试信息。 硬件信息: CubeMX version 6.12.1Keil uVision V5.41.0.0 参考知识 【STM32】HAL库 STM32CubeMX教…

[每周一更]-(第124期):模拟面试|缓存面试思路解析

文章目录 31 为什么 Redis 不立刻删除已经过期的数据?1. Redis 是怎么删除过期 key 的?2. Redis 为什么不立刻删除已经过期的 key?3. Redis 为什么不每个 key 都启动一个定时器,监控过期时间?4. Redis 是如何执行定期删除的?5. 为什么 Redis 在定期删除的时候不一次性把所…

操作系统——揭开盖子

计算机执行时——取指执行 es:bx等于从0x9000开始&#xff0c;到0x90200结束

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中&#xff0c;经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术&#xff0c;可以帮助我们在不同平台或环境下编写不同的代码&#xff0c;以适应不同的平…

模糊控制系统的设计(取材bilibili_蓝天的季洁)

模糊控制原理和传统控制原理&#xff0c;在框图上的区别实际上只在控制器方面存在差异&#xff0c;将传统的控制器改为了模糊控制器&#xff08;fuzzy controller&#xff09;。 通过举例说明&#xff0c;将原有的[0,100]的参数通过隶属函数规则&#xff0c;&#xff08;类似于…

pytest日志总结

pytest日志分为两类&#xff1a; 一、终端&#xff08;控制台&#xff09;打印的日志 1、指定-s&#xff0c;脚本中print打印出的信息会显示在终端&#xff1b; 2、pytest打印的summary信息&#xff0c;这部分是pytest 的默认输出&#xff08;例如测试结果PASSED, FAILED, S…