Redis 核心知识与项目实践解析

简介: 本文围绕 Redis 展开,涵盖其在项目中的应用(热点数据缓存、存储业务数据、实现分布式锁)、基础数据类型(string 等 5 种)、持久化策略(RDB、AOF 及混合持久化)、过期策略(惰性 + 定期删除)、淘汰策略(8 种分类)。还介绍了集群方案(主从复制、哨兵、Cluster 分片)及主从同步机制,分片集群数据存储的哈希槽算法。对比了 Redis 与 Memcached 的区别,说明了内存用完的情况及与 MySQL 数据一致性的保证方案。此外,详解了缓存穿透、击穿、雪崩的概念及解决办法,如何保证 Redis 中是热点数据,Redis 分布式锁的实现及问题解决,以及项目中分布式锁
  1. 项目中 Redis 的应用场景:我们项目中 Redis 用得很广,主要有三个作用:一是做热点数据缓存和接口数据缓存;二是存储业务数据,像验证码、用户信息、用户行为数据、数据计算结果、排行榜数据等;三是实现分布式锁,解决并发环境下的资源竞争问题。
  2. Redis 的常用数据类型:有 5 种基础数据结构,分别是 string(字符串)、list(列表)、hash(字典)、set(集合)和 zset(有序集合)。
  3. Redis 的数据持久化策略:提供了两种方式将数据持久化到硬盘。一是 RDB 持久化(全量),在指定时间间隔内把内存中的数据集快照写入磁盘;二是 AOF 持久化(增量),以日志形式记录服务器处理的每一个写、删除操作。Redis 4.0 版本支持混合持久化方式,只需设置 aof-use-rdb-preamble yes。
  4. Redis 的数据过期策略:有两种。一是惰性删除,只有在取出 key 时才检查是否过期,对 CPU 友好,但可能有太多过期 key 未删除;二是定期删除,每隔一段时间抽取一批 key 检查过期情况,默认每秒扫描 10 次(可通过 hz 配置修改),每次抽 20 个,若过期比例超 25% 就循环抽取,且最大执行时间 25ms,避免卡死线程。Redis 采用定期删除 + 惰性删除的组合策略。
  5. Redis 的数据淘汰策略:共 8 种。淘汰易失数据的有 volatile-lru(最近最少用)、volatile-lfu(最不经常用)、volatile-ttl(将要过期)、volatile-random(随机);淘汰全库数据的有 allkeys-lru、allkeys-lfu、allkeys-random;还有不淘汰的 no-eviction(写操作报错)。
  6. Redis 集群使用及方案:我们项目用的是哨兵集群,一主二从,三个哨兵分布在三台 Linux 机器。了解的集群方案有三种:主从复制集群(读写分离,一主多从,解决高并发读)、哨兵集群(主从结构加哨兵监控,主节点故障时自动切换,解决高可用)、Cluster 分片集群(多主多从,解决高并发写和海量数据存储,每个主节点存部分数据)。
  7. Redis 主从同步:允许从节点从主节点通过网络拷贝完整数据备份,主库可读写,写操作自动同步到从库,从库只读。同步分两阶段:全量复制(slave 请求增量同步被拒后,master 生成 RDB 发送,slave 清空本地数据加载 RDB);增量复制(master 将 RDB 期间的命令记入 repl_baklog,持续发送给 slave,slave 执行命令保持同步)。
  8. Redis 分片集群数据存储和读取:采用哈希槽分区算法,共 16384 个哈希槽(0-16383),不同节点管理不同哈希槽。操作数据时,用 CRC16 算法对 key 计算后取模 16383(slot=CRC16 (key)%16383),得到对应的槽,再找到该槽所在节点进行存取。
  9. Redis 事务及命令:Redis 支持事务,相关命令有 MULTI、EXEC、DISCARD、WATCH,但我们开发中基本不用。
  10. Redis 与 Memcached 的区别:Redis 提供更复杂的数据结构和丰富操作,Memcached 仅支持简单字符串;Redis 原生支持集群,Memcached 不支持;Redis 支持持久化,重启可恢复数据,Memcached 不支持,重启数据清空。
  11. Redis 内存用完的情况:达到内存上限时,写命令返回错误,读命令正常;也可配置内存淘汰机制,达到上限时冲刷旧内容。
  12. Redis 与 MySQL 数据一致性保证:有几种方案,一是先更新 MySQL 再更新 Redis,可能因 Redis 更新失败导致不一致;二是先删 Redis 缓存再更新 MySQL,查询时重新添加缓存,高并发下性能低且可能有旧数据入缓存;三是用 MQ 异步同步,保证最终一致性。我们项目按业务选方案:一致性要求不高的场景不处理(如用户行为数据);时效数据设过期时间(如接口缓存设 60S,60S 后重新加载);一致性高但时效要求不高的场景,用 MQ 发送消息更新缓存直到成功(如首页广告、推荐数据);一致性和时效要求都高的场景,用 Seata 的 TCC 模式(很少用)。
  13. 缓存穿透及解决:指查询数据库和缓存都没有的数据,导致频繁访问数据库,压力增大。解决方案:缓存空对象(维护简单但效果一般);布隆过滤器(维护复杂但效果好)。
  14. 缓存击穿及解决:缓存中没有但数据库有的数据(通常缓存过期),并发用户多,同时查缓存未命中后都访问数据库,导致数据库压力骤增。解决方案:热点数据提前预热;设置热点数据永远不过期;加锁、限流。
  15. 缓存雪崩及解决:大量缓存在同一时间失效,大量请求落到数据库,导致数据库压力飙升,原因是 key 过期时间相同。解决方案:key 的过期时间引入随机因素。
  16. 保证 Redis 中是热点数据的方法:数据库有 1000 万数据,Redis 只能缓存 20 万时,配置 Redis 内存淘汰策略为 LFU 算法,淘汰使用频率低的数据,留下的就是热点数据。
  17. Redis 分布式锁实现及问题解决:主要靠 SETNX 指令(不存在时设值,成功返回 1,失败返回 0)实现。但需解决一些问题:死锁(上锁时设超时时间,如 stringRedisTemplate.opsForValue ().setIfAbsent (PRODUCT_ID, "binghe", 30, TimeUnit.SECONDS));锁超时(业务执行时间超锁超时,其他请求获取锁导致并发问题,可引入 watch dog 机制自动续期,或开子线程每 20S 重设超时时间);归一问题(确保加锁和解锁是同一线程,用 ThreadLocal 绑定唯一标识,存到锁值中,释放时校验);可重入问题(同一业务多次需获取锁时,用计数器,加锁计数器 + 1,解锁 - 1,减为 0 时从 Redis 删除锁);阻塞与非阻塞问题(获取锁失败时,可阻塞后续请求直到锁释放,用自旋思想,设置自旋超时避免资源消耗)。
  18. 项目中分布式锁的应用:最近项目中,任务调度时用 Redis 分布式锁防止集群部署下定时任务重复执行,后期因任务增多、规则复杂且单节点效率有限,切换为 XXL-JOB,就不再用分布式锁了。
相关文章
|
28天前
|
存储 缓存 NoSQL
Redis常见面试题全解析
Redis面试高频考点全解析:从过期删除、内存淘汰策略,到缓存雪崩、击穿、穿透及BigKey问题,深入原理与实战解决方案,助你轻松应对技术挑战,提升系统性能与稳定性。(238字)
|
2月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
225 86
|
2月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
2月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
2月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
112 0
|
3月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
5月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
347 41
|
5月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
263 6
|
8月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
372 61
Redis应用—6.热key探测设计与实践
|
6月前
|
缓存 NoSQL Java
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
137 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡

热门文章

最新文章