Redis(基础篇 + 实践篇 )
01 | 基本架构:一个键值数据库包含什么?
Redis 作为一个内存数据存储系统,它的架构设计非常简洁,但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。
-
客户端与服务器架构:
- 客户端通过 TCP 协议连接到 Redis 服务器,Redis 使用客户端与服务器模式来处理请求。所有请求都被发送到一个主 Redis 实例,客户端与 Redis 服务器的交互通过 RESP (Redis Serialization Protocol) 协议进行数据传输。该协议轻量且高效,确保了 Redis 高性能的请求处理。
- 由于 Redis 是单线程的,客户端发送的请求被一次性地处理并返回响应,避免了线程切换的开销。
-
数据存储:
- Redis 将数据存储在内存中,而不是传统的磁盘存储。由于内存读写速度比磁盘快得多,Redis 能够在大规模并发访问的情况下依然保持低延迟和高吞吐量。
- Redis 支持的数据类型不仅仅是字符串,还包括哈希、列表、集合、有序集合等,使得它能够处理复杂的应用场景。
-
持久化机制:
- RDB(Redis 数据库快照):通过定期保存数据库状态来实现持久化。RDB 文件是压缩格式,可以快速加载,但存在数据丢失的风险。
- AOF(Append-Only File):通过将每个写操作追加到日志文件来实现持久化。AOF 能够保证数据的持久化,但相较于 RDB 更占用磁盘空间,且恢复速度较慢。
02 | 数据结构:快速的 Redis 有哪些慢操作?
Redis 提供了非常丰富的数据结构,可以高效地处理不同场景的数据需求。但并不是所有操作都高效,以下是一些常见的慢操作:
-
字符串(String):
- Redis 字符串是基础数据类型,虽然对简单的读写操作非常高效,但当你频繁修改较大的字符串时,操作可能会变得缓慢。特别是当字符串长度超过内存的一定阈值时,Redis 需要进行内存重分配,可能会导致性能瓶颈。
-
哈希(Hash):
- 哈希类型是 Redis 用来存储对象的理想选择,但是执行
HGETALL
等操作时,如果哈希中的字段较多,可能会出现性能下降的情况,因为它需要遍历所有的字段。
- 哈希类型是 Redis 用来存储对象的理想选择,但是执行
-
列表(List):
- 列表数据类型支持高效的两端操作,如
LPUSH
和RPUSH
。但如果使用LRANGE
来查询整个列表,特别是当列表很长时,性能会下降。Redis 内部会遍历列表中的所有元素,导致操作变慢。
- 列表数据类型支持高效的两端操作,如
-
集合(Set):
- 集合支持高效的集合操作,如交集、并集和差集。然而,类似
SINTER
和SUNION
等操作,当集合的元素非常多时,也会引起性能下降。
- 集合支持高效的集合操作,如交集、并集和差集。然而,类似
-
有序集合(Sorted Set):
- 有序集合用于存储带有权重(score)的元素,并能够按权重进行排序。操作如
ZREVRANGE
或ZRANGE
会涉及大量的排序操作,如果集合中有大量的数据,可能会导致性能问题。
- 有序集合用于存储带有权重(score)的元素,并能够按权重进行排序。操作如
优化技巧:
- 避免在集合中存储大量元素,特别是当需要频繁读取或操作所有数据时。
- 对于大数据量的操作,可以考虑通过分片(Sharding)来减少单个 Redis 实例的压力。
03 | 高性能 IO 模型:为什么单线程 Redis 能那么快?
Redis 是单线程的,这意味着它所有的请求都在一个线程中处理。那么,为什么 Redis 仍然能够在高并发场景下表现出色呢?
-
事件驱动架构:
- Redis 使用了 I/O 多路复用(IO Multiplexing)机制,常见的技术有
epoll
或select
。这意味着 Redis 通过一个线程管理多个连接,它可以高效地处理多个客户端的请求。 - 通过非阻塞的方式,Redis 能够在一个线程内快速切换和处理多个请求。每当一个请求完成后,Redis 会立刻响应,处理下一个请求。
- Redis 使用了 I/O 多路复用(IO Multiplexing)机制,常见的技术有
-
内存存储:
- Redis 是基于内存的数据库,数据的访问速度非常快。内存操作的延迟通常在微秒级别,而不像磁盘存储那样需要进行大量的 I/O 操作。
- 由于 Redis 所有的数据都存储在内存中,它避免了磁盘读写的延迟,因此即便是单线程,也能够支持极高的请求吞吐量。
-
轻量级的命令:
- Redis 的命令非常简洁,每个命令的执行时间非常短,不需要复杂的计算过程。Redis 能够快速地解析命令并执行操作,减少了处理请求的时间。
04 | AOF 日志:宕机了,Redis 如何避免数据丢失?
AOF(Append-Only File)是 Redis 的一种持久化机制,它可以保证在 Redis 宕机或重启时,数据不会丢失。AOF 记录每个写操作,将其追加到日志文件中。
-
AOF 的写入策略:
- Redis 提供了三种 AOF 写入策略:
- 每次写操作都同步到磁盘:这确保数据持久化最为可靠,但会对性能产生很大影响。
- 每秒同步一次:每秒钟将写操作同步到磁盘,这是 Redis 默认的策略,平衡了数据可靠性和性能。
- 不进行同步:Redis 将写操作缓存到内存中,稍后批量写入磁盘。此策略的性能最好,但可能会导致数据丢失。
- Redis 提供了三种 AOF 写入策略:
-
AOF 重写机制:
- AOF 文件会随着时间变得越来越大,Redis 提供了 AOF 重写机制,将旧的写操作日志压缩成较小的文件。
- AOF 重写不会阻塞主线程,它在后台进行,避免了对业务的影响。
05 | 内存快照:宕机后,Redis 如何实现快速恢复?
RDB(Redis 数据库快照)是 Redis 提供的另一种持久化机制,它通过定期保存 Redis 内存数据的快照来保证数据的持久性。
-
快照的触发:
- 快照通常根据时间和写操作次数的条件来触发,例如:
save 900 1 # 如果在 900 秒内有 1 次写操作,就保存一次快照 save 300 10 # 如果在 300 秒内有 10 次写操作,就保存一次快照
- 快照通常根据时间和写操作次数的条件来触发,例如:
-
恢复过程:
- 在 Redis 启动时,如果配置了 RDB 持久化机制,Redis 会读取最后的 RDB 快照文件,并将数据恢复到内存中。这是 Redis 恢复速度最快的方式,因为 RDB 文件是压缩的,恢复过程简单高效。
实践篇(28讲)
11 | “万金油”的 String,为什么不好用了?
Redis 的 String 是最基础的数据类型,但它也有一些局限性。在一些复杂场景下,单纯使用字符串存储和操作数据会影响性能和代码的可读性。
-
数据结构的选择:
- 对于需要存储多个字段的数据,使用哈希(Hash)而非字符串会更加高效。哈希类型允许你在一个键下存储多个字段,而不必为每个字段创建一个独立的键。
-
操作效率:
- 复杂的字符串拼接操作会造成 Redis 需要频繁地进行内存重分配。若应用中频繁修改字符串值,建议考虑使用其他数据结构,例如列表或集合,这些数据结构的内存管理机制更加高效。
12 | 有一亿个 keys 要统计,应该用哪种集合?
Redis 提供了多种集合数据结构,包括 Set、Sorted Set 和 HyperLogLog。对于需要统计大量数据的场景,选择合适的数据结构至关重要。
- 使用 Set 进行去重:
- Redis Set 是一个无序的集合,适用于存储唯一元素。Set 的
SADD
和SINTER
等操作非常高效,适合用来存储和操作大量唯一数据
- Redis Set 是一个无序的集合,适用于存储唯一元素。Set 的
。
-
Sorted Set 用于排序统计:
- Redis 的 Sorted Set 结合了集合和有序列表的特点,适用于需要排序统计的场景,如排行榜、时序数据等。每个元素都带有一个分数,支持按分数排序。
-
HyperLogLog 用于大规模计数:
- Redis 的 HyperLogLog 是一种基于概率算法的数据结构,适合用来做基数统计,能够用较少的内存计算出大量数据的基数(例如 URL 的去重)。
好的,接下来继续深入分析 Redis 实践篇 中的每个讲解内容。我们将探讨一些更为复杂的应用场景、性能优化策略、常见问题及解决方案,帮助你掌握 Redis 的高级使用和实际操作。
13 | GEO 是什么?还可以定义新的数据类型吗?
Redis 提供了对地理位置信息的支持,通过 GEO 命令,开发者可以在 Redis 中存储、查询和处理地理位置数据。Geo 数据结构背后实际上是 Redis 的 Sorted Set,它通过经纬度将数据按分数进行排序。
-
Geo 操作命令:
GEOADD
:将地理位置添加到 Redis 数据库中,地理位置信息是以经度、纬度和成员值(如城市名称)为参数存储。GEODIST
:返回两点之间的距离,支持多种单位(如米、千米、英里等)。GEORADIUS
和GEORADIUSBYMEMBER
:根据半径查询附近的地理位置。Redis 使用的是 Geohash 算法,将经纬度转化为一种数字,可以通过排序快速查询。
-
自定义数据类型(Redis Modules):
Redis 允许通过 Redis Module 扩展新的数据类型。通过 Redis 的module
API,开发者可以创建自定义数据类型,并实现对这些数据类型的支持,例如时间序列数据、全文搜索等功能。例如,RedisSearch 模块就实现了对搜索引擎功能的扩展,支持索引文本、查询等操作。
14 | 如何在 Redis 中保存时间序列数据?
时间序列数据的存储通常包括时间戳和数据项,Redis 通过 Sorted Set 来高效地存储时间序列数据,因为它支持按分数(时间戳)排序。
-
使用 Sorted Set 存储时间序列数据:
- 每条时间序列数据的时间戳可以作为分数,数据本身作为成员。通过
ZADD
命令将数据按时间顺序添加到有序集合中。 - 查询时,可以通过
ZRANGEBYSCORE
或ZREVRANGEBYSCORE
命令快速获取某个时间范围内的数据。
- 每条时间序列数据的时间戳可以作为分数,数据本身作为成员。通过
-
使用 RedisTimeSeries:
- RedisTimeSeries 是 Redis 官方提供的模块,专门用于处理时间序列数据。它为时间序列数据提供了专门的命令和优化,支持高效的时间序列写入和查询。
15 | 消息队列的考验:Redis 有哪些解决方案?
Redis 在消息队列方面有多个实现方案,最常见的方式是使用 列表(List)、发布/订阅(Pub/Sub) 和 Stream(流) 数据结构。
-
使用 List 实现简单队列:
- Redis 列表类型本质上是一个双端队列,可以使用
LPUSH
和RPUSH
命令进行生产者写入,LPOP
和RPOP
命令进行消费者读取。这种方式适合简单的消息队列应用。
- Redis 列表类型本质上是一个双端队列,可以使用
-
使用 Pub/Sub 实现发布/订阅模式:
- Redis 支持发布/订阅模式(Pub/Sub),适用于实时消息的广播。客户端通过
PUBLISH
发布消息,订阅者通过SUBSCRIBE
订阅消息。适合用于实时消息通知、推送等场景。
- Redis 支持发布/订阅模式(Pub/Sub),适用于实时消息的广播。客户端通过
-
使用 Stream 处理高吞吐量消息:
- Redis 5.0 引入了 Stream 数据类型,专为高吞吐量的消息队列设计。Stream 支持消息持久化,消费者可以确认消息的处理状态。Stream 还支持消费者组(Consumer Group),允许多个消费者并行处理消息。
-
性能优化:
- 在高并发和高吞吐量的场景下,使用 Stream 比 List 更适合,特别是在需要持久化消息且具有消费者组的情况下。可以根据业务需求选择合适的消息队列模式。
16 | 异步机制:如何避免单线程模型的阻塞?
Redis 使用单线程模型来处理请求,这使得它的性能非常高,但也带来了一些挑战,特别是在面对高延迟的操作时。为了避免阻塞,Redis 采用了多种异步机制来提升性能。
-
非阻塞 I/O 模型:
- Redis 使用 I/O 多路复用(如 epoll、select、poll)来监听多个 I/O 事件,能够在单个线程中异步处理多个客户端的请求,避免了线程间的上下文切换和调度延迟。
-
命令异步执行:
- Redis 的所有命令都是非阻塞的,尤其是在执行某些耗时操作时(如
BGREWRITEAOF
、BGSAVE
等)。这些命令将操作交给后台执行,主线程会继续处理其他请求,直到异步操作完成。
- Redis 的所有命令都是非阻塞的,尤其是在执行某些耗时操作时(如
-
使用 Redis 异步客户端:
- 在客户端,异步 I/O 模式也非常重要。通过 Redis 异步客户端(如 Jedis 的 Async API),可以避免因为网络阻塞而影响系统性能。客户端异步执行命令后,可以继续执行其他任务,直到收到响应。
17 | 为什么 CPU 结构也会影响 Redis 的性能?
Redis 性能受限于 CPU 的架构,特别是多核处理器与单核处理器之间的差异,以及 CPU 缓存和内存的访问模式。
-
单线程 vs 多线程:
- Redis 使用单线程来执行所有命令,它并未充分利用多核 CPU 的优势。虽然 Redis 的单线程模型避免了上下文切换的开销,但在某些多核系统中,CPU 核心之间的资源共享仍会对 Redis 的性能产生影响。
-
CPU 缓存和内存访问:
- Redis 是一个内存数据库,它的数据访问模式对 CPU 缓存有较高的要求。数据的局部性和访问模式直接影响 Redis 的性能。例如,大量的随机内存访问会导致 CPU 缓存失效,进而增加内存访问延迟。
-
优化方式:
- 使用 CPU 亲和性(CPU Affinity) 和 NUMA(Non-Uniform Memory Access) 来优化 Redis 性能。通过设置 Redis 进程绑定到特定的 CPU 核心,减少跨核访问,可以提高性能。
18 | 波动的响应延迟:如何应对变慢的 Redis?(上)
Redis 在高负载下可能会出现响应延迟波动,原因通常与内存碎片、硬件瓶颈和操作系统调度等因素相关。分析和解决这些问题非常重要。
-
内存碎片问题:
- Redis 运行时会分配内存,并且内存的分配方式是动态的,这可能导致内存碎片问题。碎片化会导致内存的利用率降低,并可能造成 Redis 响应时间波动。
- 使用
INFO MEMORY
命令可以查看 Redis 的内存使用情况,判断是否存在碎片问题。
-
垃圾回收和内存管理:
- Redis 内部有 jemalloc(一种内存分配器),它负责内存的动态分配和释放。通过优化内存分配器和配置 Redis 使用的最大内存大小,可以避免内存过度分配,减少垃圾回收的影响。
-
优化 I/O 操作:
- Redis 的性能受限于 I/O 操作,尤其是磁盘 I/O。通过调整
vm.overcommit_memory
配置和优化内存映射的方式,可以提高内存的使用效率,减少 I/O 延迟。
- Redis 的性能受限于 I/O 操作,尤其是磁盘 I/O。通过调整
19 | 波动的响应延迟:如何应对变慢的 Redis?(下)
继续分析如何处理 Redis 在高负载下的响应波动问题。
-
CPU 性能瓶颈:
- 如果 Redis 运行在 CPU 密集型的负载下(如大量的计算、排序操作),可以通过 Redis 的多实例部署 来分担压力,或者考虑将 Redis 配置为多个 CPU 核心并行执行任务。
-
网络延迟问题:
- 网络延迟是影响 Redis 响应时间的另一个重要因素。通过优化客户端与 Redis 之间的网络连接、减少 TCP 连接的数目、增加 Redis 实例的带宽等手段,可以有效减少延迟。
-
Redis 内存优化:
- 增加物理内存,或者合理配置 Redis 的最大内存使用上限,可以帮助 Redis 在处理大量数据时保持更好的性能。
继续深入探讨 Redis 在实际应用中的复杂场景和高级技术。接下来,我们将继续展开 实践篇 和 未来篇 的内容,探索一些高级功能、优化技巧、故障处理和扩展方案等。
20 | 删除数据后,为什么内存占用率还是很高?
Redis 在执行删除操作后,内存占用率可能不会立即下降,这通常与 Redis 内部的内存管理机制和数据删除的实际过程有关。
-
删除操作与内存释放:
- 当执行删除操作(如
DEL
命令)时,Redis 会将数据标记为“已删除”,但并不会立即释放对应的内存。内存的释放通常在 Redis 的空闲周期中或通过 内存回收机制(如 垃圾回收)来进行。这是由于 Redis 通过 jemalloc 进行内存分配,该分配器会延迟释放内存以减少频繁的内存操作。
- 当执行删除操作(如
-
内存碎片:
- 如果 Redis 的内存碎片较严重,那么即使删除了数据,内存的占用率也可能维持较高。可以通过命令
INFO MEMORY
来查看内存碎片的情况,了解是否有内存释放不完全的问题。 - 解决方案:定期执行
MEMORY PURGE
来清理无用的内存,或者设置合理的内存回收策略。
- 如果 Redis 的内存碎片较严重,那么即使删除了数据,内存的占用率也可能维持较高。可以通过命令
-
RDB 和 AOF 文件的影响:
- 在执行 RDB 或 AOF 持久化操作时,内存中的数据会被写入磁盘。如果存在大量删除操作,Redis 可能会出现磁盘与内存数据不一致的情况,导致删除的数据仍然在磁盘文件中。
- 解决方案:可以考虑手动触发 AOF 文件重写(
BGREWRITEAOF
)或 RDB 快照操作,来确保持久化文件与内存一致。
21 | 缓冲区:一个可能引发“惨案”的地方
Redis 使用缓冲区来处理客户端的请求,这意味着当请求量较大时,缓冲区的管理和处理变得尤为重要。如果缓冲区管理不当,可能会导致内存消耗急剧增加或请求延迟显著上升。
-
缓冲区的工作原理:
- Redis 会为每个客户端维护一个缓冲区,用来存储客户端请求的数据。每当客户端发起请求时,数据会先写入缓冲区,等待 Redis 处理完当前请求后再返回结果给客户端。
- 如果客户端连接过多或者单个请求的负载过大,可能会导致缓冲区积压,造成 Redis 的响应延迟和内存占用增加。
-
缓冲区溢出:
- 在某些极端负载下,缓冲区可能会溢出,导致 Redis 的性能下降,甚至可能导致系统崩溃。特别是在 Redis 与客户端的网络连接中断时,缓冲区中的数据无法及时发送给客户端。
-
解决方案:
- 客户端流量控制:确保客户端在发送请求时不会超出 Redis 的承载能力,使用批量操作和管道技术来减少请求次数。
- 使用 Redis 的
CLIENT PAUSE
命令:可以在特定情况下暂停客户端的请求,避免由于突发流量导致的缓冲区积压。 - 设置最大客户端连接数:通过配置
maxclients
限制连接数,防止 Redis 被过多的客户端请求淹没。
22 | 第 11~21 讲课后思考题答案及常见问题答疑
这些讲解中提到的许多问题和技术细节,可能在实际应用中会遇到各种问题。常见问题的答案包括:
- 如何避免 Redis 单线程的瓶颈?
通过合理的 Redis 分片(Sharding)方案,利用多个 Redis 实例来分摊请求负载,或者在极端情况下使用 Redis Cluster 来实现多节点并行处理。 - Redis 中的数据丢失问题如何处理?
如果使用 AOF 和 RDB 持久化机制配置得当,可以最大程度避免数据丢失。通过配置合理的同步策略和定期重写 AOF 文件来减少丢失风险。 - Redis 是否支持 ACID 事务?
Redis 本身不支持严格的 ACID 事务,但它支持通过 MULTI、EXEC 和 WATCH 命令模拟事务,确保多个操作的原子性。
23 | 旁路缓存:Redis 是如何工作的?
旁路缓存是一种常见的缓存优化方案,主要用于当缓存层和数据库层的访问逻辑发生变化时,可以使得 Redis 成为数据库查询的 “旁路”,即首先查询 Redis 缓存,如果缓存没有命中再查询数据库。
-
旁路缓存的工作原理:
- 客户端查询时,首先访问 Redis 缓存,如果 Redis 中有数据则直接返回。
- 如果 Redis 中没有数据(即缓存未命中),则从数据库中查询数据,查询到后将结果存入 Redis 中,并返回给客户端。
-
缓存穿透、击穿和雪崩问题:
- 缓存穿透:查询的对象在缓存和数据库中都不存在,导致每次请求都需要查询数据库。解决方案可以是设置布隆过滤器来快速判断数据是否存在。
- 缓存击穿:热点数据在缓存中失效,导致大量请求同时查询数据库。解决方案可以是使用互斥锁(Mutex)机制,保证同一时间只有一个请求访问数据库。
- 缓存雪崩:大量缓存同时失效,导致短时间内大量请求访问数据库。解决方案是使用合理的缓存过期时间,并通过 缓存预热 减少突然失效的概率。
24 | 替换策略:缓存满了怎么办?
当 Redis 缓存满时,如何选择合适的替换策略是缓存系统的核心问题。Redis 提供了多种缓存替换策略来应对这种情况。
-
LRU(Least Recently Used):
- LRU 策略会淘汰最久未使用的数据。当缓存达到最大容量时,Redis 会选择最久未被访问的键值对进行删除。
- Redis 内部实现了一个 2^10 的 LRU 算法 来高效实现 LRU 策略。
-
LFU(Least Frequently Used):
- LFU 策略会淘汰访问频率最少的数据。Redis 在 4.0 版本后增加了 LFU 策略,可以通过
maxmemory-policy
配置选择使用 LFU 策略。
- LFU 策略会淘汰访问频率最少的数据。Redis 在 4.0 版本后增加了 LFU 策略,可以通过
-
TTL(Time To Live)策略:
- 设置键值对的过期时间,超过时间限制后自动删除。可以用于一些短期有效的数据缓存。
-
配置优化:
- 可以通过配置
maxmemory
和maxmemory-policy
来设置 Redis 的最大内存限制和替换策略,从而避免缓存满时导致系统崩溃。
- 可以通过配置
25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?
缓存和数据库的数据不一致问题是缓存系统常见的挑战。尤其在高并发的情况下,缓存和数据库的更新需要保证一致性。
-
缓存更新策略:
- Write-Through:每次更新缓存时,都会同步更新数据库。这种策略保证了数据的一致性,但会影响性能,因为每次写入都会触发数据库操作。
- Write-Behind:更新缓存时先更新缓存,然后异步地更新数据库。该策略提高了性能,但会导致数据在一段时间内处于不一致状态。
-
缓存失效策略:
- 当缓存的数据失效或过期时,可能会出现数据不一致的情况。常见的解决办法包括:在更新缓存时提前将缓存标记为失效,或通过 双写机制,即同时写入数据库和缓存,避免数据不一致。
26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?
在高并发场景下,缓存可能会遇到雪崩、击穿、穿透等问题,这些问题会极大地影响系统的性能和可靠性。
-
缓存穿透:
- 布隆过滤器:布隆过滤器是一种高效的概率性数据结构,可以用来过滤不存在的数据请求,避免直接访问数据库。
-
缓存击穿:
- 互斥锁:在缓存失效时,使用互斥锁来保证同一时间只有一个请求可以查询数据库,避免多个请求同时查询数据库。
-
缓存雪崩:
- 合理的过期时间设计:避免大量缓存同时失效,可以设置不同的过期时间,或者采用 随机过期时间 来避免缓存雪崩。
27 | 缓存被污染了,该怎么办?
缓存污染指的是缓存中存储了不正确或不一致的数据,这种情况会导致应用程序读取到错误的数据,从而影响业务的正确性。
-
缓存污染的常见原因:
- 数据不一致:由于数据在缓存和数据库之间同步延迟,可能会出现缓存数据过期或者被错误地更新的情况。
- 缓存击穿或雪崩:大量缓存失效,导致请求直接击中数据库。如果数据库中有不正确或过期的数据,这可能被写入缓存,从而导致缓存污染。
-
解决方案:
- 缓存更新策略:使用双写策略(在更新数据库的同时,更新缓存)来保证数据的一致性。采用 异步刷新 来避免缓存污染的影响。
- 过期策略:合理设置缓存的过期时间,避免缓存中的数据长时间不更新,减少缓存污染的可能性。
- 数据校验:定期对缓存数据进行有效性校验。如果缓存中存在不合规的数据,可以重新从数据库中加载最新数据。
-
使用缓存清理机制:
- 定期清理过期缓存:可以通过设置缓存的过期时间
EXPIRE
来确保缓存数据不会长时间过期。或者使用 LRU(最少使用)策略淘汰无效数据。 - 主动清理:使用
DEL
或FLUSHDB
命令主动清理已知污染的数据,确保系统稳定。
- 定期清理过期缓存:可以通过设置缓存的过期时间
28 | Pika:如何基于SSD实现大容量Redis?
Pika 是一个兼容 Redis 协议的高性能 NoSQL 数据库,它在 Redis 基础上做了扩展,尤其在大规模数据存储和持久化方面做了优化,特别适用于 SSD(固态硬盘)存储环境。
-
Pika 与 Redis 的异同:
- Pika 使用 SSD 存储作为持久化方案,而 Redis 更依赖内存作为主要存储介质。Pika 将数据持久化到 SSD,使得它能够处理比 Redis 更大的数据集,同时保持高性能。
- Pika 的优势:使用 SSD 存储减少了内存瓶颈,适用于大数据量场景,比如实时日志存储、时序数据存储等。
-
Pika 的数据结构:
- 与 Redis 类似,Pika 支持常见的 Redis 数据结构(如字符串、哈希、列表、集合、排序集合等),并扩展了对磁盘存储的支持。这使得它在对大规模数据存储时能够提供比传统 Redis 更高的效率。
-
如何使用 Pika:
- 在使用 Pika 时,数据会被持久化到 SSD 存储,降低了内存消耗并扩展了 Redis 的数据存储能力。可以使用 RDB 持久化 和 AOF 日志 来确保数据的持久性。
- 适合对磁盘 I/O 能力有要求的场景,比如高并发、大数据量的应用系统。
29 | 无锁的原子操作:Redis 如何应对并发访问?
Redis 虽然是单线程处理请求,但它通过无锁的原子操作来确保并发请求之间的数据一致性。这是 Redis 高性能的关键之一。
-
Redis 的单线程模型:
- Redis 采用单线程模型,即一个 Redis 实例只有一个主线程来处理所有的客户端请求。所有的命令都按照请求的顺序依次处理,不会发生线程切换带来的上下文切换开销。
- 单线程模型使得 Redis 避免了并发环境下的 锁竞争,大大简化了设计和实现。
-
原子性操作:
- Redis 的命令在执行时都是 原子操作,即每个命令执行时要么完全成功,要么完全失败,不会出现部分成功、部分失败的情况。
- 例如,
INCR
、DECR
等操作是原子性的,不会受到其他操作干扰。即使多个客户端同时访问相同的键值,Redis 也能够保证最终一致性。
-
乐观锁与事务:
- Redis 还通过 乐观锁 来处理一些并发场景。使用
WATCH
命令可以监听某个或多个键的变化,只有在这些键未被其他客户端修改的情况下,事务才会成功执行。 - MULTI/EXEC 机制允许一组命令作为一个事务执行,从而确保命令的原子性。
- Redis 还通过 乐观锁 来处理一些并发场景。使用
-
无锁并发设计:
- Redis 使用无锁并发技术,通过 哈希表 等高效的数据结构,确保即使在单线程模式下,依然能够处理高并发请求。比如,Redis 的 链表 和 跳表 数据结构非常适合并发场景。
30 | 如何使用 Redis 实现分布式锁?
Redis 分布式锁是实现分布式系统中共享资源互斥访问的一种重要方式。通过 Redis 来实现分布式锁,可以确保在分布式系统中多个客户端对共享资源进行互斥访问。
-
分布式锁的工作原理:
- 基于 Redis 的分布式锁通常利用 Redis 的 SETNX(SET if Not eXists)命令来实现。该命令只能在键不存在时设置值,从而实现锁的获取。
- 锁的实现流程如下:
- 客户端尝试设置一个键值对,表示获取锁。
SET key lock_value NX EX 30
,这意味着如果键不存在,则设置值并设置过期时间为 30 秒,防止死锁。 - 客户端通过检查是否成功设置键来判断是否成功获得锁。
- 如果操作成功,则执行临界区操作,执行完毕后,删除锁。
- 如果操作失败,则进行重试。
- 客户端尝试设置一个键值对,表示获取锁。
-
防止死锁:
- 为了防止死锁,分布式锁通常会设置过期时间。锁持有者在过期时间内未释放锁时,其他客户端可以重新获得锁。
- 过期时间需要根据业务逻辑设置合理的值。锁持有者完成任务后应及时释放锁,避免其他客户端无法获取锁。
-
解决锁失效问题:
- 在一些极端情况下,Redis 锁可能会因为网络故障或 Redis 崩溃导致锁失效。为了避免这种情况,可以使用 RedLock 算法(由 Redis 作者提出),该算法通过多个 Redis 实例来确保锁的可靠性和高可用性。
-
最佳实践:
- 使用
SETNX
+EXPIRE
配合 Redis 的WATCH
命令 来确保锁的安全性和防止死锁。 - 注意在进行锁操作时,考虑网络延迟和 Redis 响应时间,避免由于锁超时导致的竞争条件。
- 使用
31 | 事务机制:Redis 能实现 ACID 属性吗?
Redis 是一个高性能的 NoSQL 数据库,它并没有严格的实现 ACID 属性,但提供了一些机制来保证部分事务的一致性。
-
Redis 的事务模型:
- Redis 的事务是通过
MULTI
、EXEC
和WATCH
实现的。使用MULTI
开启事务,后续的命令将会被放入队列,直到使用EXEC
提交事务。事务执行时,Redis 会确保队列中的命令按顺序依次执行。 WATCH
命令可以在事务执行前对某个键进行监视。如果在事务提交之前键被修改,事务会被 中止,确保数据的一致性。
- Redis 的事务是通过
-
事务的原子性:
- Redis 事务中的命令会按照原子性执行。要么事务中的所有命令执行成功,要么没有命令被执行。这种原子性保证了事务的一致性,但并不能像传统关系型数据库那样提供完全的 隔离性 和 持久性。
-
Redis 事务与 ACID:
-
一致性:Redis 保证事务中的所有命令按顺序执行,事务开始前和提交后,数据处于一致的状态。
-
隔离性:Redis 的事务没有严格的隔离级别,多个客户端可能会并发执行事务中的命令,但 Redis 会保证事务中命令的顺序执行。
-
持久性:Redis 事务并不保证持久性,事务执行后的数据不会自动写入磁盘,需要依赖 Redis 的持久化机制(RDB 或 AOF)来保证数据不会丢失。
-
原子性:Redis 事务是原子的,要么完全成功,要么完全失败。
-
继续深入探讨 Redis 的高阶特性、性能调优以及高级应用。以下内容将着重于 Redis 的数据分布、性能优化策略以及在特定场景下的应用,进一步提升你对 Redis 的理解。
32 | Redis 主从同步与故障切换,有哪些坑?
在 Redis 集群中,主从同步和故障切换是确保高可用性的关键机制。但实际运维中,有一些坑需要特别注意。
-
主从同步原理:
- 主节点(Master) 接收写请求并将数据同步到其从节点(Slave)。
- 从节点 定期向主节点发送同步请求,主节点通过复制协议将数据发送到从节点。
- 在数据同步的过程中,从节点将同步收到的数据保存在内存中,以确保数据的一致性。
-
常见坑:
- 网络延迟与带宽问题:如果主从节点之间的网络带宽较低,或者网络延迟较高,可能导致主从节点的同步过程滞后,从而出现数据不一致的问题。
- 同步延迟:Redis 在进行主从同步时,会产生一定的延迟,尤其是在数据量大的情况下。如果主节点在同步期间遭遇故障,可能导致数据丢失。
- 阻塞操作:在一些高负载的情况下,主节点可能会出现 阻塞(比如执行长时间的写操作),导致主从同步滞后,从而增加故障切换的难度。
-
避免数据丢失:
- 使用 AOF 持久化 和 RDB 快照 配合主从同步,减少数据丢失的概率。AOF 能够记录所有写操作,并在主节点宕机时从从节点中恢复数据。
- 设置合理的
repl-backlog-size
参数,确保主从节点同步过程中,主节点的写入操作不会因同步延迟而丢失。
-
故障切换机制:
- 哨兵模式:使用 Redis Sentinel 来实现主从节点故障切换。当主节点不可用时,Redis Sentinel 会自动选举一个从节点作为新的主节点,从而确保服务的高可用性。
- 手动故障转移:如果 Redis Sentinel 没有自动恢复服务,运维人员也可以手动进行故障转移操作,但这样就无法保证自动化恢复。
33 | 脑裂:一次奇怪的数据丢失
“脑裂”是指 Redis 集群中,多个节点在网络隔离的情况下,认为自己是主节点,从而导致数据的不一致和丢失。
-
脑裂的产生:
- Redis 集群依赖一致性协议来确保数据一致性,但如果网络发生故障,导致集群的部分节点失去联系,可能出现多个节点认为自己是主节点的情况。这样,两个节点同时接收写请求,可能会导致数据的不一致,最终出现数据丢失。
-
如何避免脑裂:
- 集群模式:使用 Redis 集群模式时,集群会自动确保主节点的高可用性。通过数据分片和故障转移机制,减少节点间的网络延迟,确保数据一致性。
- 加大网络隔离阈值:通过配置 Redis 的
cluster-require-full-coverage
参数,控制集群对故障的容忍度。默认情况下,当 Redis 集群的一部分节点无法与其他节点通信时,集群会进行故障切换。 - 使用 Redis Sentinel:如果是单实例 Redis,使用 Redis Sentinel 进行主从同步和故障切换,可以有效减少脑裂问题的发生。
-
故障排查与恢复:
- 当发生脑裂时,首先需要检查 Redis 的
replication
和cluster
配置是否正确。使用INFO replication
和INFO cluster
命令查看节点的同步状态,确认是否有节点异常。 - 可以通过手动调整集群配置,重新启动故障节点来恢复正常状态。需要注意的是,恢复后应立即进行数据一致性检查,以防止数据丢失。
- 当发生脑裂时,首先需要检查 Redis 的
34 | Codis VS Redis Cluster:我该选择哪一个集群方案?
Codis 和 Redis Cluster 都是 Redis 的集群解决方案,但它们在架构、特性和适用场景上有所不同。
-
Codis 架构:
- Codis 是由 猎云网 开源的 Redis 集群方案,基于 Redis 的主从复制模型和代理层架构。它将多个 Redis 实例作为一个整体进行管理,提供了灵活的路由和扩展性。
- Codis 的 Proxy 层 充当客户端和 Redis 实例之间的中间层,处理请求路由、负载均衡等任务。Codis 提供了更灵活的集群扩展方式。
-
Redis Cluster 架构:
- Redis Cluster 是 Redis 官方提供的集群解决方案。与 Codis 不同,Redis Cluster 将数据自动分片,并且每个节点都可以处理客户端请求。集群中没有中间层代理,节点间通过 Gossip 协议 来保持通信。
- Redis Cluster 对集群的管理相对简化,但在节点间同步、容错等方面存在一定的局限性。
-
Codis 与 Redis Cluster 的选择:
- Codis 更适合大规模、跨机房的 Redis 集群,因为其代理层可以更方便地管理节点和数据分片,同时提供了更好的扩展性和灵活性。
- Redis Cluster 更适合需要高可用、高性能、低延迟的场景,并且配置和管理相对简便。如果是较小规模的 Redis 集群,推荐使用 Redis Cluster。
-
性能比较:
- Codis 在性能上略逊于 Redis Cluster,因为它增加了代理层的中间转发,这会带来一定的性能开销。但它在扩展性和灵活性上优于 Redis Cluster,特别是在跨数据中心部署时,Codis 的优势更加明显。
- Redis Cluster 由于没有代理层,性能较高,但它的节点管理、分片以及容错能力不如 Codis 灵活。
35 | Redis 支撑秒杀场景的关键技术和实践
秒杀系统是典型的高并发、高压力场景,Redis 作为高性能缓存系统,通常用于支撑秒杀业务的流量高峰。
-
缓存雪崩与缓存穿透:
- 缓存雪崩:大量缓存同时过期,导致大量请求直接访问数据库,造成数据库压力过大。可以通过设置不同的过期时间,避免缓存同时过期,或使用 加锁机制 来避免并发请求直接击中数据库。
- 缓存穿透:请求的数据在缓存和数据库中都不存在,导致大量请求直接穿透缓存查询数据库。可以通过 布隆过滤器 来解决缓存穿透问题,提前过滤掉不存在的数据。
-
限流与排队机制:
- 在秒杀场景中,通常需要限流来防止瞬间请求过载 Redis。常见的限流策略包括 漏桶算法、令牌桶算法 等。
- Redis 可以作为 队列系统,将请求按顺序存储并逐一处理,避免瞬时请求过多,减缓服务器压力。
-
Redis 的事务支持:
- 秒杀场景中,通常需要确保对库存的操作具有原子性。Redis 提供了 事务 和 乐观锁 等机制,可以确保多个用户并发下的库存修改操作不发生冲突。
- 使用 Redis 的
WATCH
命令 和MULTI/EXEC
事务,可以确保库存的修改是原子性的,避免超卖现象。
-
分布式锁:
- 在秒杀系统中,分布式锁通常用于保证同一时间只有一个请求能够修改库存。通过 Redis 实现分布式锁,能够避免多台服务器同时更新库存,确保数据一致性。
- 使用
SETNX
+EXPIRE
实现 Redis 分布式锁,确保锁的过期时间不会被忽视,避免死锁。
36 | 数据分布优化:如何应对数据倾斜?
数据倾斜是指 Redis 集群中某些节点的数据量过多,导致该节点成为性能瓶颈,而其他节点空闲,无法充分利用集群资源。
- 数据倾斜的原因:
- 不均匀的分片:数据分片策略不合理,可能导致某些键的访问频率过高,从而导致该节点的负载过大。
- 热点数据问题:某些键值(如最常访问的商品)可能会被频繁访问,从而成为热点数据,导致特定节点的负载
压力过大。
- 解决数据倾斜的方法:
- 重新分片:通过调整 Redis 集群的分片策略,避免某个节点的负载过高。可以使用 一致性哈希 算法来优化数据的分布,确保各个节点的负载均衡。
- 分布式负载均衡:通过调整数据访问逻辑,将热点数据分散到多个节点,避免单个节点负载过高。
- 热点数据隔离:将热点数据单独分片,使用 独立缓存 或 异步处理 来减轻主 Redis 节点的压力。
37 | 通信开销:限制 Redis Cluster 规模的关键因素
随着 Redis 集群规模的扩展,通信开销会逐渐增加,进而影响系统的响应时间和吞吐量。
-
集群规模与性能:
- Redis 集群通过节点间的 Gossip 协议 和 复制协议 来进行通信。随着节点数量的增加,网络延迟和数据同步的开销也会增加。
- 跨节点请求:在 Redis Cluster 中,当客户端请求的数据不存在于本地节点时,需要通过 MOVED 重定向到正确的节点。这会增加额外的网络请求,导致响应时间变慢。
-
优化通信开销:
- 合理设置集群节点数:Redis 官方建议,集群的节点数最好保持在 16~64 之间,超过这个范围可能导致网络延迟和数据同步压力增加。
- 数据分片优化:通过合理的分片和 数据热点优化,减少跨节点请求的频率,从而减轻网络开销。
继续深入探讨 Redis 的高级特性、性能调优以及更广泛的应用场景。这一部分将重点关注如何在大规模系统中应用 Redis,解决实际业务中的问题,以及 Redis 在不同技术栈中的集成和高级应用。
38 | 通信开销:限制 Redis Cluster 规模的关键因素
在 Redis 集群的实际应用中,随着集群规模的不断扩大,通信开销成为影响集群性能的关键因素之一。集群中各个节点之间的通信需要消耗一定的网络带宽和时间,而随着节点数的增加,跨节点的通信请求数量也会增加,进而影响整体性能。
-
Redis 集群通信模型:
- Redis 集群使用 Gossip 协议 来实现节点之间的状态同步,每个节点都会定期与其他节点交换信息。这种方式可以减少全局广播和集中式查询,使得每个节点的状态更新和故障检测更加高效。
- 节点之间通过 P2P(点对点) 连接进行信息交换,不同于传统的客户端-服务器通信。虽然这种模型提高了集群的容错性,但也增加了节点之间的通信成本,尤其是在节点数目较多的情况下。
-
通信开销的影响因素:
- 数据迁移:Redis 集群会在集群扩容时进行数据迁移,即通过重新分片将数据从一个节点迁移到另一个节点。这一过程会产生大量的网络流量,尤其是对于大数据量的场景,会增加网络负载。
- 请求重定向:当客户端请求的数据不在本地节点时,Redis 会通过 MOVED 响应将请求重定向到正确的节点。这虽然是 Redis 集群的正常操作,但也增加了额外的请求和响应时间,尤其是在客户端请求频繁时。
- 复制同步:主从节点之间的同步会消耗带宽,尤其是在主节点的数据量较大时,从节点需要不断接收更新。
-
优化通信开销的策略:
- 合理的分片和扩容策略:通过合理分片,减少跨节点的数据请求。例如,尽量避免大量请求都指向同一个 Redis 分片,保持各节点间的负载均衡。
- 数据分区和热点数据隔离:通过热点数据的隔离与负载均衡,减少由于热点数据集中访问所带来的跨节点通信压力。
- 加速数据迁移:在 Redis 集群扩容或缩容时,可以采用 在线扩容 的方式,使数据迁移过程更加平滑,避免集群发生过载。
39 | Redis的下一步:基于NVM内存的实践
随着硬件技术的进步,特别是 非易失性内存(NVM) 的出现,Redis 的存储和性能能力面临着新的机遇与挑战。NVM(如 Intel Optane)提供了较传统内存更高的持久性,并且在访问速度上接近内存,因此 Redis 可以利用这种技术来改善存储和持久化性能。
-
NVM 的优势:
- 高效的数据持久化:Redis 在传统内存上使用 RDB 快照和 AOF 日志来持久化数据,但这些操作的性能往往受到磁盘 I/O 的限制。而使用 NVM,Redis 可以将数据持久化到非易失性存储上,同时具备更低的延迟和更高的吞吐量。
- 数据恢复速度:由于 NVM 的读写速度较传统磁盘存储更快,因此 Redis 使用 NVM 可以显著提高故障恢复的速度,特别是在大规模数据恢复的场景中。
-
Redis 在 NVM 上的挑战:
- 写放大问题:虽然 NVM 的性能优于传统的磁盘存储,但在处理大量写操作时,NVM 也可能面临 写放大(Write Amplification)的问题。Redis 需要采取特殊的机制,避免频繁的写操作对 NVM 存储的性能产生负面影响。
- 内存和持久化的管理:NVM 可以同时作为内存和磁盘的角色,因此 Redis 需要灵活管理 NVM 存储与传统内存之间的区别,避免资源的浪费。
-
Redis 和 NVM 的结合:
- Redis 可以结合 Intel Optane 等 NVM 存储,将数据存储在类似内存的设备上,同时保证数据的持久性。这将使得 Redis 在处理大规模数据时,不再受到传统磁盘的瓶颈,提升整体性能。
- Redis 通过优化数据持久化过程,使得 NVM 的特点能够充分发挥,提高 Redis 的响应速度和存储效率。具体实践中,Redis 将结合 内存数据库 和 持久化存储,为企业级应用提供高性能、高可靠的数据存储解决方案。
相关文章:
Redis(基础篇 + 实践篇 )
01 | 基本架构:一个键值数据库包含什么? Redis 作为一个内存数据存储系统,它的架构设计非常简洁,但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构: 客户端通过 TCP 协议连接到 Redis …...
高质量C++小白教程:2.10-预处理器简介
当你在编译项目时,你可能希望编译器完全按照你编写的方式编译每一个代码文件,当事实并非如此。 相反,在编译之前,每一个.cpp文件都会经历一个预处理的阶段,在此阶段中,称为预处理器的程序对代码文件的文本进行各种更改. 预处理器实际上不会以任何方式修改原始代码文件,预处理…...

一、二极管(模电理论篇)
导论:PN结(结电容)是构成二极管,三极管,场效应管的原理基础 1.二极管特性(单向导电性) 1.1 P型半导体与N型半导体 在单晶体硅(原子核为正四价电子,可以形成四条共价键&…...

JAVA学习笔记_JVM
文章目录 初识jvm内存结构程序计数器(寄存器) 栈问题辨析内存溢出 线程诊断本地方法栈Heap堆内存溢出内存诊断 方法区内存溢出常量池 stringTable直接内存垃圾回收 初识jvm JRE JVM 基础类库 JDK JRE 编译工具 JavaSE JDK IDE工具 JavaEE JDK 应用服务器 IDE工具 jvm是…...
SQL 中复杂 CASE WHEN 嵌套逻辑优化
目标:优化复杂的 CASE WHEN 逻辑,提升 SQL 语句的可读性与执行效率,减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深:多个条件判断嵌套,难以阅读和维护。重复逻辑:相似逻辑在多个分支中重复…...

STM32-笔记34-4G遥控灯
4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...

被催更了,2025元旦源码继续免费送
“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...

Java(day1)
注释 在Java中注释分为单行注释、多行注释还有文档注释 //我是单行注释/*我 是多行 注释 *//** 我是文档注释*/ 关键字 关键字:是被Java赋予了特定含义的英文单词 特点:关键字的字母都是c 在常用的代码编辑器中关键字都有特殊的高亮标记 在这个里…...

PDF文件提示-文档无法打印-的解决办法
背景信息 下载了几个签名的PDF文件,想要打印纸质版,结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器, 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…...

ubuntu操作系统安装SSH服务
1、更新仓库 sudo apt-get update 2、安装SSH服务 #安装SSH服务 apt-get install openssh-server#启用SSH服务 service ssh start#查看SSH服务运行状态 service ssh status 3、修改SSH配置文件 sudo vi /etc/ssh/sshd_config 4、开启ssh端口 sudo ufw allow ssh 5、重启SSH…...

Beamer-LaTeX学习(教程批注版)【1】
该文档总体由beamer-latex的教程而来,由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理,故而不能称之为完全原创,但也不是翻译,更不是抄袭,是个人自学笔记和批注,其中添加了小白个人…...
IIS设置IP+端口号外网无法访问的解决方案
在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …...
Markdown段落的空行缩进用法
Markdown段落的空行缩进用法。 前言语法详解●正文●段落●不分段换行●缩进 使用场景及实例小结其他文章快来试试吧🥰 Markdown段落,分割线的用法 👈点击这里也可查看 前言 段落由一句或多句连续的文本组成,通过一个或多个空行…...

[paddle] 非线性拟合问题的训练
利用paddlepaddle建立神经网络,模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x) 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…...
每日一学——监控工具(Grafana)
2.2 Grafana 2.2.1 数据源配置 嘿,各位小伙伴们!既然我们已经有了Prometheus这位超级英雄来帮我们收集数据,那么接下来我们就需要一位艺术家来把这些枯燥的数据变成美丽的图画。这就是Grafana出场的时候了!Grafana是一款非常流行…...

FreshTomato 路由器固件常见配置以及踩坑记录
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 在上一篇文章《网件 R6400 梅林固件恢复官方固件后刷入 FreshTomato》中,我将网件 R6400 刷入了 FreshTomato 固件,目前已经使用了大半个月了,稳定性比起 380.70_0-X7.9…...

ubuntu 使用samba与windows共享文件[注意权限配置]
在Ubuntu上使用Samba服务与Windows系统共享文件,需要正确配置Samba服务以及相应的权限。以下是详细的步骤: 安装Samba 首先,确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后,…...
使用 httputils + chronicle-bytes 实现金融级 java rpc
1、认识 chronicle-bytes Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库,但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护,旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性…...
软件工程期末复习(一)
题目复习 单选题 软件产品的核心特性是什么? A. 物质性 B. 逻辑性 C. 可复制性 D. 消耗性 正确答案:B 单选题 在软件开发过程中,哪个环节最接近于传统制造业中的“生产”过程? A. 需求分析 B. 编码 C. 测试 D. 研制(…...

element ui 组件 时间选择器出现转换问题的解决办法
在使用时间选择器添加数据是会出现转换失败问题 vue中代码为: 解决办法: 在el-date-picker中添加 format 和 value-format...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...