戴老师的博客 - Redis
type: channel
link: https://tushu.info/tag/Redis/
items: 如何在Redis中管理副本和客户端
items: 如何在Redis中管理字符串
items: 如何使Redis中的Keys失效
items: 在Redis中怎么使用Sets
items: Redis通讯协议
items: 《redis设计与实现》-17 cluster节点
items: 如何在Ubuntu 18.04上安装和保护Redis
items: Redis 中如何使用 lua脚本
items: Redis源码分析（sds）
items: 怎么使用Java实现一个redis内存数据库

如何在Redis中管理副本和客户端
type: item
date: 2026-07-09T04:39:41+00:00
description: Redis 系列教程导航如何在ubuntu18.04上安装和保护redis如何连接到Redis数据库如何管理Redis数据库和Keys如何在Redis中管理副本和客户端如何在Redis中管理字符串如何在Redis中管理list如何在Redis中管理Hashes如何在Redis中管理Sets如何在Redis中管理Sorted Sets如何在Redis中运行事务如何使Redis中的Key失效如何解决Redis中的故障如何从命令行更改Redis的配置Redis数据类型简介Redis 中如何使用 lua 脚本Redis 常用命令指南介绍Redis 是一个开源的内存键值存储系统。它最受欢迎的功能之一是对复制（Replication）的支持：任何 Redis 服务器都可以将其数据复制到任意数量的副本中，从而实现高读取可伸缩性和强大的数据冗余性。此外，Redis 设计允许许多客户端（默认情况下最多 10,000 个）连接数据并与之交互，因此对于许多用户需要访问同一数据集的情况而言，它是一个不错的选择。本教程介绍了用于管理 Redis 客户端和副本的命令。如何使用本指南本指南以备有完整示例的速查表（Cheatsheet）形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。本指南中显示的命令已在运行 Redis 版本 4.0.9 的 Ubuntu 18.04 服务器上进行了测试。要设置类似的环境，您可以按照我们的指南 如何在 Ubuntu 18.04 上安装和保护 Redis 的 步骤 1 进行操作。我们将通过使用 Redis 命令行界面 redis-cli 运行它们来演示这些命令的行为。请注意，如果您使用其他 Redis 界面（例如 Redli），则某些命令的确切输出可能会有所不同。另外，您可以提供一个托管的 Redis 数据库实例来测试这些命令，但是请注意，根据数据库提供者所允许的控制级别，本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库，请遵循我们的 托管数据库产品文档。然后，您必须 安装 Redli 或 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。注意： Redis 项目在其文档和各种命令中使用术语“主（Master）”和“从（Slave）”来标识复制中的不同角色，尽管该项目的参与者 正在采取措施 在不引起兼容性问题的情况下 更改此语言。DigitalOcean 通常更喜欢使用替代术语“主要（Primary）”和“副本（Replica）”。本指南将在可能的情况下默认设置为“主要”和“副本”，但请注意，在某些情况下不可避免地会出现“主”和“从”这两个术语。管理副本Redis 最具特色的功能之一是其 内置的复制功能。使用复制时，Redis 创建主实例的精确副本。这些辅助实例在其连接断开时会随时重新连接至主要实例，并且始终旨在保持主要实例的精确副本。如果不确定当前连接的 Redis 实例是主实例还是副本，则可以通过运行以下 role 命令进行检查：role如果您使用 Redis Sentinel，则此命令将返回 master 或 slave，或者可能返回 sentinel。要将 Redis 实例动态指定为另一个实例的副本，请运行 replicaof 命令。此命令将预期的主服务器的主机名或 IP 地址和端口作为参数：replicaof hostname_or_IP port如果服务器已经是另一台主服务器的副本，它将停止复制旧服务器，并立即开始与新服务器同步。它还将丢弃旧数据集。要将副本提升为主副本，请运行以下 replicaof 命令：replicaof no one这将阻止实例复制主服务器，但不会丢弃已复制的数据集。在原始主数据库失败的情况下，此语法很有用。在 replicaof no one 发生故障的主数据库的副本上运行之后，以前的副本可以用作新的主数据库，并拥有自己的副本作为故障保护。注意： 在 5.0.0 之前的版本中，Redis 包含了此命令的一个名为 slaveof 的版本。管理客户端一个 客户端) 是任何机器或软件连接到服务器才能访问服务。Redis 附带了一些命令，可帮助跟踪和管理客户端连接。该 client list 命令返回一组有关当前客户端连接的可读信息：client listOutput "id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=18166 addr=[2001:db8:0:1:…

如何在Redis中管理字符串
type: item
date: 2026-07-09T04:39:20+00:00
description: 系列教程导航如何在 ubuntu18.04 上安装和保护 redis如何连接到 Redis 数据库如何管理 Redis 数据库和 Keys如何在 Redis 中管理副本和客户端如何在 Redis 中管理字符串如何在 Redis 中管理 list如何在 Redis 中管理 Hashes如何在 Redis 中管理 Sets如何在 Redis 中管理 Sorted Sets如何在 Redis 中运行事务如何使 Redis 中的 Key 失效如何解决 Redis 中的故障如何从命令行更改 Redis 的配置Redis 数据类型简介如何在 Redis 中管理字符串介绍Redis 是一个开源的内存中键值数据存储系统。在 Redis 中，字符串 是您可以创建和管理的最基本值类型。本教程概述了如何创建、检索字符串，以及如何操作字符串键所保存的值。如何使用本指南本指南采用备忘单（Cheatsheet）形式编写，包含完整示例。我们鼓励您直接跳至与您任务相关的部分。本指南中显示的命令已在运行 Redis 4.0.9 的 Ubuntu 18.04 服务器上进行了测试。要设置类似的环境，您可以按照指南 如何在 Ubuntu 18.04 上安装和保护 Redis 的步骤 1进行操作。我们将通过使用 Redis 命令行界面 redis-cli 运行它们来演示这些命令的行为。请注意，如果您使用其他 Redis 界面（例如 Redli），则某些命令的确切输出可能会有所不同。另外，您可以使用托管的 Redis 数据库实例来测试这些命令。但请注意，根据数据库提供者所允许的控制级别，本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库，请遵循 托管数据库产品文档。然后，您必须 安装 Redli 或 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。创建和管理字符串包含字符串的键只能包含一个值，您无法在一个键中存储多个字符串。但是，Redis 中的字符串是二进制安全的（binary-safe），这意味着 Redis 字符串可以保存任何类型的数据，从字母数字字符到 JPEG 图像均可。唯一的限制是字符串长度不能超过 512 MB。要创建一个字符串，请使用 set 命令。例如，以下 set 命令创建一个名为 key_Welcome1 的键，该键包含字符串 "Howdy"：set key_Welcome1 "Howdy"OK要在一个命令中设置多个字符串，请使用 mset：mset key_Welcome2 "there" key_Welcome3 "partners,"您还可以使用 append 命令创建字符串：append key_Welcome4 "welcome to Texas"若字符串创建成功，append 将输出一个整数，表示该字符串包含的字符数：16注意，append 也可以用来更改字符串的内容。有关详细信息，请参见下文 操作字符串 部分。检索字符串要检索字符串，请使用 get 命令：get key_Welcome1Howdy要使用一个命令检索多个字符串，请使用 mget：mget key_Welcome1 key_Welcome2 key_Welcome3 key_Welcome41) "Howdy" 2) "there" 3) "partners," 4) "welcome to Texas"对于传递给 mget 的任意键，若其不包含字符串值或根本不存在，该命令将返回 nil。操作字符串如果字符串由整数组成，则可以运行 incr 命令将其值增加一：set key_1 3 incr key_14同样，您可以使用 incrby 命令将数字字符串的值增加特定的增量：incrby key_1 1620decr 和 decrby 命令的工作方式相同，但它们会减少存储在数字字符串中的整数：decr key_119decrby key_1 163若字符串键已存在，append 会将值附加到现有内容的末尾，并返回新字符串的长度。为了说明这一点，以下命令将 ", y'all" 附加到键 key_Welcome4 所保存的字符串上，因此现在该字符串将显示为 "welcome to Texas, y'all"：append key_Welcome4 ", y'all"15您也可以将整数附加到包含数字值的字符串中。以下示例将 45 附加到包含整数 3 的 key_1，因此它将保持为 345。在这种情况下，append 还将返回字符串的新长度，而不是其新值：append key_1 453(注：此处原文输出为 3，可能是指长度变化或特定上下文，实际 345 长度为 3。.html)由于此键仍仅保留数字值，因此可以对其执行 incr 和 dec…

如何使Redis中的Keys失效
type: item
date: 2026-07-09T04:39:06+00:00
description: 系列教程导航如何在 Ubuntu 18.04 上安装和保护 Redis如何连接到 Redis 数据库如何管理 Redis 数据库和 Keys如何在 Redis 中管理副本和客户端如何在 Redis 中管理字符串如何在 Redis 中管理 List如何在 Redis 中管理 Hashes如何在 Redis 中管理 Sets如何在 Redis 中管理 Sorted Sets如何在 Redis 中运行事务如何使 Redis 中的 Key 失效如何解决 Redis 中的故障如何从命令行更改 Redis 的配置Redis 数据类型简介介绍Redis 是一个开源的内存中键值数据存储系统。默认情况下，Redis 的键（Key）是持久化的，这意味着除非手动删除，否则 Redis 服务器将一直存储它们。但在某些场景下，您可能希望键在设定的一段时间后自动删除，即让键具有可变性（Volatile）。本教程将说明如何设置键的过期时间、如何检查键的剩余存活时间，以及如何取消键的过期设置。如何使用本指南本指南以备有完整示例的备忘单形式编写。您可以直接跳转至与您任务相关的任何部分。本指南中显示的命令已在运行 Redis 4.0.9 版本的 Ubuntu 18.04 服务器上进行了测试。要设置类似的环境，您可以按照我们的指南 如何在 Ubuntu 18.04 上安装和保护 Redis 的 步骤 1 进行操作。我们将通过使用 redis-cli（Redis 命令行界面）运行命令来演示其行为。请注意，如果您使用其他 Redis 客户端（例如 Redli），某些命令的确切输出可能会有所不同。另外，您也可以使用托管的 Redis 数据库实例来测试这些命令。但请注意，根据数据库提供者允许的控制级别，本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库，请遵循我们的 托管数据库产品文档。然后，您必须 安装 Redli 或 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。设置键的过期时间您可以使用 expire 命令设置现有键的过期时间。该命令接受键名和直到过期的秒数作为参数。为了证明这一点，请运行以下两个命令。第一条命令创建一个名为 key_melon 的字符串键，值为 "cantaloupe"；第二条命令将其设置为在 450 秒后超时：set key_melon "cantaloupe" expire key_melon 450如果成功设置了超时，expire 命令将返回 (integer.html) 1。如果设置超时失败（例如键不存在），它将返回 (integer.html) 0。或者，您可以使用 expireat 命令将键设置为在特定的时间点过期。它使用 Unix 时间戳 作为参数，而不是到期前的秒数。Unix 时间戳是自 _Unix 纪元_（即 1970 年 1 月 1 日 UTC 00:00:00）以来的秒数。可以使用许多在线工具来查找特定日期和时间的 Unix 时间戳，例如 EpochConverter 或 UnixTimestamp.com。例如，要设置 key_melon 为在 2025 年 5 月 1 日格林尼治标准时间晚上 8:30 到期（对应的 Unix 时间戳为 1746131400），可以使用以下命令：expireat key_melon 1746131400请注意，如果传递给 expireat 的时间戳已经发生，它将立即删除该键。检查键的剩余过期时间在任何时候，您都可以检查键距离过期还有多少时间（以秒为单位）。可以使用 ttl 命令，其全称为 "Time To Live"：ttl key_melon输出示例：(integer.html) 433有关更详细的信息，可以运行 pttl 命令，它将返回直到键过期的时间（以毫秒为单位）：pttl key_melon输出示例：(integer.html) 431506如果键尚未设置为过期，ttl 和 pttl 都将返回 (integer.html) -1。如果键不存在，两者都将返回 (integer.html) -2。使键持久化如果键已设置为过期，任何覆盖键内容的命令（例如 set 或 getset）都会清除键的超时值。若要手动清除键的超时设置使其永久保存，请使用 persist 命令：persist key_melon如果成功完成，persist 命令将返回 (integer.html) 1，表明该键将不再过期。结论本指南详细介绍了用于在 Redis 中操作和检查键持久性的许多命令。如果您想在本指南中概述其他相关的命令、参数或过程，请在下面的评论中提出疑问或提出建议。有关 Redis 命令的更多信息，请参阅关于 如何管理 Redis 数据库的 系列教程。说明：…

在Redis中怎么使用Sets
type: item
date: 2026-07-09T04:38:25+00:00
description: 本系列教程如何在 ubuntu18.04 上安装和保护 redis如何连接到 Redis 数据库如何管理 Redis 数据库和 Keys如何在 Redis 中管理副本和客户端如何在 Redis 中管理字符串如何在 Redis 中管理 list如何在 Redis 中管理 Hashes如何在 Redis 中管理 Sets如何在 Redis 中管理 Sorted Sets如何在 Redis 中运行事务如何使 Redis 中的 Key 失效如何解决 Redis 中的故障如何从命令行更改 Redis 的配置Redis 数据类型简介在 Redis 中怎么使用 SetsRedis 是一个开源的内存中键值数据存储。集合 (Sets.html) 是存储在 Redis 给定键 (Key.html) 下的字符串集合。当保存在集合中时，单个记录值称为_成员 (Member.html)_。与列表 (List.html) 不同，集合是无序的，并且不允许重复的值。本教程说明了如何创建集合、检索和删除成员，以及比较不同集合的成员。如何使用本指南本指南以备有完整示例的速查表形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。本指南中显示的命令已在运行 Redis 版本 4.0.9 的 Ubuntu 18.04 服务器上进行了测试。要设置类似的环境，您可以按照我们的指南 如何在 Ubuntu 18.04 上安装和保护 Redis 的步骤 1进行操作。我们将通过使用 redis-cli 运行它们来演示这些命令的行为。请注意，如果您使用其他 Redis 界面（例如 Redli），则某些命令的确切输出可能会有所不同。另外，您可以提供一个托管的 Redis 数据库实例来测试这些命令，但是请注意，根据数据库提供者所允许的控制级别，本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库，请遵循我们的 托管数据库产品文档。然后，您必须 安装 Redli 或 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。创建集合 (Creating Sets.html)sadd 命令允许您创建一个集合并向其中添加一个或多个成员。下面的例子将创建一组在一个名为键 key_horror 与成员 "Frankenstein" 和 "Godzilla"：sadd key_horror "Frankenstein" "Godzilla"如果成功，sadd 将返回一个整数，显示它添加到集合中的成员数量：Output (integer.html) 2如果您尝试将集合的成员添加到已经持有非集合值的键中，它将返回错误。在此块中的第一个命令创建一个 列表 命名的 key_action 一个元素，"Shaft"。下一条命令尝试将 set 成员添加 "Shane" 到列表中，但是由于数据类型冲突而产生错误：rpush key_action "Shaft" sadd key_action "Shane"Output (error.html) WRONGTYPE Operation against a key holding the wrong kind of value请注意，集合不允许同一成员出现多次：sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"Output (integer.html) 4即使此 sadd 命令指定了八个成员，它也会丢弃四个重复的 "Mad" 成员，从而将大小设置为 4。从集合中检索成员 (Retrieving Members from Sets.html)在本节中，我们将介绍一些 Redis 命令，这些命令返回有关集合中持有的成员的信息。要练习此处概述的命令，请运行以下命令，这将创建一个由六个成员组成的集合，该集合的键为 key_stooges：sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"要从集合中返回每个成员，请运行 smembers 命令，然后输入要检查的密钥：smembers key_stoogesOutput 1) "Curly" 2) "Moe" 3) "Larry" 4) "Shemp" 5) "Curly Joe" 6) "Joe"要检查特定值是否是集合的成员，请使用以下 sismember 命令：sismember key_stooges "Harpo"如果元素 "Harpo" 是 key_stooges 集合的成员，sismember 则将返回 1。否则，它将返回 0：Output (integer.html) 0要查看给定集合中有多少成员（换句话说，找到给定集合的_基…

Redis通讯协议
type: item
date: 2026-07-09T04:38:20+00:00
description: Redis 通讯协议 (RESP.html)Redis 的通信协议全称为 Redis Serialization Protocol（简称 RESP）。该协议是二进制安全（binary-safe）的，具有以下显著特性：实现简单、快速解析以及可读性好。RESP 是 Redis 客户端与服务端之间进行通信的标准协议。客户端向服务端发送命令请求，服务端则根据命令类型返回相应的数据。需要注意的是，协议中的每一部分均以回车换行符 \r\n 结尾。命令协议示例以下是一个 SET 命令的原始协议格式示例。客户端发送三条数据（命令名、键、值），服务端回复操作结果。*3\r\n // 消息一共有三行（3 个参数） $3\r\n // 第一行字节数为 3 set\r\n // 第一行的消息内容 $3\r\n // 第二行字节数为 3 abc\r\n // 第二行的消息内容 $6\r\n // 第三行字节数为 6 123456\r\n // 第三行的消息内容 +OK\r\n // 服务端回复：操作成功客户端交互演示在实际使用中，我们可以通过 redis-cli 或 telnet 工具观察客户端与服务端的交互过程。1. 使用 redis-clidaichangyadeMacBook-Pro:~ daichangya$ redis-cli -h localhost -p 6379 localhost:6379> set abc 123456 OK localhost:6379> get abc "123456" localhost:6379> quit2. 使用 telnet 查看原始协议通过 telnet 可以直接看到底层的协议交互内容（注意输入需符合 RESP 格式）：daichangyadeMacBook-Pro:~ daichangya$ telnet localhost 6379 Trying ::1... Connected to localhost. Escape character is '^]'. *2 $3 get $3 abc $6 123456 quit +OK Connection closed by foreign host.说明本文描述的为经典 RESP 协议（通常指 RESP2），该版本在 Redis 6.0 之前是默认协议。Redis 6.0 虽引入了 RESP3，但 RESP2 至今仍被广泛支持且兼容大多数客户端。

《redis设计与实现》-17 cluster节点
type: item
date: 2026-07-09T04:37:46+00:00
description: 《Redis 设计与实现》笔记 - Cluster 节点关于 Redis 的集群，官网介绍比较全面，参考：https://redis.io/topics/cluster-spec。设计目标高性能与线性可扩展性（High performance and linear scalability）支持高达 1000 个节点的线性扩展。没有代理（proxies），使用异步复制，并且在进行赋值时没有合并操作。可接受程度的写安全（Acceptable degree of write safety）系统努力（使用最优的方式）保持来自与大多数 master 节点建立连接的客户端的写操作。通常存在小窗口，其中确认的写操作可能会丢失。当客户端在一个小的分区中时，丢失写操作的窗口会更大。可用性（Availability）Redis 集群支持网络分区——其中大部分主节点都可访问，并且不可访问的各 master 节点对应的从节点中至少有一个可访问。采用副本迁移（replicas migration）：有多个从节点的主节点会提供一个从节点给没有从节点的主节点。正是 Redis Cluster 作为 Redis 的分布式解决方案，有效解决了 Redis 在分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时，可以采用 Cluster 架构达到负载均衡的目的。背景知识点：数据分布理论分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题，即把数据集划分到多个节点上，每个节点负责整个数据的一个子集。所谓的数据分区就是将一个较大的数据集分布在不同的节点上进行储存。常见的数据分区方式包括：节点取余原理：根据 key 的 hash 值和节点数取模的方式计算出节点 ID，然后向对应的节点提交数据。缺点：节点的增删会造成大量的数据迁移。一致性哈希原理：对于任何的哈希函数，都有其取值范围。我们可以用环形结构来标识范围。通过哈希函数，每个节点都会被分配到环上的一个位置，每个键值也会被映射到环上的一个位置，然后顺时针找到相邻的节点。缺点：节点调整会造成数据分布不均等的问题。虚拟槽（Virtual Slot）原理：虚拟槽分区巧妙地使用了哈希空间，使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合，整数定义为槽（slot）。比如 Redis Cluster 槽的范围是 0 ～ 16383。优势：槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展，每个节点负责一定数量的槽。节点 (Node.html)在单机版的 Redis 中，每个 Master 之间是没有任何通信的。要组建一个真正可工作的集群，我们必须将各个独立的节点连接起来，构成一个包含多个节点的集群。连接各个节点的工作可以使用 CLUSTER MEET 命令来完成，该命令的格式如下：CLUSTER MEET <ip> <port>向一个节点 node 发送 CLUSTER MEET 命令，可以让 node 节点与 ip 和 port 所指定的节点进行握手（handshake）。当握手成功时，node 节点就会将 ip 和 port 所指定的节点添加到当前所在的集群中。2.1 启动节点一个节点就是一个运行在集群模式下的 Redis 服务器。Redis 服务器在启动时会根据 cluster_enabled 配置选项是否为 yes 来决定是否开启服务器的集群模式。.... // 集群开启，则初始化 cluster if (server.cluster_enabled.html) clusterInit(); ...// 初始化集群 void clusterInit(void.html) { int saveconf = 0; // 初始化配置 server.cluster = zmalloc(sizeof(clusterState.html)); server.cluster->myself = NULL; server.cluster->currentEpoch = 0; // 初始为 FAIL 状态 server.cluster->state = CLUSTER_FAIL; // master 节点数 server.cluster->size = 1; server.cluster->todo_before_sleep = 0; server.cluster->nodes = dictCreate(&clusterNodesDictType,NULL.html); server.cluster->nodes_black_list = dictCreate(&clusterNodesBlackListDictType,NULL.html); server.clus…

如何在Ubuntu 18.04上安装和保护Redis
type: item
date: 2026-07-09T04:37:30+00:00
description: 系列教程导航如何在 Ubuntu 18.04 上安装和保护 Redis如何连接到 Redis 数据库如何管理 Redis 数据库和 Keys如何在 Redis 中管理副本和客户端如何在 Redis 中管理字符串如何在 Redis 中管理 list如何在 Redis 中管理 Hashes如何在 Redis 中管理 Sets如何在 Redis 中管理 Sorted Sets如何在 Redis 中运行事务如何使 Redis 中的 Key 失效如何解决 Redis 中的故障如何从命令行更改 Redis 的配置Redis 数据类型简介简介Redis 是一款知名的内存键值存储系统（In-Memory Key-Value Store），以其灵活性、高性能和广泛的语言支持而著称。本教程将演示如何在 Ubuntu 18.04 服务器上安装、配置和保护 Redis。先决条件要完成本指南，您需要满足以下条件：访问一台 Ubuntu 18.04 服务器。拥有一个具有 sudo 权限的非 root 用户。配置了基本防火墙。您可以按照我们的 初始服务器安装指南 进行设置。准备就绪后，请以 sudo 用户身份登录到 Ubuntu 18.04 服务器，然后继续后续步骤。第 1 步：安装和配置 Redis为了获得适用于 Ubuntu 存储库的稳定版本，我们将使用 apt 包管理器进行安装。首先，更新本地包缓存并安装 Redis：sudo apt update sudo apt install redis-server这将下载并安装 Redis 及其依赖项。安装完成后，我们需要对自动生成的 Redis 配置文件进行一项重要的更改。使用您喜欢的文本编辑器打开配置文件：sudo nano /etc/redis/redis.conf在文件内部，找到 supervised 指令。该指令允许您声明一个初始化系统来将 Redis 作为服务进行管理，从而为您提供对其操作的更多控制。默认情况下，该指令设置为 no。由于您正在运行使用 systemd 初始化系统的 Ubuntu，请将其更改为 systemd：# /etc/redis/redis.conf # If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: # supervised no - no supervision interaction # supervised upstart - signal upstart by putting Redis into SIGSTOP mode # supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET # supervised auto - detect upstart or systemd method based on # UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." # They do not enable continuous liveness pings back to your supervisor. supervised systemd这是目前唯一需要对 Redis 配置文件进行的更改。完成后保存并关闭文件。然后，重新启动 Redis 服务以应用配置更改：sudo systemctl restart redis.service至此，您已经安装并配置了 Redis，且服务正在运行。但在开始使用之前，建议先检查 Redis 是否运行正常。第 2 步：测试 Redis与任何新安装的软件一样，在进行进一步配置更改之前，最好确保 Redis 能够按预期运行。我们将通过几种方法来检查 Redis 在此步骤中是否正常工作。首先，检查 Redis 服务状态：sudo systemctl status redis如果它正在运行且无错误，命令将输出类似于以下内容的信息：● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled.html) Active: active (running.html) since Wed 2018-06-27 18:48:5…

Redis 中如何使用 lua脚本
type: item
date: 2026-07-09T04:36:52+00:00
description: 相关 Redis 教程系列如何在 Ubuntu 18.04 上安装和保护 Redis如何连接到 Redis 数据库如何管理 Redis 数据库和 Keys如何在 Redis 中管理副本和客户端如何在 Redis 中管理字符串如何在 Redis 中管理 List如何在 Redis 中管理 Hashes如何在 Redis 中管理 Sets如何在 Redis 中管理 Sorted Sets如何在 Redis 中运行事务如何使 Redis 中的 Key 失效如何解决 Redis 中的故障如何从命令行更改 Redis 的配置Redis 数据类型简介Redis 中如何使用 Lua 脚本Redis 常用命令指南Redis 中如何使用 Lua 脚本Lua：Redis 用户指南您可能听说过 Redis 具有嵌入式脚本语言，但尚未尝试过？以下是您在 Redis 服务器上使用 Lua 功能时需要了解的核心内容。你好，Lua！我们的第一个 Redis Lua 脚本仅返回一个值，并未与 Redis 进行任何实质性的交互：local msg = "Hello, World!" return msg这很简单。第一行使用消息设置了一个局部变量，第二行将该值从 Redis 服务器返回给客户端。将此文件另存为 hello.lua 并按以下方式运行：redis-cli --eval hello.lua连接说明本 redis-cli 示例假定您在本地运行 Redis 服务器。运行此命令将打印 "Hello, World!"。EVAL 命令的第一个参数是完整的 Lua 脚本（在这里，我们使用 cat 命令从文件中读取脚本）。第二个参数是脚本将访问的 Redis Key 的数量。我们简单的 "Hello World" 脚本不访问任何键，因此我们使用 0。访问键和参数假设我们正在构建一个 URL 缩短器。每次出现 URL 时，我们都希望存储它并返回一个唯一的数字，该数字可用于以后访问 URL。我们将使用 Lua 脚本从 Redis 获取唯一的 ID（使用 INCR），然后立即将 URL 存储在以唯一 ID 为键的哈希（Hash）中：local link_id = redis.call("INCR", KEYS[1].html) redis.call("HSET", KEYS[2], link_id, ARGV[1].html) return link_id我们在此处首次使用 call() 函数访问 Redis。call() 的参数是发送给 Redis 的命令：首先是 INCR <key>，然后是 HSET <key> <field> <value>。这两个命令将按顺序运行——该脚本执行时 Redis 不会执行任何其他操作，并且运行速度非常快。我们正在访问两个 Lua 表（Table）：KEYS 和 ARGV。表是关联数组，是 Lua 构造数据的唯一机制。出于我们的目的，您可以将它们视为您最熟悉的任何语言中的数组，但请注意，这两种 Lua 特性常使刚接触该语言的人们困惑：表是基于 1 的索引（1-based indexing）：索引从 1 开始。因此，mytable 的第一个元素是 mytable[1]，第二个元素是 mytable[2]，依此类推。表不能包含 nil 值：如果某个操作产生的表为 [ 1, nil, 3, 4 ]，则结果将为 [ 1 ]——该表在第一个 nil 值处被截断。调用此脚本时，还需要传递 KEYS 和 ARGV 表的值。在原始 Redis 协议中，命令如下所示：EVAL $incrset.lua 2 links:counter links:url https://tushu.info/调用 EVAL 时，在脚本之后，我们提供脚本将要访问的 KEYS 数目（此处为 2），然后列出我们的 KEYS，最后为 ARGV 提供值。通常，当我们使用 Redis Lua 脚本构建应用程序时，Redis 客户端库将负责指定键数。上面的代码块是出于完整性考虑而显示的，以下是在命令行上执行此操作的更简单方法：redis-cli --eval incrset.lua links:counter links:urls , https://tushu.info/当使用 --eval 时，逗号用于分隔 KEYS 和 ARGV 项目。为了清楚起见，这是我们的原始脚本，这次将 KEYS 和 ARGV 展开了：local link_id = redis.call("INCR", "links:counter".html) redis.call("HSET", "links:urls", link_id, "https://blog.jsdiff.com".html) return …

Redis源码分析（sds）
type: item
date: 2026-07-09T04:36:43+00:00
description: 源码版本：redis-4.0.1 源码位置：https://github.com/antirez/sds一、SDS 简介SDS（Simple Dynamic String）是 Redis 自行封装的字符串类型。其中 Simple 意为简单，Dynamic 意为动态，表明其具备动态扩容能力，使用者无需关心空间分配细节；String 即字符串。该项目由 Redis 作者 antirez 创建，作为 Redis 的核心数据结构之一，现已独立为一个单独的项目，地址见 这里。SDS 经历过版本迭代。在 Redis 3.2 之前使用的是第一版，其数据结构如下：typedef char *sds; // 注意：sds 并非结构体类型，而是被 typedef 为 char*，优势见下文 struct sdshdr { unsigned int len; // buf 中已使用的长度 unsigned int free; // buf 中未使用的长度 char buf[]; // 柔性数组成员 (flexible array member.html) };在 Redis 3.2 版本中，数据结构进行了优化。针对不同的长度范围定义了不同的结构体，以节省内存开销。目前的结构如下：typedef char *sds; // 对应的字符串长度小于 1<<5 (32.html) struct __attribute__ ((__packed__.html)) sdshdr5 { unsigned char flags; /* 3 bit 类型标识，5 bit 字符串长度 */ char buf[]; }; // 对应的字符串长度小于 1<<8 (256.html) struct __attribute__ ((__packed__.html)) sdshdr8 { uint8_t len; // 当前字符串长度 uint8_t alloc; // 已分配的总长度 unsigned char flags; // 3 bit 类型标识，其余 5 bit 未使用 char buf[]; // 柔性数组，以 '\0' 结尾 }; // 对应的字符串长度小于 1<<16 struct __attribute__ ((__packed__.html)) sdshdr16 { uint16_t len; uint16_t alloc; unsigned char flags; char buf[]; }; // 对应的字符串长度小于 1<<32 struct __attribute__ ((__packed__.html)) sdshdr32 { uint32_t len; uint32_t alloc; unsigned char flags; char buf[]; }; // 对应的字符串长度小于 1<<64 struct __attribute__ ((__packed__.html)) sdshdr64 { uint64_t len; uint64_t alloc; unsigned char flags; char buf[]; };新版结构的好处在于针对不同长度的字符串选择了合适的数据类型（如 uint8_t、uint16_t 等）来表示长度和分配大小，从而节省内存。结构体中的 __attribute__ ((__packed__.html)) 指令告诉编译器取消字节对齐，使得结构体大小等于成员实际大小之和，进一步优化空间。二、SDS 的优势和不足与一般的自定义 String 结构相比，SDS 有其独特的优势和不足。假设我们用 C 语言定义一个普通的 String 结构体，通常如下：struct mysds { char *buf; // 存储实际字符 size_t len; // 字符串长度 // ... 其他成员 };若要打印 buf 的内容，使用方式如下：struct mysds *sds = mysdsnew("Hello World".html); // 假设 mysdsnew 分配空间并初始化 printf("%s", sds->buf.html); /* 输出 */ // Hello World此时打印的是 struct mysds 的成员 buf，需要通过指针操作。而 Redis SDS 的定义是 typedef char *sds;，实现同样功能的代码如下：sds s = sdsnew("Hello World".html); printf("%s", s.html); /* 输出 */ // Hello World这里直接输出 s 即可。之所以能这样操作，是因为其内存布局如下所示：+--------+-----------------…

怎么使用Java实现一个redis内存数据库
type: item
date: 2026-07-09T04:36:41+00:00
description: 编者注：本文为历史博文归档；涉及 JDK、框架与工具链版本请以当前官方文档为准。引用外链图片可能失效，阅读时请注意时效性。关于作者与交流扫码关注微信公众号「Java 码界探秘」，获取更多技术文章。博客地址：https://tushu.info/项目简介：java-redis本项目是一个基于 Java 实现的简易 Redis 服务器（redis-server），旨在通过代码模拟 Redis 的核心功能，帮助开发者深入理解内存数据库的工作原理。项目仓库：java-redis (https://github.com/daichangya/java-redis.html)系统架构概览下图展示了 java-redis 的整体系统架构，涵盖了从客户端请求到数据存储的完整流程： +---------------+ | 客户端 | +-------+-------+ | +----------+----------+ | 网络层 | +----------+----------+ | +-----------------+------------+ | java-redis 服务器 | +-----------------+------------+ | | | +-------v-----+ +-------v-----+ +-----v-----+ |命令解析模块 | |数据处理模块 | |...其他模块 | +---------------+ +---------------+ +---------+ | +----------+ | 内存/磁盘 | | 存储 | +----------+核心模块设计为了实现高性能与高可维护性，java-redis 采用了模块化设计。以下是系统内部的核心组件划分：1. 客户端与服务器架构客户端（Clients）：任何能够通过网络发送请求到 java-redis 服务器的应用程序。请求支持标准的 Redis 命令，如 GET、SET 等。网络层（Network Layer）：负责处理客户端与服务器之间的网络通信。基于 TCP/IP 协议，监听端口并接受客户端连接请求。服务器核心（Server）：使用 Java 语言编写，模拟 Redis 服务器行为。主要负责处理客户端请求、管理数据结构（字符串、列表、集合等）并执行相应操作。2. 内部功能模块网络通信模块：监听网络端口，接受客户端连接，并将接收到的请求数据传递给命令处理模块。项目中推测使用 Netty 框架来实现高效的网络通信。命令解析模块：解析来自客户端的 Redis 命令字符串，将其转换为内部操作指令，并调用相应的处理函数。数据处理模块：根据命令要求，对内存中的数据结构进行增删改查（CRUD）操作。项目实现或集成了一系列高效的数据结构和算法，以支持 Redis 各种数据类型的高效存取。内存管理模块（可选）：针对高性能需求，可实施专门的内存管理策略以优化性能，减少垃圾回收（GC）的影响。异常处理与日志：包含完善的异常处理机制和日志记录功能，记录服务器运行状态和错误信息，便于调试与维护。配置模块：提供服务器配置的管理界面，支持运行时参数的调整。3. 扩展功能（可选）数据持久化：为了在系统故障时恢复数据，java-redis 可实现磁盘持久化功能。支持方式包括 AOF（Append Only File）或 RDB（Redis Database）快照。安全性与认证：若需处理敏感数据或在公开网络环境中运行，可实现 TLS/SSL 加密通信及客户端身份验证等安全机制。项目内容与用途1. 项目主要内容Redis 服务器模拟：实现了简化的 Redis 服务器核心，支持字符串、列表、集合、哈希表、有序集合等基本数据结构的存取操作。Redis 客户端工具：提供了与服务器交互的 Java 客户端工具，演示如何使用 Java 语言连接并操作 Redis 服务器。教学示例代码：包含一系列示例代码，涵盖配置、连接、执行命令等环节，用于教学如何在 Java 中使用 Redis。2. 项目适用场景学习与研究：为 Java 开发者提供研究 Redis 内部工作原理的机会，适合希望深入了解内存数据库实现或尝试编写自己 Redis 版本的开发者。教学辅助：可作为大学课程或在线课程的教学材料，帮助学生通过实际代码理解 Redis 的基本概念和操作逻辑。测试与验证：可用于测试自定义的 Redis 客户端库或应用程序，验证其与 Redis 服务器的交互是否符合预期。说明：本文涉及的技术实现基于历史版本归档，具体代码细节与依赖库版本请以 GitHub 仓库最新提交为准。