唐山网站建设培训,安卓市场下载app,不断加强门户网站建设,做网站游戏都需要什么文章目录 Redis 基础Redis 是什么#xff0c;有哪些特点为什么要使用 Redis 而不仅仅依赖 MySQLRedis 是单线程吗Redis 单线程为什么还这么快 Redis 数据类型和数据结构五种基本数据结构及应用场景其他数据类型Redis 底层数据结构 Redis 持久化数据不丢失的实现AOF 日志RDB 快… 文章目录 Redis 基础Redis 是什么有哪些特点为什么要使用 Redis 而不仅仅依赖 MySQLRedis 是单线程吗Redis 单线程为什么还这么快 Redis 数据类型和数据结构五种基本数据结构及应用场景其他数据类型Redis 底层数据结构 Redis 持久化数据不丢失的实现AOF 日志RDB 快照混合持久化AOF 和 RDB 的选择AOF 重写的执行过程RDB 快照的执行过程混合持久化的执行过程 Redis 功能和高可用性主从复制全量复制增量复制全量复制使用 RDB 的原因 哨兵模式切片集群集群脑裂 过期删除内存淘汰策略LRU 和 LFU 算法 Redis缓存缓存雪崩应对策略 缓存击穿缓存穿透常见原因及处理方法 保证数据库和缓存的一致性写策略读策略 保证删除缓存操作一定能成功重试机制订阅BINLog Redis 基础
Redis 是什么有哪些特点
Redis 是一个开源的基于内存的数据库具有以下特点
基于内存读写速度非常快适用于缓存、高性能应用场景。持久性支持将数据持久化到磁盘防止数据丢失。多数据结构支持字符串、哈希表、列表、集合、有序集合等。原子性操作保证操作的原子性确保数据一致性。分布式特性提供多种集群方案提高可扩展性和可用性。
为什么要使用 Redis 而不仅仅依赖 MySQL
高性能读写速度快适用于频繁读写的数据。高并发高效处理并发请求适用于快速响应的场景。丰富的数据结构处理特定类型数据和实现特定功能更灵活。减轻数据库压力缓存常用数据减轻 MySQL 等数据库的压力。
Redis 是单线程吗
Redis 的网络请求模块是单线程的但其他模块使用多线程以提高性能。
Redis 单线程为什么还这么快
基于内存存储内存访问速度快。非阻塞单线程避免多线程竞争和同步开销。高效的数据结构如 STRING、LIST、HASH 等。I/O 多路复用同时监听多个 Socket实现高效并发处理。
Redis 数据类型和数据结构
五种基本数据结构及应用场景
String字符串缓存对象、计数、分布式锁。底层的数据结构实现主要是SDS(简单动态字符串)List列表消息队列。底层数据结构是双向链表或者压缩列表Set集合点赞、共同关注、抽奖活动。底层由哈希表或整数集合都是整数且元素个数小于 512个实现Hash哈希缓存对象、购物车。底层由哈希表或压缩列表哈希类型元素个数小于512个所有值小于 64 字节实现Zset有序集合排行榜。底层数据结构压缩列表或跳表
其他数据类型
BitMap签到统计、用户登陆态判断。HyperLogLog基数统计如网页面 UV 计数。不准确。优点在输入元素的 数量或者体积非常非常大时所需的内存空间总是固定的、并且很小GEO存储地理位置信息。Stream消息队列。自动生成全局唯一ID支持以消费组形式消费数据
Redis 底层数据结构
SDS简单动态字符串动态扩容支持字符串和二进制数据。双端链表快速插入和删除。无法很好的利用CPU缓存内存开销比较大压缩列表压缩列表是一种紧凑的、可变⻓度由连续内存块组成的顺序型数据结构。在内存使用效率上比较高哈希表快速查询采用了拉链法解决哈希冲突。整数集合高效存储整数值。二进制表示跳表多层有序链表查找复杂度 O(logN)。quicklist双向链表压缩列表的组合。quicklist 就是一个链表而链表中的每个元素又是一个压缩列 表listpack只记录当前节点的长度避免连锁更新问题。
Redis 持久化
数据不丢失的实现
Redis 通过以下三种方式实现数据持久化将数据存储到磁盘确保在重启时可以恢复数据
AOF 日志记录每个写操作命令以日志形式存储。RDB 快照定期将内存数据快照保存为二进制文件。混合持久化结合 AOF 和 RDB 的优点提供更快的恢复速度和较少的数据丢失。
AOF 日志
机制先执行命令把数据写入内存记录每个写操作命令重启时重放日志恢复数据。优点避免记录错误命令不阻塞当前写操作。写回策略 Always每次写操作后立即写回磁盘最安全但性能较低。Everysec每秒写回一次折中方案性能和数据安全性较好。No由操作系统控制写回时机性能最高但数据安全性较低。 重写机制扫描数据中所有的键值对数据然后为每一个键值对生成一条写操作命令接着将该命令写入到新的 AOF 文件重写完成后就替换掉现有的 AOF 日志。重写的过程是由后台子进程完成的这样可以使得主进程可以继续正常处理命令。 触发时机 手动执行 bgrewriteaof 命令。主从复制完成。AOF 重写被设置为待调度执行。AOF 文件大小比例超出阈值以及 AOF 文件的大小绝对值超出阈值。
RDB 快照
机制记录某一时刻的内存数据快照以二进制方式保存到磁盘。优点数据恢复速度快文件体积小。缺点频率太低会丢失数据频率太高会影响性能。生成方式 save在主线程执行可能阻塞 Redis 的其他操作。bgsave在子进程执行避免阻塞主线程适合大规模数据保存。
混合持久化
机制结合 AOF 和 RDB先将内存数据以 RDB 方式写入 AOF 文件然后将增量命令以 AOF 方式写入。文件前半部分是 RDB 格式的全量数据加载速度快后半部分是 AOF 格式的增量数据数据丢失更少。优点快速恢复数据降低数据丢失风险结合了 RDB 的快速加载和 AOF 的持久性优势。缺点AOF 文件可读性变差兼容性较差Redis 4.0 之前版本不支持。
AOF 和 RDB 的选择
AOF 优点持久性更好丢失数据较少但恢复速度较慢。RDB 优点数据恢复速度快但快照频率难以掌控。混合持久化综合两者优点适合需要快速恢复数据且不希望数据丢失的场景。
AOF 重写的执行过程
启动重写手动或触发条件满足时Redis 启动 AOF 重写。生成新文件子进程遍历所有数据生成新的 AOF 文件。处理增量数据在生成新文件过程中增量数据被记录到缓冲区。替换旧文件新 AOF 文件生成完毕后增量数据写入新文件替换旧 AOF 文件。
RDB 快照的执行过程
save 命令主线程执行阻塞其他操作。bgsave 命令子进程执行避免主线程阻塞。文件生成快照生成的文件包含当前内存中的所有数据。文件加载重启时加载 RDB 文件恢复数据。
混合持久化的执行过程
启动重写AOF 重写过程中子进程将内存数据以 RDB 方式写入 AOF 文件。记录增量数据主线程处理的操作命令记录到重写缓冲区以 AOF 方式写入新文件。文件替换新文件生成后通知主进程将其替换旧文件。新文件前半部分为 RDB 格式数据后半部分为 AOF 格式数据。快速恢复重启时先加载 RDB 部分快速恢复大部分数据再加载 AOF 部分确保数据一致性。
Redis 功能和高可用性
主从复制 Redis 通过主从复制模式实现数据的高可用性保证数据副本的一致性。主从复制模式下读写操作分离
读操作主库和从库都可以接收。写操作先在主库执行然后同步到从库。
全量复制
建立连接从库与主库建立连接主库确认后开始同步。主库发送数据主库发送当前数据的 RDB 快照及增量写命令。从库接收数据从库接收 RDB 文件和增量写命令更新数据状态。
增量复制
从库发生宕机重新连接后数据的同步操作增量复制
从库宕机重连从库发生宕机主库会把断连期间收到的写操作命令写到repl_backlog_buffer中从库重新连接主库后发送 psync 命令并传递当前的复制偏移量slave_repl_offset。数据同步主库根据从库的复制偏移量决定进行增量复制还是全量复制从库相差 repl_backlog_buffer。
全量复制使用 RDB 的原因
压缩数据RDB 文件内容是经过压缩的二进制文件较小。性能影响小AOF 文件需要选择文件刷盘的策略选择不当会影响性能而 RDB 文件只在备份和同步时生成。
哨兵模式
Redis 的哨兵模式用于监控主从服务器提供主从节点故障转移的功能实现自动故障转移和高可用性。哨兵的功能包括
监控定期检查主从服务器状态。通知发现问题时通知相关人员。故障迁移自动主从切换。配置管理统一管理主从地址。
切片集群
当缓存数据量大到一台服务器无法承载时使用 Redis 切片集群将数据分布在多个服务器上降低系统对单主机点的依赖提高读写性能。切片集群的工作原理
数据分片将数据集划分为 16384 个槽每个节点管理部分槽的数据。节点间通信节点通过 gossip 协议互相通信保持一致性。数据分布根据键的 CRC16 哈希值确定数据属于哪个槽并存储到相应节点。故障检测哨兵机制检测节点状态重新分配槽并选举新主节点。客户端路由客户端根据键的哈希值确定目标节点直接与负责数据的节点通信。数据复制每个槽有一个主节点和若干个从节点数据写入主节点后异步复制到从节点。
集群脑裂
脑裂是指在网络故障时主节点的网络突然发生了问题与所有的从节点都失联但与客户端正常通信这些数据被主节点缓存到了缓冲区里。哨兵 也发现主节点失联了就会在从节点中选举出一个leader作为主节点导致出现多个主节点。解决方法
主节点写保护主节点在发现从节点断开或通信超时数量少于阈值时禁止写操作。从节点配置设置主节点需要从节点的 ACK 消息数量和延迟限制确保数据一致性。
过期删除
Redis 支持为键设置过期时间自动删除过期键值对采用以下删除策略
定时删除设置定时事件到时间自动删除键占用 CPU 时间多。惰性删除不主动删除访问键时检查其是否过期节省 CPU 时间但可能浪费内存。定期删除每隔一段时间随机抽取部分键进行检查和删除均衡 CPU 和内存使用。 Redis 选择「惰性删除定期删除」这两种策略配和使用以求在合理使用 CPU 时间和避免内存浪费之间取得平衡
内存淘汰策略
当内存不足时Redis 会根据配置的淘汰策略删除一些键以释放内存。常见策略
NoEviction不进行数据淘汰内存不足时返回错误。VolatileTTL优先淘汰更早过期的键。VolatileLRU对带过期时间的键使用 LRU 策略其他键使用 NoEviction 策略。VolatileRandom对带过期时间的键随机淘汰其他键使用 NoEviction 策略。VolatileLFU对带过期时间的键使用 LFU 策略其他键使用 NoEviction 策略。AllKeysLRU根据最近最少使用原则淘汰最久未使用的键。AllKeysRandom随机选择一个键进行淘汰。AllKeysLFU根据最少频繁使用原则淘汰最少使用的键。 可以使用 config get maxmemory-policy 命令来查看当前 Redis 的内存淘汰策略
LRU 和 LFU 算法
LRULeast Recently Used淘汰最近最少使用的对象。 实现随机取若干值淘汰最久未使用的对象。 LFULeast Frequently Used淘汰使用频率最低的对象。 实现维护使用计数淘汰使用计数最低的对象。
区别
LRU关注最近访问情况认为最近访问的对象更可能被再次访问。LFU关注使用频率认为使用频率低的对象未来访问概率低。
Redis缓存
由于用户请求频繁访问数据库直接访问数据库可能导致数据库崩溃因此常常使用Redis作为数据库的缓存层。
缓存雪崩
缓存雪崩某个时间点缓存中的大量数据同时失效大量请求涌向数据库导致数据库压力剧增。原因可能是缓存过期时间设置相近或Redis故障。
应对策略 大量数据同时过期 均匀设置过期时间加随机数避免大量数据同一时间失效。使用互斥锁确保同一时间只有一个请求构建缓存。后台线程定时更新缓存让缓存设置“永久有效”。 Redis故障宕机 服务熔断或请求限流减少直接对数据库的压力。构建Redis高可靠集群通过主从节点切换确保服务连续。
缓存击穿
缓存击穿热点数据过期时大量并发请求查询该数据导致直接访问数据库增加数据库负载。可以通过互斥锁或后台更新缓存来解决。
缓存穿透
缓存穿透请求的数据既不在缓存中也不在数据库中导致所有请求直接访问数据库增加负载。
常见原因及处理方法
业务误操作或恶意攻击。对非法请求做限制。缓存中设置空值或默认值。使用布隆过滤器判断数据是否存在。
保证数据库和缓存的一致性
Cache Aside策略
写策略
更新数据库后删除缓存。
读策略
缓存命中返回数据未命中从数据库读取数据后写入缓存并返回。
为了高缓存命中率可以采用更新数据库加更新缓存的方法但需解决并发导致的一致性问题例如加分布式锁或设置较短的缓存过期时间。
保证删除缓存操作一定能成功
重试机制
引入消息队列应用删除失败从消息队列重新读取数据再进行删除重试多次未成功则报错。
订阅BINLog
订阅binlog日志准确删除缓存中的数据。通过模拟MySQL从节点获取binlog解析后删除缓存数据。