峰哥分享:个人总结快速掌握Redis使用
mhr18 2024-10-24 11:10 29 浏览 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内存超过指定的阈值后,虚拟内存机制自动将一部分内存存储在硬盘上,然后将此部分内存进行释放。当需要访问此部分内存时,再从磁盘上读取到内存中提供使用。
虚拟内存机制会带来性能的损耗。
相关推荐
- 订单超时自动取消业务的 N 种实现方案,从原理到落地全解析
-
在分布式系统架构中,订单超时自动取消机制是保障业务一致性的关键组件。某电商平台曾因超时处理机制缺陷导致日均3000+订单库存锁定异常,直接损失超50万元/天。本文将从技术原理、实现细节、...
- 使用Spring Boot 3开发时,如何选择合适的分布式技术?
-
作为互联网大厂的后端开发人员,当你满怀期待地用上SpringBoot3,准备在项目中大显身手时,却发现一个棘手的问题摆在面前:面对众多分布式技术,究竟该如何选择,才能让SpringBoot...
- 数据库内存爆满怎么办?99%的程序员都踩过这个坑!
-
你的数据库是不是又双叒叕内存爆满了?!服务器监控一片红色警告,老板在群里@所有人,运维同事的电话打爆了手机...这种场景是不是特别熟悉?别慌!作为一个在数据库优化这条路上摸爬滚打了10年的老司机,今天...
- springboot利用Redisson 实现缓存与数据库双写不一致问题
-
使用了Redisson来操作Redis分布式锁,主要功能是从缓存和数据库中获取商品信息,以下是针对并发时更新缓存和数据库带来不一致问题的解决方案1.基于读写锁和删除缓存策略在并发更新场景下,...
- 外贸独立站数据库炸了?对象缓存让你起死回生
-
上周黑五,一个客户眼睁睁看着服务器CPU飙到100%——每次页面加载要查87次数据库。这让我想起2024年Pantheon的测试:Redis缓存能把WooCommerce查询速度提升20倍。跨境电商最...
- 手把手教你在 Spring Boot3 里纯编码实现自定义分布式锁
-
为什么要自己实现分布式锁?你是不是早就受够了引入各种第三方依赖时的繁琐?尤其是分布式锁这块,每次集成Redisson或者Zookeeper,都得额外维护一堆配置,有时候还会因为版本兼容问题头疼半...
- 如何设计一个支持百万级实时数据推送的WebSocket集群架构?
-
面试解答:要设计一个支持百万级实时数据推送的WebSocket集群架构,需从**连接管理、负载均衡、水平扩展、容灾恢复**四个维度切入:连接层设计-**长连接优化**:采用Netty或Und...
- Redis数据结构总结——面试最常问到的知识点
-
Redis作为主流的nosql存储,面试时经常会问到。其主要场景是用作缓存,分布式锁,分布式session,消息队列,发布订阅等等。其存储结构主要有String,List,Set,Hash,Sort...
- skynet服务的缺陷 lua死循环
-
服务端高级架构—云风的skynet这边有一个关于云风skynet的视频推荐给大家观看点击就可以观看了!skynet是一套多人在线游戏的轻量级服务端框架,使用C+Lua开发。skynet的显著优点是,...
- 七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得
-
前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...
- mysql mogodb es redis数据库之间的区别
-
1.MySQL应用场景概念:关系型数据库,基于关系模型,使用表和行存储数据。优点:支持ACID事务,数据具有很高的一致性和完整性。缺点:垂直扩展能力有限,需要分库分表等方式扩展。对于复杂的查询和大量的...
- redis,memcached,nginx网络组件
-
1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...
- SpringBoot+Vue+Redis实现验证码功能
-
一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis...
- AWS MemoryDB 可观测最佳实践
-
AWSMemoryDB介绍AmazonMemoryDB是一种完全托管的、内存中数据存储服务,专为需要极低延迟和高吞吐量的应用程序而设计。它与Redis和Memcached相似,但具有更...
- 从0构建大型AI推荐系统:实时化引擎从工具到生态的演进
-
在AI浪潮席卷各行各业的今天,推荐系统正从幕后走向前台,成为用户体验的核心驱动力。本文将带你深入探索一个大型AI推荐系统从零起步的全过程,揭示实时化引擎如何从单一工具演进为复杂生态的关键路径。无论你是...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
Java SE Development Kit 8u441下载地址【windows版本】
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
Oracle如何创建用户,表空间(oracle19c创建表空间用户)
-
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis结构 (53)
- redis 订阅 (54)
- redis 登录 (62)
- redis 面试 (58)
- redis问题 (54)
- 阿里 redis (67)
- redis的缓存 (57)
- lua redis (59)
- redis 连接池 (64)