安防网站建设优点,跨平台 移动网站开发,什么是手机网站,wordpress importRedis 实践指南与核心概念
一、Java 中常用的 Redis 使用场景与实践 缓存#xff08;Caching#xff09; 场景#xff1a;热点数据、频繁访问的数据#xff0c;如商品详情、用户信息。通过缓存减少数据库压力#xff0c;提高系统响应速度。 工业界实践#xff1a; 淘宝…Redis 实践指南与核心概念
一、Java 中常用的 Redis 使用场景与实践 缓存Caching 场景热点数据、频繁访问的数据如商品详情、用户信息。通过缓存减少数据库压力提高系统响应速度。 工业界实践 淘宝/天猫商品详情页、用户会话、购物车等核心数据大量使用 Redis 缓存通过多级缓存CDN - Nginx/OpenResty Lua - 本地缓存 - Redis Cluster - DB分担流量降低数据库压力。秒杀场景下利用 Redis 预热库存、扣减库存并通过 Lua 脚本保证原子性。美团大规模 KV 存储服务如 Squirrel 内存 KV、Cellar 持久化 KV承载万亿级请求保持高可用性广泛应用于团购、外卖等业务的核心数据缓存 。拼多多/字节跳动类似电商、内容推荐等场景也大量使用 Redis 作为缓存层优化数据读取性能支撑高并发访问。 实现在 Java 中通常使用 Spring Cache、Redisson 或 Jedis 等客户端。Spring Cache 提供了声明式缓存支持通过注解即可实现。 示例 Servicepublic class ProductService {Autowiredprivate RedisTemplateString, Object redisTemplate;Cacheable(value products, key #productId, unless #result null)public void getProductById(Long productId) {}
}配置与引用 Maven 依赖引入 spring-boot-starter-data-redis 和 spring-boot-starter-cache。application.properties 配置spring.redis.hostlocalhost
spring.redis.port6379
spring.redis.password
spring.redis.database0
spring.redis.timeout5000ms
spring.cache.typeredis
# 配置缓存的默认过期时间例如1小时
spring.cache.redis.time-to-live3600000Key 命名规范工业界通常会采用 业务域:业务类型:唯一标识 的方式例如 product:detail:123user:info:abc。这有助于管理和排查问题。过期时间根据数据热度、一致性要求设置。对于强一致性要求不高的数据可以设置较长过期时间对于实时性要求高的数据过期时间应短或配合消息队列进行主动失效。 分布式锁Distributed Locks 场景在分布式系统中确保同一时间只有一个服务实例能执行特定代码块防止并发问题如秒杀系统库存扣减、防止重复提交订单。工业界实践 电商平台淘宝、拼多多在秒杀、抢购等高并发场景下广泛使用 Redis 分布式锁来控制库存的原子性扣减防止超卖。通常会结合 Lua 脚本保证操作的原子性并利用 Redisson 等框架提供的看门狗机制自动续期避免死锁。美团/滴滴在订单处理、支付、优惠券发放等核心业务流程中使用分布式锁来保证数据一致性避免重复操作或并发冲突。 实现基于 Redis 的 SETNX 命令或 SET key value NX EX实现。工业界常用 Redisson 框架它提供了更高级的锁功能如可重入锁、公平锁、看门狗机制自动续期。示例Autowired
private RedissonClient redissonClient;
public void processOrder(String orderId) {RLock lock redissonClient.getLock(order_lock: orderId);try {// 尝试获取锁等待10秒锁自动释放5秒看门狗默认30秒这里是手动设置if (lock.tryLock(10, 5, TimeUnit.SECONDS))// 业务逻辑处理订单例如扣减库存、创建订单记录}} catch (InterruptedException e) {Thread.currentThread().interrupt();System.err.println(Order processing interrupted for orderId : e.getMessage());} finally {// 确保锁被当前线程持有才释放防止误删if (lock.isLocked() lock.isHeldByCurrentThread()) {lock.unlock();}}
}避坑指南 必须设置过期时间防止因服务宕机导致死锁。使用唯一标识避免误删其他线程的锁。任务执行时间 锁超时时间避免业务未完成锁已释放导致并发问题。Redisson 的看门狗机制可以自动续期缓解此问题。 消息队列Message Queue 场景异步处理、服务解耦、流量削峰填谷如订单支付成功后的后续处理发货、积分、日志收集、数据同步。工业界实践 美团/饿了么在订单状态变更、配送信息更新、用户消息通知等场景利用 Redis 作为轻量级消息队列实现服务间的异步通信和解耦。字节跳动/快手在短视频、直播等场景利用 Redis Stream 存储用户行为日志、点赞、评论等实时数据进行实时处理和分析。电商平台用于处理用户下单后的异步操作如库存扣减、积分发放、短信通知等避免阻塞主流程。 实现利用 Redis 的 ListLPUSH/BRPOP或 Stream 数据结构。List 简单易用适合简单的队列Stream 功能更强大支持消费者组、消息持久化等更适合复杂的 MQ 场景。示例List 实现简单队列Autowired
private StringRedisTemplate redisTemplate;public void sendMessage(String queueName, String message) {redisTemplate.opsForList().leftPush(queueName, message); // 生产者从左侧入队}public String receiveMessage(String queueName) {// 消费者阻塞式从右侧出队等待0秒表示一直阻塞直到有消息String message redisTemplate.opsForList().rightPop(queueName, 0, TimeUnit.SECONDS);return message;
}计数器/排行榜Counters/Leaderboards 场景实时统计网站访问量、文章点赞数、商品销量、游戏积分榜、用户活跃度。
二、Redis 核心原理与面试要点 为什么 Redis 这么快 基于内存所有数据都存储在内存中避免了磁盘 I/O 的开销。单线程模型Redis 内部使用单线程处理所有请求避免了多线程的上下文切换开销和锁竞争问题。虽然是单线程但 Redis 采用了 I/O 多路复用技术如 epoll、kqueue可以在一个线程中同时监听多个 socket 连接实现高并发。高效的数据结构Redis 内部实现了多种高效的数据结构如跳跃表Skip List、压缩列表Zip List、哈希表Hash Table等针对不同的数据类型进行了优化使得操作效率极高。非阻塞 I/O使用 I/O 多路复用避免了传统阻塞 I/O 的等待。C 语言实现C 语言的执行效率高且对内存控制更精细。 Redis 的主要数据结构及应用场景 String字符串最基本的数据类型可以存储字符串、整数或浮点数。常用于缓存、计数器、分布式锁配合 SETNX。 底层实现SDSSimple Dynamic String类似于 C 的 std::string支持动态扩容减少内存重新分配次数并记录长度获取字符串长度为 O(1)。 Hash哈希键值对集合适合存储对象。常用于存储用户信息、商品信息等。 底层实现当哈希的键值对数量较少且键值长度较小时使用 ziplist压缩列表存储节省内存否则使用 hashtable哈希表。 List列表有序的字符串列表可以从两端进行插入和删除。常用于消息队列、最新消息列表。 底层实现Redis 3.2 之前使用 ziplist 和 linkedlist之后统一使用 quicklist它是一个双向链表每个节点是一个 ziplist兼顾了内存效率和操作性能。 Set集合无序的字符串集合元素唯一。常用于存储共同关注、抽奖活动、标签。 底层实现当集合中元素都是整数且数量较少时使用 intset整数集合存储节省内存否则使用 hashtable。 ZSet有序集合有序的字符串集合每个元素关联一个分数通过分数进行排序。常用于排行榜、带权重的任务队列。 底层实现当有序集合中元素数量较少且元素长度较小时使用 ziplist 存储否则使用 skiplist跳跃表和 hashtable 的组合跳跃表用于快速查找和范围查询哈希表用于 O(1) 时间复杂度获取元素分数。 Geospatial地理空间存储地理位置信息可以计算两点距离、查找附近的人/地点。底层基于 ZSet 实现。HyperLogLog用于基数统计不重复元素的数量例如统计网站 UV。允许一定误差但内存占用极小。StreamRedis 5.0 引入的新的数据结构类似于 Kafka支持多消费者组、消息持久化、消息回溯等。适用于消息队列、事件日志。 Redis 持久化机制 RDBRedis Database快照持久化在指定时间间隔内将内存中的数据集快照写入磁盘。优点是恢复速度快适合备份缺点是可能丢失最后一次快照之后的数据。AOFAppend Only File增量持久化记录 Redis 执行的每个写命令。优点是数据完整性高丢失数据少缺点是文件可能较大恢复速度相对 RDB 慢。混合持久化Redis 4.0RDB 和 AOF 的结合启动时加载 RDB 文件再重放 AOF 文件中 RDB 快照之后的操作兼顾了恢复速度和数据完整性。 Redis 淘汰策略内存满了怎么办 当 Redis 内存达到上限时会根据配置的淘汰策略来删除键。noeviction默认策略不删除任何键写操作会报错。allkeys-lru从所有键中选择最近最少使用的键进行淘汰。volatile-lru从设置了过期时间的键中选择最近最少使用的键进行淘汰。allkeys-random从所有键中随机淘汰。volatile-random从设置了过期时间的键中随机淘汰。allkeys-ttl从所有键中选择即将过期的键进行淘汰。volatile-ttl从设置了过期时间的键中选择即将过期的键进行淘汰。 Redis 事务 Redis 事务通过 MULTI、EXEC、DISCARD、WATCH 命令实现。MULTI开启事务后续命令入队。EXEC执行所有入队命令。DISCARD取消事务清空命令队列。WATCH监视一个或多个键如果在事务执行前这些键被其他客户端修改则事务会被打断乐观锁。特点Redis 事务是原子性的要么都执行要么都不执行但不支持回滚命令入队时检查语法错误执行时即使出错也不会回滚。 Redis 主从复制 目的实现数据冗余、读写分离、故障恢复。原理主节点负责写操作从节点负责读操作。主节点将写命令同步给从节点。全量复制当从节点第一次连接主节点或断线重连后主节点会生成 RDB 文件发送给从节点从节点加载 RDB 文件。增量复制主从节点都维护一个复制偏移量和复制积压缓冲区主节点将新的写命令发送给从节点。 Redis Sentinel哨兵 目的解决主从复制的自动故障转移问题实现高可用。功能监控 Redis 主从节点状态、自动故障转移当主节点宕机时从节点中选举新的主节点、通知客户端新的主节点地址。部署通常部署多个 Sentinel 实例形成 Sentinel 集群通过投票机制决定是否进行故障转移。 Redis Cluster集群 目的解决单机 Redis 的容量和并发瓶颈实现分布式存储和高可用。分片Redis Cluster 采用哈希槽Hash Slot的方式进行数据分片共有 16384 个哈希槽每个键通过 CRC16 算法计算哈希值然后对 16384 取模决定分配到哪个槽。节点每个节点负责一部分哈希槽节点之间通过 Gossip 协议进行通信维护集群状态。高可用每个主节点可以有多个从节点当主节点宕机时从节点可以自动晋升为主节点。扩容与缩容支持在线扩容和缩容通过迁移哈希槽实现。 缓存穿透、缓存击穿、缓存雪崩 缓存穿透查询一个不存在的数据导致每次请求都打到数据库。解决方案布隆过滤器、缓存空对象。缓存击穿某个热点数据过期大量请求同时打到数据库。解决方案设置热点数据永不过期、加分布式锁。缓存雪崩大量缓存同时失效导致所有请求都打到数据库。解决方案缓存过期时间错开、多级缓存、熔断降级。 Redis 为什么没有替代品 性能卓越在内存数据库领域Redis 的性能表现非常突出能够满足绝大多数高并发场景的需求。 功能丰富除了基本的键值存储还提供了丰富的数据结构和功能如发布订阅、事务、Lua 脚本等能够应对多种复杂业务场景。 生态成熟拥有庞大的社区支持、丰富的客户端库和完善的周边工具易于集成和使用。 简单易用API 简洁明了学习成本低部署和维护相对简单。 高可用和扩展性通过主从复制、Sentinel、Cluster 等机制提供了完善的高可用和横向扩展解决方案。 应用广泛在互联网行业得到了广泛应用积累了大量的实践经验和解决方案。 工业界实践 新闻/内容推荐平台字节跳动、腾讯新闻实时统计文章阅读量、点赞数、评论数并根据这些指标生成热门文章排行榜。电商平台淘宝、京东实时更新商品销量、评价数并用于生成商品热销榜、好评榜。游戏公司实时更新玩家积分、排名用于游戏排行榜。 实现使用 String 的 INCR/DECR 命令实现简单计数使用 Sorted SetZSet实现排行榜ZSet 能够根据分数自动排序。 示例ZSet 实现排行榜 Autowired
private StringRedisTemplate redisTemplate;public void updateScore(String userId, double score) {redisTemplate.opsForZSet().add(game_leaderboard, userId, score);}public SetZSetOperations.TypedTupleString getTopPlayers(long count) {// 获取分数从高到低的前N名玩家SetZSetOperations.TypedTupleString topPlayers redisTemplate.opsForZSet().reverseRangeWithScores(game_leaderboard, 0, count - 1);return topPlayers;
}Session 共享Session Sharing 场景分布式部署的 Web 应用如微服务架构用户登录后 Session 需要在不同服务实例间共享以实现无状态服务。工业界实践 大型互联网公司几乎所有大型分布式 Web 应用都会将用户 Session 存储在 Redis 中以实现 Session 共享和高可用。这使得用户在访问不同服务实例时无需重新登录提升用户体验。微服务架构在微服务体系中Session 共享是实现无状态服务的重要一环Redis 作为高性能的内存数据库是理想的 Session 存储方案。 实现将 Session 存储到 Redis 中。Spring Session Redis 提供了开箱即用的解决方案无需手动管理 Session 的存取。配置示例Spring Boot# application.properties
spring.session.store-typeredis
spring.redis.hostlocalhost
spring.redis.port6379
# ... 其他 Redis 配置布隆过滤器Bloom Filter 场景判断一个元素是否存在于一个大规模集合中允许一定的误判率但绝不允许漏判。常用于防止缓存穿透查询不存在的数据导致数据库压力、垃圾邮件过滤、用户黑名单。工业界实践 新闻/内容推荐平台字节跳动用于判断用户是否已读某篇文章避免重复推荐或用于过滤垃圾评论、敏感词。电商平台淘宝、拼多多在防止缓存穿透方面发挥重要作用预先判断商品 ID、用户 ID 等是否存在减少对数据库的无效查询。美团/滴滴在黑名单过滤、防止恶意请求等方面有应用。 实现Redis Modules 提供了布隆过滤器功能如 RedisBloomJava 客户端如 Redisson 可以集成。示例// 假设使用 Redisson 的 RBloomFilter
Autowired
private RedissonClient redissonClient;public void checkAndAddUser(String userId) {RBloomFilterString bloomFilter redissonClient.getBloomFilter(user_exists_filter);// 初始化布隆过滤器预计插入1000万个元素误判率1% (m10000000, fpp0.01)// 实际生产中这些参数应根据业务需求精确计算if (!bloomFilter.isInitialized()) {bloomFilter.tryInit(10000000L, 0.01);}if (!bloomFilter.contains(userId)) {// 布隆过滤器说不存在则一定不存在。执行业务逻辑并添加到布隆过滤器bloomFilter.add(userId);// 实际业务查询数据库如果存在则添加到缓存如果不存在则缓存空值} else {// 布隆过滤器说可能存在则可能存在有误判率。继续查询缓存或数据库}
}三、缓存一致性解决方案
缓存策略写入策略×失效策略缓存策略 写入策略 \times 失效策略缓存策略写入策略×失效策略
常用模式 Cache-Aside旁路缓存 读流程$ \text{先读缓存} \rightarrow \text{缓存未命中} \rightarrow \text{读DB} \rightarrow \text{回填缓存} $写流程$ \text{先更新DB} \rightarrow \text{再删除缓存} $工业界实践这是最常用的模式简单有效。删除缓存而非更新缓存是为了避免并发写导致的数据不一致问题例如线程A更新DB后更新缓存线程B在线程A更新DB后、更新缓存前更新DB并更新缓存导致缓存中是旧数据。 Write-Through直写缓存 所有写操作同时更新缓存和DB。工业界实践通常用于对数据一致性要求极高且写操作不频繁的场景。性能开销较大因为每次写都要同步更新两个存储。 Write-Behind回写缓存 写操作只更新缓存然后异步地将数据回写到DB。工业界实践性能最高但数据一致性风险最大因为数据可能只存在于缓存中尚未写入DB。适用于对数据丢失不敏感的场景如日志、计数器。
数据同步公式
Tconsistencymax(Tdb_write,Tcache_invalid)δnetworkT_{consistency} \max(T_{db\_write}, T_{cache\_invalid}) \delta_{network} Tconsistencymax(Tdb_write,Tcache_invalid)δnetwork
四、常见问题解决清单与工业界应对
问题类型现象解决方案工业界应对缓存雪崩大量 Key 同时失效导致大量请求直接打到数据库使数据库宕机。1. 随机过期时间在原有过期时间上增加随机值使 Key 分散失效。 2. 多级缓存引入本地缓存或二级缓存。 3. 熔断降级当 Redis 不可用时直接返回默认值或错误保护数据库。工业界实践大型互联网公司通常会结合随机过期、多级缓存如 Guava Cache/Caffeine、服务熔断Hystrix/Sentinel等手段。对于重要数据有时会设置永不过期通过消息队列或定时任务主动更新。缓存穿透查询不存在的数据缓存不命中导致每次请求都穿透到数据库造成数据库压力。1. 布隆过滤器预先存储所有可能存在的 Key查询前先通过布隆过滤器判断 Key 是否存在。 2. 缓存空值对于查询结果为空的数据也将其缓存起来并设置较短的过期时间。工业界实践广泛使用布隆过滤器进行第一层过滤结合缓存空值策略有效拦截恶意攻击和无效查询。热 Key 问题单个 Key 访问量过大导致 Redis 某个节点或单机 Redis的 CPU 或网络带宽成为瓶颈。1. 本地缓存在应用层增加本地缓存如 Caffeine减少对 Redis 的访问。 2. Key 分片将热 Key 分散到多个 Key 上例如 hotkey:1, hotkey:2通过哈希等方式访问。 3. 读写分离对于读多写少的场景可以考虑将热 Key 的读请求分发到多个 Redis 从节点。工业界实践大型互联网公司通常会结合本地缓存、Key 分片如将商品库存拆分为多个 Key、以及 Redis 集群的读写分离能力来应对。对于极热 Key甚至会考虑在 CDN 层进行缓存。大 Key 问题单个 Value 过大例如超过 1MB导致网络传输开销大、Redis 内存碎片化、主从复制延迟、AOF/RDB 持久化效率低。1. 数据拆分将大 Value 拆分为多个小 Key-Value 存储 。 2. 压缩存储对 Value 进行压缩后再存储 。 3. 选择合适的数据结构例如使用 Hash 存储对象而不是将整个 JSON 字符串作为 String 存储 。工业界实践普遍严格限制 Key 的大小例如建议不超过 10KB最大不超过 512MB但实际开发中应远小于此 22 。通过代码规范、Lint 工具、以及 Redis 监控系统进行检测和治理 。对于不可避免的大 Key会进行拆分或压缩 。Key 过期时间Key 的存活时长设置不合理导致数据提前失效或长期占用内存。根据业务场景和数据特性合理设置过期时间。对于需要长期存在的 Key可以设置为永不过期并通过业务逻辑或消息队列进行主动更新/删除。工业界实践很多公司会强制要求 Key 的最大存活时长例如 1天、7天防止 Key 长期占用内存或因业务逻辑错误导致 Key 无法删除。对于特殊场景需要申请白名单。
五、Redis 核心数据结构 基础类型 字符串String最基本的数据类型可以存储字符串、整数或浮点数。支持位操作Bitmap。 命令示例SET key value, GET key, INCR key, DECR key, GETBIT key offset, SETBIT key offset value 哈希Hash存储键值对的集合适合存储对象。一个 Hash 可以存储多个字段和值。 命令示例HSET user:1 name Alice age 30, HGET user:1 name, HGETALL user:1 列表List有序的字符串列表底层是双向链表实现。可以作为队列或栈使用。 命令示例LPUSH queue task1 task2, RPUSH queue task3, LPOP queue, RPOP queue, LRANGE queue 0 -1 集合Set无序的字符串集合元素唯一。支持集合间的操作如交集、并集、差集。 命令示例SADD tags redis mysql, SMEMBERS tags, SISMEMBER tags redis, SINTER set1 set2 有序集合ZSetSet 的一个扩展每个成员都关联一个分数score通过分数进行排序。适用于排行榜、带权重的队列。 命令示例ZADD leaderboard 100 user1 90 user2, ZRANGE leaderboard 0 -1 WITHSCORES, ZSCORE leaderboard user1 高级结构 位图Bitmap实际上是 String 类型通过位操作实现。常用于统计用户活跃度、签到等。 命令示例SETBIT login:20231101 100 1 (表示用户ID 100在2023年11月1日活跃) HyperLogLog用于基数估算统计独立元素的数量允许有少量误差但内存占用极小。适用于统计 UV、独立访客数等。 命令示例PFADD ip_20231101 192.168.1.1 192.168.1.2, PFCOUNT ip_20231101 地理空间GEO存储地理位置信息经度、纬度并支持计算距离、查找附近的人/地点。 命令示例GEOADD cities 116.40 39.90 Beijing, GEODIST cities Beijing Shanghai, GEORADIUS cities Beijing 100 km 流StreamRedis 5.0 引入的全新数据结构类似于 Kafka支持多生产者、多消费者、消费者组、消息持久化等。适用于构建消息队列、事件溯源等。 命令示例XADD orders * product_id 1001 user_id 200, XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS orders
六、Redis 新特性解析 Redis 7.0 Multi-Part AOF 特性将 AOF 文件分割为多个片段如 appendonly.1.aof, appendonly.2.aof而不是一个巨大的文件。优势 文件大小控制单个 AOF 文件不会无限增长便于管理。重写效率提升增量式重写替代全量重写减少重写时的阻塞时间。故障恢复加速只需加载损坏的片段而不是整个 AOF 文件提高恢复速度。 Redis 8.0 布隆过滤器原生支持 特性Redis 8.0 计划原生支持布隆过滤器无需通过 Redis Modules。优势更低的部署和使用成本更好的性能和稳定性。与模块版对比 参数模块版RedisBloom原生实现Redis 8.0内存占用可变固定预分配误判率可配置默认 0.1%可能可配置集群支持需同步自动同步
七、思维导图框架
#mermaid-svg-ru2LLAFQRHE9QBYD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ru2LLAFQRHE9QBYD .error-icon{fill:#552222;}#mermaid-svg-ru2LLAFQRHE9QBYD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ru2LLAFQRHE9QBYD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ru2LLAFQRHE9QBYD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ru2LLAFQRHE9QBYD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ru2LLAFQRHE9QBYD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ru2LLAFQRHE9QBYD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ru2LLAFQRHE9QBYD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ru2LLAFQRHE9QBYD .marker.cross{stroke:#333333;}#mermaid-svg-ru2LLAFQRHE9QBYD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ru2LLAFQRHE9QBYD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ru2LLAFQRHE9QBYD .cluster-label text{fill:#333;}#mermaid-svg-ru2LLAFQRHE9QBYD .cluster-label span{color:#333;}#mermaid-svg-ru2LLAFQRHE9QBYD .label text,#mermaid-svg-ru2LLAFQRHE9QBYD span{fill:#333;color:#333;}#mermaid-svg-ru2LLAFQRHE9QBYD .node rect,#mermaid-svg-ru2LLAFQRHE9QBYD .node circle,#mermaid-svg-ru2LLAFQRHE9QBYD .node ellipse,#mermaid-svg-ru2LLAFQRHE9QBYD .node polygon,#mermaid-svg-ru2LLAFQRHE9QBYD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ru2LLAFQRHE9QBYD .node .label{text-align:center;}#mermaid-svg-ru2LLAFQRHE9QBYD .node.clickable{cursor:pointer;}#mermaid-svg-ru2LLAFQRHE9QBYD .arrowheadPath{fill:#333333;}#mermaid-svg-ru2LLAFQRHE9QBYD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ru2LLAFQRHE9QBYD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ru2LLAFQRHE9QBYD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ru2LLAFQRHE9QBYD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ru2LLAFQRHE9QBYD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ru2LLAFQRHE9QBYD .cluster text{fill:#333;}#mermaid-svg-ru2LLAFQRHE9QBYD .cluster span{color:#333;}#mermaid-svg-ru2LLAFQRHE9QBYD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ru2LLAFQRHE9QBYD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}Redis知识体系实践应用核心概念缓存分布式锁消息队列计数器/排行榜Session共享布隆过滤器常见问题与应对数据结构持久化集群新特性基础类型高级结构RDBAOFMP-AOF主从复制哨兵分片集群Redis 7.0 MP-AOFRedis 8.0 布隆过滤器八、开源项目设计todo
项目名Redis-Solution-Kit
目录结构
├── distributed_lock
│ ├── redlock.py # Redlock实现
│ └── test_deadlock.py
├── cache_consistency
│ ├── double_delete.py # 双删策略
│ └── binlog_sync.py # 基于MySQL binlog同步
├── bloom_filter
│ ├── redis8_native.py # 原生布隆过滤器
│ └── scaling_bf.py # 动态扩容实现
└── disaster_recovery├── avalanche.py # 雪崩防护└── penetration.py # 穿透防护