自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 Redis学习总结

本文摘要: Redis作为高性能内存数据库,采用AP模型实现最终一致性,支持多种数据结构(String、Hash、List、Set等)。其核心特性包括:1)自定义SDS字符串提升效率;2)SortedSet采用listpack和skiplist结构;3)集群模式支持主从/哨兵/Cluster;4)数据分片通过16384个哈希槽实现;5)持久化机制结合RDB快照和AOF日志;6)内存管理采用惰性删除+定期删除策略;7)单线程架构+IO多路复用保证高性能。Redis与Memcached相比功能更丰富,但需注意热

2025-08-07 21:00:00 759

原创 RocketMQ如何保证消息的顺序性?

RocketMQ顺序消费机制摘要:通过队列分区保证消息顺序性,生产者使用MessageQueueSelector确定目标队列(如取模路由),必须同步发送。消费者通过MessageListenerOrderly实现顺序处理,采用三级加锁机制(Broker、MessageQueue、ProcessQueue)确保消费顺序,特别防止重平衡时的重复消费。顺序消费会降低吞吐量并可能导致消息阻塞,需谨慎使用。

2025-12-18 15:26:33 161

原创 RocketMQ的事务消息是如何实现的?

RocketMQ的事务消息机制通过TransactionListener接口实现,采用半消息+本地事务+状态确认的三阶段流程。首先发送标记为"prepared"的半消息并存储,执行本地事务后根据结果提交或回滚消息。通过事务状态检查、超时回滚等机制确保最终一致性,解决了传统方案中消息丢失和状态追踪问题,实现了事务操作与消息投递的原子性。

2025-12-18 09:22:28 300

原创 RocketMQ 的架构

RocketMQ架构由生产者、Broker和消费者三大核心组件构成。生产者发送消息到Broker,消费者从Broker获取消息。Broker集群负责消息存储和转发,NameServer维护Broker元数据。消息按Topic逻辑分类,每个Topic包含多个物理存储单元MessageQueue,消费者从指定Queue获取消息。这种架构支持高可用集群部署,实现高效的消息处理。

2025-12-17 15:43:42 400

原创 Redis Hash 与 Java HashMap 对比

Redis的hash结构底层采用ziplist/listpack和hashtable两种实现,根据元素数量和值大小自动选择。ziplist内存高效但操作慢O(n),hashtable操作快O(1)但内存开销大。Java的HashMap采用数组+链表+红黑树结构,非线程安全,需额外同步处理。Redis采用单线程天然线程安全,且通过渐进式rehash平滑扩容;而HashMap一次性扩容会阻塞。Redis适合小数据量存储,无需渐进迁移。两者在性能和内存使用上各具特点,需根据具体场景选择。

2025-11-18 15:04:35 187

原创 Redis 的 ZSet 实现排行榜

本文介绍了在Redis中使用zset实现排行榜的优化方案。针对默认zset在相同分数时按value排序的问题,提出将score设计为浮点数形式:整数部分存储用户得分,小数部分存储处理后的时间戳(1-timestamp/1e13)。该方案能确保首先按得分降序排列,同分时按时间戳升序排列(先达分的用户排名靠前),有效解决同分用户的时间排序问题,并提供了Java代码示例。

2025-11-18 15:04:18 145

原创 用Redis实现朋友圈点赞功能

本文介绍了基于Redis ZSet实现朋友圈点赞功能的技术方案。通过将朋友圈ID作为ZSet的Key,用户ID作为value,时间戳作为score,实现了高效点赞记录与管理。方案支持点赞/取消点赞操作,并能按时间顺序展示用户列表。文中提供了Java代码示例,包括点赞、取消点赞和查询点赞列表的核心实现逻辑。该方案利用Redis特性确保了数据唯一性和高效查询,适合社交场景的点赞功能开发。

2025-11-18 15:04:02 184

原创 Redis内存碎片详解

内存碎片是Redis中已分配但未被利用的内存空间,主要由jemalloc分配器的固定内存块划分和数据结构的自动扩容导致。可通过INFO memory查看碎片率,正常范围为1.0-1.5。Redis 4.0+提供了后台碎片整理功能,通过CONFIG SET activedefrag yes开启,并配合阈值参数(如50%-70%碎片率触发)和CPU控制参数进行优化。严重时也可重启解决。该机制能有效回收碎片内存而不影响服务。

2025-11-15 08:54:21 546

原创 ZSet为什么在数据量少的时候用ZipList,而在数据量大的时候转成SkipList?

Redis ZSet根据数据规模智能选择底层结构:元素数量<128且长度≤64字节时使用内存紧凑的ZipList(O(N)操作),否则切换为支持高效查询的SkipList(O(logN)操作)。这种设计在内存效率和查询性能间取得平衡,ZipList适合小数据节省内存,SkipList则优化大数据操作性能,展现了Redis对不同场景的适应性优化能力。(149字)

2025-11-15 08:54:06 159

原创 Redis中的setnx和setex的区别?

Redis提供了SETNX和SETEX两种键值设置命令。SETNX仅在键不存在时设置值但不支持过期时间,适用于分布式锁等场景;SETEX则无条件设置值并指定过期时间,常用于缓存控制。要实现"仅当键不存在时设置并带过期时间"的操作,可采用两种方式:非原子操作需要先SETNX再EXPIRE,或者使用推荐方案SET key value NX EX seconds原子操作。理解这些命令差异有助于合理选择应用方案。

2025-11-15 08:53:53 262

原创 Redis 8.0有哪些新特性

Redis 8.0重大更新(2025.5发布):开源协议新增AGPLv3选项,免费版更名RedisOpenSource。核心升级包括8种新数据结构(向量集合、原生JSON、概率统计结构等),吞吐量提升112%达200万QPS,AI场景支持66K-160K向量/秒计算。混合存储技术使成本降低80%,并整合AI辅助开发工具RedisCopilot。该版本特别优化了时序数据处理和索引管理能力,主从复制性能提升18%。原生集成布隆过滤器等概率结构,无需插件即可使用。

2025-11-15 08:53:32 364

原创 Redis中hash结构比string的好处有哪些

摘要:String和Hash在Redis中存储对象各有特点。String需序列化整个对象为JSON存储,修改时要完整读写;Hash可直接存储键值对,支持字段级修改,效率更高。虽然String可通过多个独立键存储对象属性,但会增加键数量,浪费空间。相比之下,Hash结构在字段修改和存储效率上具有明显优势,是存储对象的更佳选择。

2025-11-15 08:51:53 137

原创 Redis的事务和MySQL的事务区别?

摘要:Redis提供轻量级事务机制,支持命令序列化执行但不具备回滚功能,以单线程模型确保简单高效。相比之下,MySQL严格遵循ACID原则,提供多级隔离控制(READ UNCOMMITTED至SERIALIZABLE),通过锁机制和日志系统实现完整的事务管理。Redis侧重性能牺牲一致性,MySQL则强调数据可靠性,两者在事务处理上形成性能与安全性的典型权衡。

2025-11-14 14:41:43 155

原创 Redisson 如何保证解锁的线程一定是加锁的线程

摘要:Redisson通过线程ID绑定机制防止分布式锁误删。加锁时在Redis hash中记录线程ID,解锁时验证当前线程ID是否匹配。核心流程包括:1)加锁存储线程ID作为hash字段;2)解锁通过Lua脚本检查线程ID是否存在;3)ID匹配才执行解锁操作。该机制确保只有加锁线程能解锁,避免跨线程误删问题。

2025-11-14 14:38:18 200

原创 Redis如何高效安全的遍历所有key

Redis提供了KEYS和SCAN两种遍历键的方法。KEYS命令能快速匹配特定模式的键(如KEYS*返回所有键),适合小型数据库,但会阻塞服务器。SCAN命令使用游标分批迭代,每次返回部分结果,避免阻塞,更适合生产环境。示例代码分别展示了使用Jedis客户端实现KEYS和SCAN命令的方法。

2025-11-14 14:33:58 162

原创 如何用setnx实现一个可重入锁?

本文介绍了使用Redis实现可重入分布式锁的方法。通过线程标识和计数器来记录锁的重入状态,支持同一线程多次获取锁而避免死锁。文章提供了两种实现方案:1)基于Java的同步实现,使用setnx命令,通过线程ID和计数器组合维护锁状态;2)更高效的Lua脚本方案,利用Redis的原子性操作,包含获取锁和释放锁的完整脚本。两种方案都实现了锁重入计数、安全释放等关键功能,确保分布式环境下锁的正确性和可靠性。Lua脚本方案性能更优,适合高并发场景。

2025-11-14 14:30:22 122

原创 如何用Redis实现乐观锁?

Redis通过WATCH命令实现乐观锁,其核心原理是CAS机制。具体流程为:1)使用WATCH监视键值;2)GET获取当前值;3)MULTI开启事务;4)SET命令修改值;5)EXEC执行事务。若监视的键在事务执行前被修改,则EXEC返回nil表示执行失败。文中还提供了Java中使用Jedis实现乐观锁的完整示例代码,展示了如何监视键值、读取数据、执行事务并处理并发冲突。该机制确保了只有在数据未被修改时才能成功执行事务操作。

2025-11-14 14:25:53 167

原创 为什么Redis不支持回滚

Redis设计上舍弃事务回滚机制,主要基于性能与简洁性考量。官方定位为缓存系统而非关系型数据库,其单线程执行模型和原子性操作特性已满足核心需求。为保持高效,Redis选择不引入回滚带来的额外开销和复杂度,认为错误应在开发阶段处理。这一设计权衡体现了Redis专注基础数据服务、追求简单高效的核心理念,将复杂事务需求交由传统数据库处理。

2025-11-11 19:25:04 294

原创 Redisson 的 lock 和 tryLock 有什么区别

Redisson分布式锁的lock和tryLock方法主要区别在于获取策略和返回值:tryLock支持设置等待时间,立即返回获取结果(boolean),适用于非阻塞场景;lock则是阻塞式获取,无限等待直到成功,适用于必须获取锁的场景。tryLock可指定最大等待时间(waitTime)和租期(leaseTime),而lock仅需设置leaseTime。使用时应根据业务需求选择:tryLock适合可容忍获取失败的场景,lock适合必须获取锁的场景。两者都需在finally中释放锁。

2025-11-11 19:19:26 171

原创 Redisson 和 Jedis 的区别

Redisson和Jedis是两大Java Redis客户端,各有特点。Redisson提供丰富的高级功能,如分布式锁、集合、对象和服务,支持线程安全和异步操作,适合复杂场景。Jedis则轻量简单,仅封装基本Redis命令,适合对性能要求高、功能需求简单的应用。选择时,根据项目需求决定:需要高级功能选Redisson,追求轻量选Jedis。两者都支持认证和SSL,但Redisson在序列化和框架集成方面更强大。

2025-11-11 19:15:49 330

原创 Redis Key-Value 设计规范

本文总结了Redis键值设计的核心原则。Key设计强调语义清晰、命名规范(限定字符)、业务前缀命名空间和长度控制;Value设计注重合理选择数据结构、拆分大Key、设置过期机制、数据压缩和内存优化配置。通过遵循这些原则,可以实现高效、规范化的Redis数据存储与访问,提升系统性能并优化内存使用。这些最佳实践对Redis数据库的设计和维护具有重要指导意义。

2025-11-11 19:15:21 171

原创 如何基于Redis实现滑动窗口限流

摘要:滑动窗口限流是一种基于时间窗口的流量控制策略,通过Redis的ZSET数据结构实现,能有效平滑控制接口访问频率。核心原理是记录请求时间戳并清理过期数据,统计当前窗口内请求数进行限流判断。可采用Lua脚本保证原子性操作,或直接使用Redisson框架的令牌桶算法实现。相比固定速率限制,滑动窗口能更好应对突发流量,避免资源浪费。

2025-11-11 19:09:05 301

原创 Redis中有一批key瞬间过期,为什么其它key的读写效率会降低?

Redis主线程处理key过期会影响性能,特别是大批量key同时过期会导致主线程阻塞。解决方案包括:1)为key设置随机过期时间,避免集中过期;2)优先使用被动删除机制,仅在访问时才删除key。这些方法可以减轻删除压力,防止缓存雪崩,但被动删除可能导致内存占用较高。

2025-11-10 10:47:32 178

原创 Redis 的 Key 过期机制解析:即时删除真的能实现吗?

Redis采用主动删除和被动删除两种Key过期处理机制。被动删除在访问Key时检查并删除过期项;主动删除则每秒10次随机抽取20个Key检查删除,当过期比例超过25%时会重复执行。主动删除能及时释放内存但增加开销,被动删除减少开销但可能导致内存占用偏高。通过参数hz可调整主动删除频率,maxmemory设置内存上限。Redis不保证Key过期时能立即删除,大量过期时可能出现延迟。

2025-11-10 10:20:08 270

原创 Redis集群的脑裂问题

摘要:脑裂现象指分布式系统中出现多个主节点的情况,导致数据不一致等问题。Redis中可能因网络分区或主节点故障产生脑裂。通过设置min-slaves-to-write和min-slaves-max-lag参数可缓解问题,当条件不满足时主节点拒绝写入。但该方案无法完全消除脑裂风险,如主节点在切换期间仍可能短暂可写。合理配置能降低数据丢失概率,但需根据实际场景权衡参数设置。

2025-11-10 09:59:39 323

原创 如何基于Redisson实现一个延迟队列

Redisson的RDelayedQueue是基于Redis zset实现的分布式延迟队列,支持按指定延迟时间投递元素。使用时需先配置Redisson客户端,通过RDelayedQueue的offer方法添加延迟消息并设置时间,到期后消息会自动转移到关联的RBlockingDeque队列,使用take方法可阻塞获取到期消息。该实现结合了zset存储和内存队列功能,适用于订单超时等延迟处理场景。

2025-11-10 09:57:51 113

原创 Redis的渐进式rehash

Redis哈希表扩容采用渐进式rehash机制,通过双哈希表结构平滑迁移数据。初始操作在哈希表1执行,触发扩容后创建哈希表2并逐步迁移数据:每次操作时从rehashindex位置迁移当前桶数据,保持服务可用性。查询时先查哈希表1,未命中再查哈希表2。最终完成迁移后,释放原表并切换主表,避免一次性迁移导致的性能问题。这种设计确保了Redis在扩容时的高效性和稳定性。

2025-11-10 09:49:14 269

原创 Redisson解锁失败,watchdog会不会一直续期下去?

Redisson解锁机制通过双重保障确保锁自动续期终止:1.解锁方法unlockAsync0在执行解锁前后都会调用cancelExpirationRenewal终止续期;2.采用CompletionStage.handle机制,无论解锁成功或失败都会执行续期取消操作。该方法会从续期任务映射表中移除当前线程,确保后续不会自动续期。整个设计通过异步编程和状态管理,可靠地解决了分布式锁解锁后的自动续期问题。

2025-11-08 19:26:38 165

原创 时间轮算法详解

时间轮算法是一种高效的定时任务调度方法,通过环形轮盘结构实现任务管理。基础实现采用60个秒级槽位,通过指针周期性移动触发槽位任务执行。为扩展时间范围,可通过增加槽位、调整指针间隔或引入round机制(记录任务轮次)实现。更优方案是分层时间轮,将不同粒度任务分配到相应层级(如秒级/分钟级),任务到期后自动下放执行。该算法广泛应用于Netty、Kafka等框架,处理网络超时、消息清理等场景。

2025-11-08 17:16:04 456

原创 Redisson 的 Watchdog 机制

Redisson的Watchdog机制解决了Redis分布式锁的超时问题,通过后台定时任务(默认每10秒)自动续期锁有效期至30秒。该机制在获取未指定超时的锁时触发,使用Netty时间轮和LUA脚本实现续期控制,并在锁释放或客户端关闭时自动终止。核心逻辑包含续期条件检查、定时调度和异常处理等功能,确保锁在业务执行期间持续有效,同时避免因应用崩溃导致的锁长期占用问题。

2025-11-08 15:39:03 347

原创 Redisson 中为什么要废弃 RedLock

RedLock算法是基于Redis的分布式锁方案,但存在安全性和可靠性问题,已不被官方推荐。Redisson框架因此弃用该实现。主要问题包括:未经充分验证、网络分区风险、维护复杂等。替代方案包括单实例Redis锁(允许短暂故障)、基础锁+业务层保障(结合幂等控制),或使用ZooKeeper等强一致性组件。当前业界尚未形成统一方案,需根据业务场景权衡选择。

2025-11-08 14:59:19 232

原创 RedLock:Redis分布式锁解决方案

摘要:RedLock是Redis作者提出的多节点分布式锁算法,用于解决单节点Redis锁的单点故障问题。其核心原理是在超过半数的Redis节点上成功获取锁(使用SETNX命令),通过多节点部署提高可靠性。虽然RedLock在网络分区等极端情况下仍存在问题,但相比单节点方案更健壮。Java可通过Redisson库实现RedLock。该算法曾引发Martin Kleppmann和Antirez关于可靠性的争论,前者指出时钟漂移等问题,后者则认为其本质正确且足够可靠。

2025-11-08 14:25:02 364

原创 锁机制详解:公平锁与非公平锁

摘要:本文详细解析了公平锁与非公平锁的核心机制。公平锁严格按照线程申请顺序分配资源,避免饥饿但吞吐量低;非公平锁允许插队,效率高但可能引发线程饥饿。通过ReentrantLock源码分析,展示了NonfairSync和FairSync类的关键实现差异:非公平锁直接尝试CAS获取,而公平锁需先检查队列状态。默认推荐非公平锁因其更高的吞吐性能,公平锁则适用于需要严格顺序的场景。

2025-11-07 16:36:46 209

原创 Redis分布式锁的最佳实践:基于Redisson的实现方案

摘要:本文介绍了Redis分布式锁的实现方案。传统SETNX锁存在锁续期问题,而Redisson提供的分布式锁更为完善。重点讲解了Redisson的看门狗机制、可重入锁实现及配置方式,包括基础使用、超时设置、公平锁、联锁、红锁等高级特性。Redisson还支持读写锁,满足多读单写场景需求,是当前主流的Redis分布式锁解决方案。

2025-11-07 16:19:47 280

原创 如何用SETNX实现分布式锁

摘要:Redis分布式锁通过SETNX命令确保互斥访问,利用Redis单线程特性保证原子性。实现包含获取锁(tryLock)和释放锁(unlock)两个核心方法,前者使用NX/PX参数实现带超时的原子加锁,后者通过Lua脚本保证校验和删除的原子性。虽然实现简单高效,但存在不支持锁续期、可能死锁等缺陷,建议生产环境使用Redisson框架实现更完善的分布式锁功能。(150字)

2025-11-07 16:06:48 301

原创 Redis 性能优化的 10 条最佳实践

本文总结了Redis使用中的10个关键注意事项:1)避免阻塞主线程的操作;2)慎用清库命令;3)控制数据块大小;4)合理设置过期时间;5)重要数据开启持久化;6)Lua脚本避免死循环;7)频繁更新数据建议使用Hash;8)避免复杂计算;9)高可用推荐集群架构;10)高并发建议分布式锁。这些建议涵盖性能优化、内存管理、数据可靠性等方面,帮助开发者规避常见陷阱,充分发挥Redis的高性能优势。

2025-10-13 16:56:38 97

原创 Redis除了做缓存还能用来干什么

Redis作为高性能缓存,支持多场景应用:消息队列(不推荐)、延迟消息(不推荐)等可用但非最佳方案;计数器(推荐)、排行榜(推荐)等原生功能适用;分布式锁(推荐)、Session(推荐)等利用单线程特性;GEO(推荐)、布隆过滤器(推荐)等特殊结构表现优异。不同场景需评估适用性,合理选择功能。

2025-10-13 16:12:08 541

原创 Redis如何实现发布/订阅?

Redis发布订阅模式是一种高效的消息通信机制,支持发布者向频道推送消息,订阅者接收指定频道的实时更新。该模式适用于即时通讯、日志处理、实时数据推送等场景,具有高实时性和灵活订阅优势,但也存在可靠性问题和负载风险。使用时通过PUBLISH/SUBSCRIBE命令操作,支持多客户端同时订阅,采用异步通信机制。注意:随着Redis Stream功能的推出,该模式正逐渐被替代。

2025-10-13 15:40:12 863

原创 Redis如何实现延迟消息

许多Redis用户都知道Redis具备过期监听功能。只需在中添加配置 notify-keyspace-events Ex开启过期监听,然后在代码中实现 KeyExpirationEventMessageListener即可监听key过期事件。这样就能在接收到过期消息时执行订单关单操作。但该此外,在Redis 5.0之前,该消息通过PUB/SUB模式发送,不做持久化处理。如果客户端在消息发送时宕机,恢复后将彻底丢失该消息。

2025-10-13 11:22:15 333

原创 为什么需要延迟双删,两次删除的原因是什么?

解决方案 - 延迟双删: 通过写线程在执行"删缓存→更新数据库"后,延迟1-2秒再次删除,可有效清除可能被读线程写入的脏数据。对于低并发场景,单次删除通常已能满足需求。此时若第二步失败将直接导致数据不一致。

2025-10-10 19:36:29 180

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除