参考书籍:
《Redis使用手册》黄健宏 著
一. 引言
1. Redis简介
Redis 是由 Salvatore Sanfilippo(Antirez)开发的开源内存数据结构存储系统,广泛用作数据库、缓存和消息代理。它凭借丰富的数据结构、出色的性能、完备的功能和简洁的设计,已成为内存数据库领域的事实标准,在国内外众多互联网公司如微博、Twitter、GitHub、Stack Overflow、知乎等均有大规模应用。
结构丰富:Redis 提供了字符串、散列、列表、集合、有序集合、HyperLogLog、位图、流、地理坐标等一系列数据结构,每种结构都针对特定场景设计,用户还可通过事务、Lua 脚本、模块等机制扩展功能,确保能选用最合适的工具解决问题。
功能完备:在功能方面,Redis 不仅具备自动过期、流水线、事务、数据持久化等实用特性,还支持复制、Sentinel 和集群模式,可实现从单机到大规模分布式部署的灵活扩展,满足不同规模业务的需求。
速度飞快:作为内存数据库,Redis 将数据存储于内存,读写速度远高于传统硬盘数据库。其底层采用高效的数据结构与算法,在保障操作快速执行的同时,也注重内存使用的节约。
用户友好:Redis 的 API 设计遵循 UNIX“一次只做好一件事”的哲学,大部分指令简洁明确、参数少、易于使用。官方提供了完善的文档,社区支持也十分活跃,用户可通过 GitHub、Google Group 或作者社交账号获取帮助。
支持广泛:此外,Redis 拥有广泛的生态支持,多数编程语言均有对应的客户端库。主流云服务商如亚马逊、谷歌、阿里云、腾讯云等也提供兼容 Redis 的托管服务,方便用户快速接入而无需自建服务器。

2. 执行命令


Redis服务器通过接收客户端发送的命令请求来执行指定命令,并在执行完毕后通过响应将结果返回给客户端,这一过程称为命令回复。该机制清晰展示了Redis服务器与客户端之间的交互流程,确保了命令处理的高效性。
Redis为每种数据结构和功能特性提供了相应的命令,掌握这些命令是学习的关键。大多数Redis命令设计简洁,仅需少量参数即可实现强大功能。命令格式统一为“COMMAND [参数1 参数2 ...] [可选项1 值1] [可选项2 值2] ...”,其中命令名和可选项名通常用大写字母,参数和值用小写字母,方括号表示可选部分,执行时无需输入,省略号表示可接受多个参数或选项。
以PING命令为例,它用于测试客户端与服务器的连接,可选消息参数格式为“PING [message]”。无参数时,连接正常则返回“PONG”;有参数则原样返回消息,如执行“PING "hello world"”返回“"hello world"”。若连接异常,客户端返回错误信息,如“Could not connect to Redis at 127.0.0.1:6379: Connection refused”。命令示例中的注释以“--”开头,仅用于说明问题,非命令部分。这种格式规范与示例直观体现了Redis命令的灵活性和易用性。
3. 配置服务器
在 Redis 服务器配置过程中,通常可采用两种方法实现配置选项的设定。
第一种方法是在启动 Redis 服务器时通过命令行参数直接指定配置选项,格式为:
$ redis-server --OPTION1 [value1 value2 ...] --OPTION2 [value1 value2 ...] [...]例如,若需将默认端口号从 6379 改为 10086,可使用如下命令启动:
$ redis-server --port 10086第二种方法是通过配置文件进行设置,用户可将需要修改的配置项写入一个配置文件中,启动时指定该文件路径即可。例如,若要将端口改为 12345,可创建配置文件
myredis.conf,内容为port 12345,随后通过以下命令启动服务器:$ redis-server myredis.conf这两种方式均能有效完成 Redis 服务器的配置,适用于不同场景下的使用需求。
二. 字符串
Redis字符串(string)键是该数据库最基本的键值对类型,每个键关联一个独立的值。这些关联数据不仅支持文本内容(如普通文字),也可存储图片、视频、音频或压缩文件等二进制数据。
示例包括:键“message”对应文本值“hello world”;键“number”对应数值“10086”;键“homepage”对应网址“redis.io”;键“redis-logo.jpg”则关联一段以十六进制表示的二进制图像数据(如“\xff\xd8\xff\xe0...”)。这体现了字符串键在存储格式上的灵活性。

Redis为字符串键提供了全面的操作命令,支持对键值对进行多种操作:用户可为单个字符串键设置值、获取其值,或在获取旧值的同时设置新值;还支持同时为多个字符串键设置值,或一次性获取多个字符串键的值。
此外,Redis允许对字符串值本身执行丰富的处理操作,包括:获取字符串值的长度;按索引范围获取或修改字符串的指定部分;向字符串末尾追加内容;若字符串值为整数或浮点数,还可直接对其执行加法或减法运算。
1. SET:为字符串健设置值
在 Redis 中创建字符串键最常用的方法是使用 SET 命令,该命令用于为指定键设置对应的值。其基本语法为
SET key value,其中键和值既可以是文本内容,也支持二进制数据。SET 命令成功执行后将返回“OK”作为操作结果。例如,执行命令
SET number "10086"即可创建键为“number”、值为“10086”的字符串键。又如,通过SET book "The Design and Implementation of Redis"可创建键为“book”、值为书名全称的字符串键。这些操作会改变数据库中键值对的存储状态,如图示中通过执行前后对比可直观展示其变化。

为了方便阅读,本书在示意图中将新出现的键统一放置在已有键的下方进行展示。在实际的 Redis 数据库中,键的存储是无序的,新添加的键可能出现在任意位置。因此在使用过程中,不应对键的存放位置作任何顺序假设,以免产生错误。
①改变覆盖规则
Redis 的 SET 命令默认会覆盖已有键的值,例如连续执行
SET song_title "Get Wild"和SET song_title "Running to Horizon"后,键的值将从 "Get Wild" 变为 "Running to Horizon"。从 Redis 2.6.12 版本起,SET 命令支持 NX 和 XX 选项来控制覆盖行为:使用 NX 选项时,命令仅在键无值时执行设置(如
SET password "123456" NX成功返回 OK),若键已存在则放弃设置(如SET password "999999" NX返回 nil);使用 XX 选项时,命令仅在键有值时执行设置(如SET mysql-homepage "mysql.com" XX成功覆盖旧值),若键无值则放弃设置(如SET mongodb-homepage "mongodb.com" XX返回 nil)。这些选项提供了更灵活的值更新策略。
②其他信息
Redis 的 SET 命令具有恒定的时间复杂度 O(1),这意味着其执行时间不随数据规模增长而增加,性能高效。
在版本支持方面,基础的 SET 命令(不包含任何附加选项)自 Redis 1.0.0 版本起可用;而支持 NX、XX 等可选参数的 SET 命令则从 Redis 2.6.12 版本开始提供,用户在使用相关功能时需注意版本兼容性。
2. GET:获取字符串健的值
Redis 提供了 GET 命令用于获取指定字符串键关联的值,语法为
GET key。例如,对于包含message、number和homepage键的数据库,执行GET message返回"hello world",GET number返回"10086",GET homepage返回"redis.io"。若指定的键在数据库中无对应值,GET 命令将返回空值(nil)。例如执行
GET date会返回(nil),表示该键不存在。在 Redis 中,键的存在以是否关联值为准:有关联值的键视为存在,反之则视为不存在。因此,date键不存在,而message、number和homepage键均存在。GET 命令的时间复杂度为 O(1),这意味着其执行时间不随数据规模变化,具有极高的执行效率。该命令自 Redis 1.0.0 版本起就已提供,具备良好的版本兼容性,用户可在绝大多数 Redis 环境中使用。

3. GETSET:获取旧值并设置新值
GETSET 命令是 GET 和 SET 命令的组合操作,它会先获取指定字符串键的当前值,然后为该键设置新值,最后将获取到的旧值返回给用户。其语法为
GETSET key new_value。例如,若键
number的当前值为"10086",执行GETSET number "12345"将返回旧值"10086",同时将该键的值更新为"12345"。如果被设置的键原本不存在于数据库中,GETSET 命令会返回空值(nil)作为旧值,例如对不存在的键counter执行GETSET counter 50将返回(nil),之后该键的值将被设置为"50"。该命令的时间复杂度为 O(1),执行效率高,且自 Redis 1.0.0 版本起即可使用,具有良好的兼容性。