峰哥分享:个人总结快速掌握Redis使用
mhr18 2024-10-24 11:10 22 浏览 0 评论
一、Redis部署模式
1.1主从模式
主从模式由一个主节点(Master)以及多个子节点(Slave)组成,主要是为了解决单点故障以及多读少写的问题。当主节点出现故障的时候,可以将Slave切换成主节点,但是需要人工手动切换。
此模式几乎不用。
1.2哨兵模式
哨兵模式主要是为了解决主从模式中需要人为手工切换主节点的问题,引入了哨兵节点。哨兵节点主要是监控Master、Slave节点的状态。哨兵节点定期向各大节点发送PING命令,确保各大节点的正常运行。当未收到PING消息回复时,则系统认为该节点异常,则作为节点【主观下线】操作。
主节点被多数哨兵标记为主观下线,则该主节点标记为【客观下线】。哨兵节点开始进行故障迁移操作,从健康的Slave节点中选择一个作为Master节点可以自动的将某一个从节点升级为Master节点,并且通知其他节点以及应用程序客户端进行更新节点信息。应用程序客户端接收到更新节点信息后,自动更新连接池信息,与新的Master节点进行操作。
1.3集群模式
集群模式将Key数据自动分片分别存储在多个不同的应用节点上,每个节点存储一部分数据。解决横向向扩容和容错的问题。
集群模式总共有2^14方(16384)个分片。
注意点:不能跨多个节点进行Key处理。
因为Redis集群内置插槽为16384个,所以Redis会将每个键的键名的有效部分使用CRC16算法计算出散列值,然后对16384的取余。余数为多少就表示该键应该被分配到哪个节点,这样的话,每个键都可以被分配到16384个插槽中,而集群中的每个节点都会被分配一定的插槽。
因为Redis是根据每个键的键名的有效部分使用CRC16算法计算出的散列值来分配键的,那么如果想要让相关键都分配到集群中的同一个节点里,只需要让相关键的键名的有效部分相同即可。
键值有效部分定义:
如果键名包含{符号,且在{符号后面存在}符号,并且{和}之间有至少一个字符,则有效部分是指{和}之间的内容。
例如:{仓库ID}:SKUCode 则Redis会将{仓库ID}下的所有Key都存储在一个节点中。通过集群模式可以快速扩容库存占用+释放能力。
二、Redis数据类型
数据类型 | 注意点 | 使用场景 |
String | 不要超过10M,若超过10M需要拆分Key值处理 | |
Hash | Key值可以重复,但是不要超过10000个Key,若超过则需要引入二级索引进行处理 | |
List | 数据量不要超过10000,若超过则需要引入二级索引处理 | |
Set | Key值不可以重复 | |
ZSet | ZSet Score值只允许16位。超过16位则出现失真,导致排序错乱 | 订单排序(乱序订单变成有序订单) 用户排序 |
三、Redis属于AP还是CP
Redis主从复制过程中采用的是异步数据复制方式,因此Redis属于最终一致性,并不是强一致性。
四、Redis持久化机制
4.1 RDB
RDB是将Redis内存中的数据定期保存在磁盘上,以防止Redis异常情况下数据丢失。
优点:快照文件小,恢复速度快。
4.2 AOF
将Redis的所有操作命令存储(Append Only File)。极端情况下丢失1秒数据
4.3 AOF 文件落库方式
Always:同步执行,每执行一个命令进行落库操作
EverySec:每秒写回数据。执行完Redis操作命令,写入AOF内存缓冲区,每隔一秒落库文件
No:由操作系统来进行控制回写文件
在Redis采用RDB + AOF 同时持久化的情况下,当出现故障时,极端会丢失一秒数据。
五、Redis内存淘汰机制
不淘汰 : 如果内存满了,则直接报错;
设置了过期时间:随机淘汰 、最近最少使用(LRU = Least Recently Used)、根据过期时间的先后进行删除,越早过期的越先被删除(TTL)、LFU(最少访问 = Least Frequently Used)
所有数据淘汰机制:随机淘汰、最近最少使用(LRU)、最少访问-LFU
MRU与LRU的链表设计
六、Redis过期策略
Redis Key值过期策略支持 惰性删除、定期删除。
定期删除:Redis默认每隔100ms时间随机删除标记了过期时间,并且检查确认已经过期的的Key值。定期删除会占用Redis CPU资源。
惰性删除:Redis访问过期时间Key时,如果确认已经过期,则再进行删除操作。但是带来的问题是:这部分过期的Key会占用内存资源,如果长期不访问有可能长期占用。
Redis删除了Key,也不会立马释放内存。被删除的内存空间会被标记为【可重用的内存】
七、Redis 热点Key (HotKey)解决方法
1、如果是Sentinel模式,则增加多个副本,通过多副本的访问拆分访问流量
2、如果是集群模式,则将Redis的热点Key同步复制到多个不同的节点下,通过集群的节点来分担访问流量
3、增加本地二级缓存:在本地通过HashMap等框架来增加相应的二级缓存,从而降低Redis的访问量。但是需要注意本地二级缓存与Redis的一致性问题,同时需要防止本地二级缓存过大,占用应用内存,导致OOM
4、将Redis的热点Key拆分成多个Key,根据不同的访问策略访问不同的Key
八、Redis BigKey解决方法
1、将BigKey拆分成多个小Key,通过Hash或者List来维护Redis 二级缓存信息
2、增加本地二级缓存,降低Redis的访问。如果是高频率访问,也不进行二级缓存,会将Redis宽带打满
3、设置BigKey的TTL时间,定期删除BigKey
九、Redis缓存雪崩、缓存穿透、缓存击穿
9.1 缓存雪崩
Redis同一时间大量的Key过期或者Redis服务器宕机,导致直接访问数据库,进而导致数据库宕机。
解决方法:
1、将过期时间设置为不同的时间范围内,防止大量Key过期
2、通过集群模式,防止Redis服务器宕机
3、感知数据库访问量突然过大,进行自动限流操作。例如:可以通过Sentinel控制
9.2 缓存穿透
应用访问Redis的缓存,若缓存数据不存在则访问数据库,数据库也不存在。大量的访问数据时,导致缓存服务器失效,直接访问数据库,从而导致数据库过载,导致数据库服务器宕机或者不可正常使用。
解决方法:
1、若发现数据库不存在,则设置一个带有过期时间的Null缓存。
2、使用BloomFilter过滤器来判断是否存在,如果存在再进行访问Redis缓存。但是BloomFilter存在误判的几率。
3、熔断、限流、降级等措施
9.3 缓存击穿
应用访问某一个Redis Key的时候,当前Key过期了,若有大量的访问,则会直接访问数据库,从而导致数据库访问量过大。
解决方法:
1、提前预判Redis Key的访问量是否过大,如果过大,则提前延期Redis Key的过期时间
2、若Redis Key不存在时,则先通过分布式锁来防止大量的访问数据库(等待数据库执行完成后,再允许其他应用访问)
3、熔断、限流、降级等措施
十、Redis布隆过滤器
Redis BoolmFilter 提前初始化好数据大小,根据Key的内容进行多次Hash算法得到不同的位置,然后将此位置的占有位设置为1。当需要判断Key是否存在时,判断所有的Hash 位置是否都为1,若都为1则认为存在。
BoolmFilter优点:
1、占用内存少
2、查询写入速度快
缺点:
1、数据越多,误判概率越大
2、无法删除已经存在的Key
十一、Redis数据库和缓存数据不一致
产生的原因
1、Redis数据库和缓存数据不一致是因为这2步操作无法保障原子性。
2、高并发访问的时候,缓存不存在,读取数据库进行缓存时,数据库数据发生了变化。缓存不知道
如何解决数据库和缓存不一样的问题
1、在一定的时间范围内需要忍受一定的缓存数据不一致的问题
2、缓存双删的操作
数据库更新时,按照以下步骤处理
A、删除缓存(这边操作主要是为了防止其他线程访问缓存时读不到老数据,然后可以进行相互互斥的等待操作;以及防止数据库更新成功,删除缓存失败的场景)
B、更新数据库
C、删除缓存(这步操作主要是为了解决在更新数据库之前,有线程读取到了老数据,然后缓存了老数据)
3、通过CDC方案来进行解决处理
但是这个方案有个弊端就是:当CDC数据产生大量的数据时,会有比较高的延迟
十二、Redis最佳实践经验
1、避免大Key存在,若存在则需要拆分成多个小Key或者多级缓存来解决
2、在生产环境中禁止使用Keys命令
3、在生产环境中禁止使用FlushDb命令
4、在LUA脚本中禁止使用死循环,从而导致Redis线程卡死
5、若Redis存在关键性的数据,则需要考虑Redis的持久化存储,RDB + AOF双重持久化存储,这样可防止最大丢失1秒数据的
6、高可用服务器的搭建,防止单点问题
7、若频繁的更新Key中的部分数据,可将Key的内容拆分成多个Key或者使用Hash存储,降低Redis网络带宽占用
十三、Redis RedLock解决什么问题
Redis RedLock主要解决Redis单点故障进行转移的过程中,锁Key未进行及时的同步,从而导致锁Key的丢失。
使用Redis RedLock主要是解决多节点Key的一致性问题,在多个Redis节点中设置锁Key,锁可以在多个节点中设置成功后才认为上锁成功。
此设计思路与Zookeeper很类似,若系统对此种锁的要求很高,个人建议使用Zookeeper来实现分布式锁更合适。
十四、Redis PipeLine解决什么问题
Redis Pipeline解决客户端多次执行命令,减少网络IO的开销问题,提升Redis执行效率。但是Pipeline是无法保障此批次执行命令的原子性。
十五、Redis 事务
Redis事务不支持回滚。也就是说:Redis 执行成功 Exec后,在后续节点中出现异常,也不会进行回滚操作。
Redis 事务执行方法
1、Multi:标记事务块开始
2、Exec:执行事务,可以保障原子性,但是不支持回滚
3、Discard:放弃事务
4、Watch:监视某个Key,当这个Key发生变化时,事务不会进行相关执行。若不执行Watch,当Key变化时,事务也会进行执行
5、Unwatch:取消监视所有Key
十六、Redis 分布式锁
1、 利用SetNx来进行处理分布式锁
2、如果程序运行超时,锁被释放了,该如何处理?
参照Redisson的WatchDog来进行监视线程的运行,如果未执行完成,但是锁即将超时,则重新设置锁的过期时间。
十七、如何利用SSD硬盘扩大Redis内存容量
Redis提供的虚拟内存机制主要用于将不常用的内存数据存储在硬盘上,避免过多的内存占用以及提高Redis数据存储量。
Redis内存超过指定的阈值后,虚拟内存机制自动将一部分内存存储在硬盘上,然后将此部分内存进行释放。当需要访问此部分内存时,再从磁盘上读取到内存中提供使用。
虚拟内存机制会带来性能的损耗。
相关推荐
- 使用 Docker 部署 Java 项目(通俗易懂)
-
前言:搜索镜像的网站(推荐):DockerDocs1、下载与配置Docker1.1docker下载(这里使用的是Ubuntu,Centos命令可能有不同)以下命令,默认不是root用户操作,...
- Spring Boot 3.3.5 + CRaC:从冷启动到秒级响应的架构实践与踩坑实录
-
去年,我们团队负责的电商订单系统因扩容需求需在10分钟内启动200个Pod实例。当运维组按下扩容按钮时,传统SpringBoot应用的冷启动耗时(平均8.7秒)直接导致流量洪峰期出现30%的请求超时...
- 《github精选系列》——SpringBoot 全家桶
-
1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...
- Nacos简介—1.Nacos使用简介
-
大纲1.Nacos的在服务注册中心+配置中心中的应用2.Nacos2.x最新版本下载与目录结构3.Nacos2.x的数据库存储与日志存储4.Nacos2.x服务端的startup.sh启动脚...
- spring-ai ollama小试牛刀
-
序本文主要展示下spring-aiollama的使用示例pom.xml<dependency><groupId>org.springframework.ai<...
- SpringCloud系列——10Spring Cloud Gateway网关
-
学习目标Gateway是什么?它有什么作用?Gateway中的断言使用Gateway中的过滤器使用Gateway中的路由使用第1章网关1.1网关的概念简单来说,网关就是一个网络连接到另外一个网络的...
- Spring Boot 自动装配原理剖析
-
前言在这瞬息万变的技术领域,比了解技术的使用方法更重要的是了解其原理及应用背景。以往我们使用SpringMVC来构建一个项目需要很多基础操作:添加很多jar,配置web.xml,配置Spr...
- 疯了!Spring 再官宣惊天大漏洞
-
Spring官宣高危漏洞大家好,我是栈长。前几天爆出来的Spring漏洞,刚修复完又来?今天愚人节来了,这是和大家开玩笑吗?不是的,我也是猝不及防!这个玩笑也开的太大了!!你之前看到的这个漏洞已...
- 「架构师必备」基于SpringCloud的SaaS型微服务脚手架
-
简介基于SpringCloud(Hoxton.SR1)+SpringBoot(2.2.4.RELEASE)的SaaS型微服务脚手架,具备用户管理、资源权限管理、网关统一鉴权、Xss防跨站攻击、...
- SpringCloud分布式框架&分布式事务&分布式锁
-
总结本文承接上一篇SpringCloud分布式框架实践之后,进一步实践分布式事务与分布式锁,其中分布式事务主要是基于Seata的AT模式进行强一致性,基于RocketMQ事务消息进行最终一致性,分布式...
- SpringBoot全家桶:23篇博客加23个可运行项目让你对它了如指掌
-
SpringBoot现在已经成为Java开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通...
- 开发好物推荐12之分布式锁redisson-sb
-
前言springboot开发现在基本都是分布式环境,分布式环境下分布式锁的使用必不可少,主流分布式锁主要包括数据库锁,redis锁,还有zookepper实现的分布式锁,其中最实用的还是Redis分...
- 拥抱Kubernetes,再见了Spring Cloud
-
相信很多开发者在熟悉微服务工作后,才发现:以为用SpringCloud已经成功打造了微服务架构帝国,殊不知引入了k8s后,却和CloudNative的生态发展脱轨。从2013年的...
- Zabbix/J监控框架和Spring框架的整合方法
-
Zabbix/J是一个Java版本的系统监控框架,它可以完美地兼容于Zabbix监控系统,使得开发、运维等技术人员能够对整个业务系统的基础设施、应用软件/中间件和业务逻辑进行全方位的分层监控。Spri...
- SpringBoot+JWT+Shiro+Mybatis实现Restful快速开发后端脚手架
-
作者:lywJee来源:cnblogs.com/lywJ/p/11252064.html一、背景前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)