自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 布隆过滤器

布隆过滤器是一种高效的概率型数据结构,通过位数组和多个哈希函数实现元素存在性判断。其特点是内存占用小、查询速度快,但存在假阳性可能(不会出现假阴性)。核心机制包括:初始化时设置容量和误判率,添加元素时标记哈希位,查询时检查对应位状态。主要应用于URL去重、缓存系统等场景,支持Java(Guava/Commons)和Redis实现。需注意容量超限会提高误判率,且不支持元素删除操作。该结构在空间效率与准确性间取得平衡,是处理海量数据查询的理想选择。

2025-08-07 22:00:00 389

原创 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 666

原创 Redis 中 ZipList 的级联更新问题

Redis的ZipList是ZSet的压缩存储结构,采用紧凑连续存储。其组成包括头尾元数据和可变长度Entry项,其中prevlen字段根据前驱节点长度动态调整(1或5字节)。当插入超长节点时,可能引发级联更新:后续节点的prevlen需要扩展,进而可能触发连锁反应,导致性能下降。这种设计在内存效率和更新开销间取得平衡,但在极端情况下(如连续边缘长度节点)可能产生显著性能损耗。

2025-08-01 21:00:00 271

原创 Redis的 ZipList、SkipList 和 ListPack 之间的区别

Redis中ZSet数据结构历经迭代:早期使用ZipList和SkipList,Redis7.0后采用ListPack替代ZipList。SkipList通过多层索引实现O(logN)的高效查询和范围操作,但内存占用高;ZipList内存紧凑但存在级联更新风险;ListPack在保持紧凑存储的同时解决了级联更新问题。三种结构各具特点:SkipList适合大规模有序查询,ZipList/ListPack更适用于小数据存储,其中ListPack在7.0+版本成为默认实现,兼具内存效率和操作安全性。Redis会根

2025-08-01 19:00:00 331

原创 什么情况下会出现数据库和缓存不一致的问题?

摘要:文章分析了数据库与缓存数据不一致的问题。在非并发场景下,由于缓存和数据库操作的原子性无法保证,必然出现不一致。并发场景中,无论是"先写DB后更新缓存"还是"先更新缓存后写DB"的顺序,都可能因线程交错导致最终不一致。此外,读写并发时,读取线程可能将旧值写入缓存。虽然这种情况概率较低,但根据墨菲定律仍需重视。文章强调这些不一致问题是系统设计中必须考虑的关键问题。

2025-07-29 21:30:00 317

原创 缓存失效算法有哪些

缓存失效算法比较:FIFO、LRU、LFU与W-TinyLFU。FIFO简单高效但精确度低;LRU基于最近访问时间,适合时间局部性场景;LFU基于访问频率,适合频率差异大的数据,但存储开销大。W-TinyLFU融合二者优势,采用窗口缓存和SLRU策略,平衡命中率与内存占用,能动态适应访问模式变化,是大规模缓存系统的优选方案。

2025-07-29 19:30:00 1027

原创 缓存失效算法 LRU 和 LFU 的区别

摘要:LRU和LFU是两种常见的缓存淘汰算法。LRU基于访问时间,淘汰最久未使用的数据,通过链表维护访问顺序;LFU基于访问频率,淘汰使用最少的数据,通过引用计数排序实现。示例对比显示,对于相同访问序列,LFU会淘汰低频率数据(如D),而LRU淘汰最久未使用的数据(如B)。两种算法各有侧重,LRU适合时间局部性强的场景,LFU适合访问频率差异大的场景,实际应用中需根据数据特征选择。

2025-07-25 18:21:32 166

原创 Redis中key过期了一定会立即删除吗

Redis采用被动与主动结合的Key过期删除机制。被动删除在访问时检查Key过期并删除;主动删除每秒10次随机检查20个过期Key,当过期率>25%时循环处理,直到达标或超时。两种策略各有优劣:被动删除节省资源但内存占用高,主动删除及时但增加系统开销。配置方面,被动删除自动生效,主动删除需设置maxmemory和hz参数。Redis不保证Key过期立即删除,大量Key过期时会有延迟。

2025-07-24 19:15:13 354

原创 Redis的事务和Lua之间的区别

Redis提供事务和Lua脚本两种原子操作方案。事务通过MULTI/EXEC执行命令序列,失败不影响后续命令,但需多次网络交互且不支持流程控制。Lua脚本只需一次网络交互,支持命令间结果依赖和复杂逻辑处理,但错误会中断执行。两者都确保原子性但都不支持回滚,开发者可根据网络开销、流程复杂度等需求选择合适方案。

2025-07-24 18:54:57 843

原创 Redis的Pipeline

Redis Pipeline机制通过批量发送命令优化网络性能,减少往返通信次数。相比传统单命令模式,Pipeline允许客户端一次性发送多个指令,服务器顺序执行后返回结果。该机制与事务不同,不保证原子性。通过Java Jedis客户端示例展示了Pipeline的典型用法:批量执行set、append、incr等操作后统一获取响应,显著提升批量处理效率,特别适合高延迟网络环境下的Redis操作优化。

2025-07-24 18:42:11 737

原创 Redis 的事务机制是怎样的?

Redis事务机制提供原子性执行,但不支持回滚操作。从2.6.5版本开始,Redis会在命令累积阶段检测错误,执行EXEC时发现错误会拒绝执行事务。事务执行中发生错误会继续执行剩余命令而非回滚。Lua脚本在并发层面具有原子性,但不满足ACID原子性,在集群环境存在限制。常用事务命令包括MULTI、EXEC、WATCH等。在电商场景中,可通过Jedis使用事务实现下单扣减库存等操作,通过判断exec()返回值确认事务是否成功执行。

2025-07-23 20:00:00 969

原创 Redis能完全保证数据不丢失吗?

Redis4.0引入的RDB-AOF混合持久化模式,通过结合RDB和AOF两种机制的优势,提升了数据可靠性。然而,由于Redis本质上是内存数据库,即便配置最严格的Always策略,在硬件故障、系统崩溃或磁盘性能瓶颈等情况下,仍无法保证100%数据不丢失。Redis的设计初衷并非强一致性存储,若对数据持久性要求极高,建议选择关系型数据库。

2025-07-23 18:30:00 251

原创 RDB和AOF的写回策略分别是什么?

Redis提供RDB和AOF两种持久化机制。RDB支持自动触发(通过save参数设置时间/键数阈值)和手动触发(SAVE/BGSAVE命令)。AOF提供三种写回策略:Always(同步写回)、Everysec(每秒异步刷盘)和No(由OS控制),其中Everysec在性能与可靠性间取得平衡,最常用。RDB适合定期备份,AOF提供更细粒度的持久化控制。

2025-07-23 18:30:00 267

原创 Redis 5.0中的 Stream是什么?

RedisStream是Redis5.0引入的持久化消息队列数据结构,支持有序消息存储、消费者组管理和消息回溯。核心特性包括严格的消息排序、多消费者协同处理、持久化存储和消费位点记录。相比传统Pub/Sub,它解决了消息易失问题,支持主备复制和断线恢复。主要应用于消息队列、实时日志和即时通讯等场景,通过XADD/XREADGROUP等命令实现消息生产和消费,消费者组机制确保消息可靠传递。底层采用分块存储结构,支持消息的增删查改操作以及消费状态跟踪。

2025-07-22 18:31:51 357

原创 Redis中的setnx命令为什么是原子性的

Redis的SETNX命令通过单线程架构确保原子性:检查key是否存在,不存在则设置值返回1,存在则返回0。由于单线程顺序执行,其他客户端必须等待当前SETNX完成,避免并发冲突。但多个命令组合仍需事务或分布式锁保证数据一致性。

2025-07-22 15:08:54 225

原创 Redis为什么被设计成是单线程的?

Redis采用单线程模型主要处理网络IO和键值操作,其他模块如持久化仍使用多线程。其单线程设计基于内存操作特性:CPU非主要瓶颈,采用多路复用I/O技术提升效率,避免多线程的并发控制和性能开销问题。虽然核心操作为单线程,但Redis从4.0版本开始已部分支持多线程处理。该设计兼顾性能与维护性,内存操作的高效性使单线程足以应对主要需求。

2025-07-22 14:52:06 837

原创 如何实现“查找附近的人“功能?

Redis的Geospatial数据类型支持高效地理位置查询,通过GEOADD存储用户坐标,GEORADIUS查询指定范围内的用户。示例代码展示了如何用Java实现"查找附近的人"功能,包括添加用户位置和查询指定半径内的用户,适用于社交、门店搜索等场景。该方法利用经纬度信息,实现简单高效的地理位置服务。

2025-07-18 14:21:37 362

原创 什么是GEO,有什么用?

RedisGEO提供地理空间数据存储和查询功能,支持添加坐标(GEOADD)、计算距离(GEODIST)、坐标转换(GEOHASH)及范围查询(GEORADIUS/GEOSEARCH)。例如可存储城市坐标并通过GEORADIUS查询指定半径内的地点,适用于门店搜索等场景。命令支持返回距离、坐标等详细信息,通过经度纬度实现高效地理位置服务。

2025-07-17 17:25:59 138

原创 Redis为什么要自己定义SDS?

Redis采用自定义的SDS(简单动态字符串)替代C语言原生字符串,解决了C字符串无法存储任意字符和操作效率低下的问题。SDS通过alloc和len字段记录总长度和当前长度,避免了遍历操作,使字符串操作更高效。这种设计既支持任意字符存储,又提升了Redis处理字符串的性能。

2025-07-17 13:50:06 236

原创 如何在 Redis Cluster 中执行 lua 脚本?

Redis Cluster中跨节点Lua脚本和事务的执行问题可通过HashTag机制解决,该功能确保相关键存储在相同节点。HashTag通过{}包裹键名部分,仅计算其内容哈希值实现数据共置。其他方案包括应用层处理、操作拆分等,而Redis 7.0.11新增的allow-cross-slot-keys配置仅支持单命令跨槽操作,不能真正实现原子性事务。HashTag是最推荐的解决方案,类似MySQL分库分表的基因法设计。

2025-07-17 11:19:07 250

原创 Redis Cluster 中使用事务和 lua 有什么限制?

RedisCluster采用主从架构实现高可用,数据分片存储在不同节点。与MySQL类似,RedisCluster的事务和Lua脚本存在跨节点限制:所有操作键必须位于同一节点,否则会失败。跨节点执行Lua脚本会报"commandkeysmustinsameslot"错误。官方文档(https://redis.io/docs/latest/operate/oss_and_stack/reference/cluster-spec/)详细说明了这一限制。解决方案待探讨。

2025-07-17 09:01:35 223

原创 Lua脚本保证的原子性是什么?

Redis中Lua脚本的原子性具有双重特性:在并发层面保证执行的不可分割性(原子性),但在数据库层面不满足ACID原子性(不保证操作全部成功或回滚)。Lua是一种高效、跨平台的轻量级脚本语言,适合嵌入应用程序扩展功能。虽然Lua脚本能在单机Redis中实现原子操作,但在集群环境下存在使用限制(未展开说明)。

2025-07-16 09:05:06 424

原创 为什么Redis 6.0引入了多线程?

Redis 6.0引入多线程特性,但仅用于网络请求处理环节,数据读写仍保持单线程模式。虽然单线程Redis在小数据包处理上可达8-10万QPS,但随着业务规模扩大,网络IO成为主要瓶颈。多线程设计有效提升网络处理并行度,减少IO等待时间,同时充分利用多核CPU资源。值得注意的是,核心数据操作仍由单线程执行,既提升了性能又保障了系统稳定性。这种创新设计在保持Redis原有优势的同时,满足了企业对更高性能的需求。

2025-07-15 17:22:57 315

原创 Redis 和 Memcached 的区别

Redis与Memcached对比摘要:Redis支持多种数据结构、持久化和事务处理,适合复杂应用场景;Memcached仅支持键值对,无持久化,但多线程架构使其在简单缓存场景中性能优异。选择时需根据数据结构复杂度、持久化需求等决定。

2025-07-15 16:44:49 110

原创 Redis 使用什么协议进行通信?

Redis采用自行设计的RESP协议进行通信,该协议基于TCP且简单高效。RESP使用\r\n分隔数据,格式包含参数个数、长度和内容,支持多种数据类型。示例展示了SET命令的请求(*3\r\n$3\r\nSET...)和响应(+OK\r\n),协议还支持事务、脚本等高级功能。RESP因其易解析性在业界被广泛应用。

2025-07-15 15:46:52 210

原创 什么是Redis的数据分片?

Redis数据分片通过哈希槽机制将数据分散在多个节点上,采用16384个固定槽位设计。这种设计综合考虑了消息大小(2K)、集群规模(≤1000节点)和负载均衡等因素,采用CRC16算法快速计算key所属槽位。核心优势在于提升性能、支持弹性扩展和保障高可用性,通过自动故障转移和数据迁移实现高效集群管理。

2025-07-15 09:30:35 554

原创 什么是缓存击穿、缓存穿透、缓存雪崩?

缓存击穿:是指当某一key的缓存过期时大并发量的请求同时访问此key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。缓存穿透:是指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应有的作用。缓存雪崩:是指当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。

2025-07-14 17:18:09 746

原创 什么是大Key问题,如何解决?

Big Key是Redis中存储了大量数据的Key,不要误以为big key只是表示Key的值很大,他还包括这个Key对应的value占用空间很多的情况,通常在String、list、hash、set、zset等类型中出现的问题比较多。一般来说,如果一个key的value比较大,占用的内存比较多,或者某个key包含的元素数量比较多,这些都可以被认为是大key。1、影响性能:由于big key的values占用的内存会很大,所以读取它们的速度会很慢,会影响系统的性能。

2025-07-12 13:56:40 743

原创 Redis的热Key问题

当我们使用Redis作为存储时,如果发生一些特殊情况,比如明星官宣的突发事件,世界杯等重大活动,双十一的活动秒杀等等,就会出现特别大的流量,并且会导致某些热词、商品等被频繁的查询和访问。这也是为什么某某明星官宣之后,微博上面就会出现宕机的情况。有时候这种宕机发生后,其他功能都是可以使用的,只是和这个热点有关的内容会无法访问,这其实就和热点数据有关系了。对于事前预测就是根据一些根据经验,提前的识别出可能成为热key的Key,比如大促秒杀活动等。

2025-07-10 14:21:06 679

原创 Redis的内存淘汰策略是怎么样的?

Redis 的内存淘汰策略用于在内存满了之后,决定哪些 key 要被删除。Redis 支持多种内存淘汰策略,可以通过配置文件中的 maxmemory-policy 参数来指定。

2025-07-10 09:20:23 259

原创 Redis 的过期策略

定期删除其实并不会立即释放内存,而是把这些键标记为“已过期”,并放入一个专门的链表中。然后,在Redis的内存使用率达到一定阈值时,Redis会对这些“已过期”的键进行一次内存回收操作,释放被这些键占用的内存空间。一般来说,这些被删除的内存空间会被操作系统标记为“可重用的内存”,等待被重新分配。因此,即使Redis进行了内存回收操作,也并不能保证Redis所占用的内存空间会立即释放给操作系统。需要注意的是,即使Redis进行了内存回收操作,也不能完全保证被删除的内存空间会立即被系统回收。

2025-07-10 09:16:46 143

原创 Redis的持久化机制是怎样的?

Redis提供RDB和AOF两种持久化机制。RDB通过快照实现,文件小恢复快但可能丢失数据;AOF记录所有写操作,可靠性高但占用空间大且负载高。Redis 4.0支持RDB-AOF混合模式,兼具启动速度快和数据丢失风险低的优势。业务可根据需求选择单独或混合使用这两种机制。

2025-07-08 19:56:13 304

原创 Redis中的ZSet是怎么实现的

ZSet(也称为Sorted Set)是Redis中的一种特殊的数据结构,它内部维护了一个有序的字典,这个字典的元素中既包括了一个成员(member),也包括了一个double类型的分值(score)。这个结构可以帮助用户实现记分类型的排行榜数据,比如游戏分数排行榜,网站流行度排行等。当ZSet的元素数量比较少时,Redis会采用ZipList(ListPack)来存储ZSet的数据。ZipList(ListPack)是一种紧凑的列表结构,它通过连续存储元素来节约内存空间。

2025-07-08 19:46:43 327

原创 Redis的多路复用

在Redis 中,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。其实,Redis的IO多路复用程序的所有功能都是通过包装操作系统的IO多路复用函数库来实现的。每个IO多路复用函数库在Redis源码中都有对应的一个单独的文件。IO多路复用在Linux下包括了三种,select、poll、epoll,抽象来看,他们功能是类似的,但具体细节各有不同。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。

2025-07-08 09:00:19 216

原创 Redis为什么这么快

在Redis 中,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。其实,Redis的IO多路复用程序的所有功能都是通过包装操作系统的IO多路复用函数库来实现的。每个IO多路复用函数库在Redis源码中都有对应的一个单独的文件。IO多路复用在Linux下包括了三种,select、poll、epoll,抽象来看,他们功能是类似的,但具体细节各有不同。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。

2025-07-08 08:48:01 114

原创 Redis的集群模式有哪些

Redis有三种主要的集群模式,用于在分布式环境中实现高可用性和数据复制。这些集群模式分别是:主从复制(Master-Slave Replication)、哨兵模式(Sentinel)和Redis Cluster模式。

2025-07-07 20:02:43 602

原创 什么是CAP理论,为什么不能同时满足

这里面的一致性,其实指的是强一致性,但是强一致性也并不是大家普遍认为的:"all nodes see the same data at the same time",这只是其中一种情况,或者说是一种强一致性模型。网上有很多关于CAP的介绍,其中关于一致性、可用性及分区容错性的介绍也有很多,但是这里需要重新纠正一下CAP中这三个特性的意思(注意,可用性和分区容错性很多人都不会理解错误,但是一致性可能和大家认为的不太一样(甚至和网上99%讲CAP的文章都不一样)。每次读取都会收到最新的写入数据或错误信息。

2025-07-07 19:39:02 208

原创 Redis是AP的还是CP的

然而,WAIT 仅能确保数据在 Redis 实例中有指定数量的副本中被确认,它并不能将一组 Redis 实例转变为具有强一致性的 CP 系统:在故障转移期间,已确认的写操作仍然可能会丢失,这取决于 Redis 持久化的具体配置。然而,使用 WAIT 后,在发生故障事件时丢失写操作的概率大大降低,只在某些难以触发的故障模式下才会发生。当一个节点宕机时,这个节点上的数据可能无法同步到其他节点,这就可能导致数据在节点之间的不一致。,即在某个时间点读取的数据可能并不是最新的,但最终会达到一致的状态。

2025-07-07 09:08:13 180

原创 Redis 支持哪几种数据类型?

另外,Redis中还支持一些高级的数据类型,如:Streams、Bitmap、Geospatial以及HyperLogLog。

2025-07-07 08:37:15 93

空空如也

空空如也

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

TA关注的人

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