Redis数据库基础
1. 数据库概述:关系型 vs 非关系型
在深入了解 Redis 之前,我们需要理解数据库的两大主要类别:关系型数据库和非关系型数据库。它们在数据模型、存储方式、查询语言、扩展性等方面存在显著差异。
1.1 关系型数据库 (RDBMS)
- 定义: 关系型数据库管理系统基于关系模型 。数据以二维表格的形式组织存储。每张表由行 (记录) 和列 (字段) 组成。
- 核心概念:
- 表 (Table): 存储特定类型数据的结构化集合。例如:
用户表、订单表。 - 行 (Row / Record): 表中的一条记录,代表一个实体。例如:一个用户的信息。
- 列 (Column / Field): 表中的一个属性。例如:
用户名、邮箱、创建时间。 - 主键 (Primary Key): 唯一标识表中每一行的列 (或列组合)。
- 外键 (Foreign Key): 一个表中的字段,引用另一个表的主键,用于建立表之间的关系 (关联)。
- SQL (Structured Query Language): 用于操作和查询关系型数据库的标准语言。核心操作包括
SELECT,INSERT,UPDATE,DELETE。 - ACID 特性: 强调事务的可靠性。
- 原子性 (Atomicity): 事务中的所有操作要么全部完成,要么全部不完成。
- 一致性 (Consistency): 事务执行前后,数据库状态都满足完整性约束。
- 隔离性 (Isolation): 并发执行的事务互不干扰。
- 持久性 (Durability): 事务提交后,对数据的修改是永久性的。
- 表 (Table): 存储特定类型数据的结构化集合。例如:
- 代表产品:
MySQL,Oracle,SQL Server,PostgreSQL。 - 优点:
- 结构化数据,模式严格: 数据格式预定义,清晰明确。
- 强大的 SQL 查询能力: 复杂的多表关联查询、聚合分析能力强。
- 事务支持完善: ACID 特性保障了数据的强一致性,适用于金融交易等场景。
- 缺点:
- 扩展性挑战: 垂直扩展 (升级硬件) 成本高,水平扩展 (分库分表) 复杂。
- 灵活性不足: 预定义的模式难以适应快速变化的业务需求或半结构化/非结构化数据。
- 读写性能瓶颈: 在高并发、大数据量场景下,性能可能受限。
1.2 非关系型数据库 (NoSQL)
- 定义:
NoSQL(Not Only SQL) 是一类不遵循传统关系模型的数据库统称。它设计用于应对大数据量、高并发、灵活数据结构等场景的挑战。 - 核心特点:
- 灵活的数据模型: 支持键值对、文档、列族、图等多种数据模型,无需预先定义严格的模式 (Schema-less 或 Schema-flexible)。
- 易于水平扩展: 通常设计为分布式架构,便于通过添加更多节点来扩展性能和存储容量。
- 高可用性与高性能: 为特定场景优化,往往能提供极高的读写吞吐量和低延迟。
- 弱化了 ACID: 通常采用
BASE(Basically Available, Soft state, Eventually consistent) 理论,强调可用性和分区容忍性,牺牲部分一致性。
- 主要类型:
- 键值存储 (Key-Value Store): 最简单的模型。数据以键值对形式存储。
Redis,Memcached是典型代表。 - 文档存储 (Document Store): 数据存储为类似
JSON或XML的文档格式。MongoDB,CouchDB是代表。 - 列族存储 (Column-Family / Wide-Column Store): 数据按列族组织,适合存储稀疏数据。
Cassandra,HBase是代表。 - 图数据库 (Graph Database): 数据以节点和关系的形式存储,擅长处理高度互联的数据。
Neo4j是代表。
- 键值存储 (Key-Value Store): 最简单的模型。数据以键值对形式存储。
- 代表产品:
Redis,MongoDB,Cassandra,Elasticsearch,Neo4j。 - 优点:
- 高扩展性: 易于水平扩展。
- 高性能: 针对特定读写模式优化。
- 灵活的数据模型: 适应快速变化的数据结构。
- 高可用性: 分布式架构设计增强容错能力。
- 缺点:
- 查询能力有限: 相比 SQL,复杂查询能力较弱(特别是跨不同类型数据的关联查询)。
- 事务支持较弱: 通常不支持复杂的跨记录事务(部分产品在加强)。
- 数据一致性模型多样: 需要开发者理解最终一致性等概念。
1.3 两者对比与适用场景
| 特性 | 关系型数据库 (RDBMS) | 非关系型数据库 (NoSQL) |
|---|---|---|
| 数据模型 | 结构化,表格模型 | 灵活多样 (键值、文档、列族、图) |
| 模式 (Schema) | 严格,需预先定义 | 灵活或无模式 (Schema-less) |
| 查询语言 | SQL | 各产品自有 API 或类 SQL |
| 扩展性 | 垂直扩展为主,水平扩展复杂 | 水平扩展 容易 |
| 事务支持 | 强 (ACID) | 通常较弱 (BASE, 最终一致性) |
| 典型代表 | MySQL, Oracle, SQL Server, PostgreSQL | Redis, MongoDB, Cassandra, Neo4j |
| 优势场景 | 复杂查询、事务处理、强一致性要求 | 高并发读写、大数据量、灵活模式、高扩展 |
| 劣势场景 | 超大规模数据、高并发写入、灵活模式 | 复杂多表关联查询、强事务保证 |
选择建议:
- 需要复杂查询、强事务保证 (如银行系统、订单系统) -> 关系型数据库。
- 需要极高并发读写、灵活数据结构、水平扩展 (如缓存、会话存储、实时排行榜、日志处理、社交图谱) -> 非关系型数据库。
- 混合使用: 现代架构中,常常结合两者优势,例如用
Redis做缓存加速MySQL查询。
Redis 作为 NoSQL 家族中的佼佼者,尤其擅长高性能键值存储,并提供了丰富的数据结构支持。
2. Redis 简介
2.1 什么是 Redis?
Redis (Remote Dictionary Server) 是一个开源的、基于内存的、可持久化的 键值存储数据库 。它也被称为 数据结构服务器,因为它不仅支持简单的字符串键值对,还提供了列表、集合、有序集合、哈希表、位图、地理位置等更复杂的数据结构。
2.2 Redis 的核心特性
- 基于内存存储: 主要数据存储在内存中,提供极快的读写速度(通常达到微秒级别)。
- 持久化: 虽然基于内存,但提供了
RDB(快照) 和AOF(追加日志) 两种机制将数据异步保存到磁盘,防止服务重启或宕机导致数据丢失。 - 丰富的数据结构: 支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理空间索引、流等。
- 高性能: 单线程模型避免了多线程竞争问题,配合非阻塞 I/O 和高效的数据结构,性能卓越。
- 高可用与分布式: 支持主从复制 (
Replication)、哨兵模式 (Sentinel)、集群模式 (Cluster),提供故障转移和水平扩展能力。 - 原子操作: 单个命令的操作是原子的。通过
MULTI/EXEC(事务)、WATCH(乐观锁) 支持更复杂的原子操作序列。 - 发布/订阅 (Pub/Sub): 支持消息的发布与订阅模式。
- Lua 脚本: 支持使用 Lua 脚本执行复杂的、原子性的服务器端操作。
2.3 Redis 的主要数据结构
- 字符串 (Strings): 最基本类型。可以包含文本、数字(整数、浮点数)或二进制数据(如图片片段)。最大容量 512MB。
- 哈希表 (Hashes): 键值对集合,适合存储对象(如用户信息:
field是name,age,email;value是对应的值)。 - 列表 (Lists): 按插入顺序排序的字符串元素集合。支持在头部 (
LPUSH) 或尾部 (RPUSH) 插入/弹出元素。可实现栈、队列、阻塞队列。 - 集合 (Sets): 无序、唯一的字符串元素集合。支持交集、并集、差集等集合运算。常用于标签、好友关系。
- 有序集合 (Sorted Sets / ZSets): 每个元素关联一个分数 (
score),集合按分数排序。元素唯一,分数可重复。适用于排行榜、带权重的集合。 - 位图 (Bitmaps): 通过字符串值的位操作实现。节省空间,适用于布尔型统计(如用户签到)。
- HyperLogLog (HLL): 用于高效估算集合基数(唯一元素数量)的概率数据结构。占用空间极小。
- 地理空间索引 (Geospatial): 存储地理位置(经纬度),支持距离计算、范围查询等。
- 流 (Streams):
Redis 5.0引入,用于实现消息队列,支持多消费者组、消息持久化、回溯等。
2.4 Redis 的典型应用场景
- 缓存: 最常用场景。缓存数据库查询结果、网页内容、会话信息等,大幅减少数据库压力,提升响应速度。
- 会话存储 (Session Store): 存储用户会话信息,支持分布式环境下的会话共享。
- 排行榜/计数器: 利用有序集合轻松实现实时排行榜。利用
INCR命令实现计数器(如文章点赞数、视频播放量)。 - 消息队列: 利用列表的阻塞操作 (
BLPOP/BRPOP) 或流 (Streams) 实现简单的消息队列。 - 发布/订阅系统: 实现实时消息推送、通知系统。
- 实时数据分析: 处理高速写入的数据流(如日志、传感器数据),进行实时统计(如使用
HyperLogLog统计 UV)。 - 地理位置应用: 存储和查询附近的地点、用户。
- 分布式锁: 利用
SET命令的NX(不存在才设置) 和PX(设置过期时间) 选项实现简单的分布式锁。
3. 在 OpenEuler 系统上部署 Redis
OpenEuler 是一个开源、免费的 Linux 发行版,由开放原子开源基金会 OpenAtom 开源。下面介绍如何在 OpenEuler 系统上安装和配置 Redis。
3.1 准备工作
-
系统要求:
- 运行
OpenEuler操作系统的服务器或虚拟机。 - 具有
root或具有sudo权限的用户。 - 稳定的网络连接。
- 运行
-
更新系统: (建议)
bashsudo dnf update -y确保系统软件包是最新的。
3.2 安装 Redis
OpenEuler 的软件仓库 (dnf / yum) 通常包含 Redis 包。这是最简单的方式。
-
搜索可用 Redis 包:
bashsudo dnf search redis通常会看到类似
redis或redis-server的包名。 -
安装 Redis:
bashsudo dnf install redis -y此命令会安装
Redis服务器 (redis-server) 和命令行客户端 (redis-cli)。
3.3 配置 Redis
安装完成后,主要的配置文件是 /etc/redis.conf。
-
备份原始配置: (建议)
bashsudo cp /etc/redis.conf /etc/redis.conf.bak -
编辑配置文件:
bashsudo vi /etc/redis.conf或使用其他文本编辑器。
-
关键配置项: (根据需求调整)
-
bind: 指定Redis监听的网络接口。默认127.0.0.1只监听本地。如果其他机器需要访问,改为服务器 IP 或0.0.0.0(监听所有接口,注意安全风险 )。bind 127.0.0.1 192.168.1.100 # 监听本地和指定 IP # 或者 bind 0.0.0.0 # 监听所有网络接口 (谨慎使用!) -
protected-mode: 保护模式。如果bind未明确指定或没有设置密码 (requirepass),保护模式会限制外部访问。根据bind和密码设置调整。protected-mode yes # 如果 bind 不是 127.0.0.1 且没密码,外部无法连接。设为 no 可关闭。 -
port:Redis服务端口,默认6379。port 6379 -
daemonize: 是否以守护进程 (后台) 方式运行。通常设为yes。daemonize yes -
requirepass: 设置客户端连接密码。强烈建议设置强密码!取消注释并设置。requirepass your_strong_password_here -
maxmemory: 设置Redis可使用的最大内存。根据服务器内存和应用需求设置,避免Redis耗尽系统内存。例如设为2GB:maxmemory 2gb -
maxmemory-policy: 当内存达到maxmemory时的淘汰策略。常见策略有volatile-lru(在设置了过期时间的键中使用 LRU 淘汰)、allkeys-lru(在所有键中使用 LRU 淘汰)、volatile-ttl(淘汰剩余生存时间 TTL 最小的键)、noeviction(不淘汰,新写入操作报错)。根据业务选择。maxmemory-policy allkeys-lru -
dir: 持久化文件 (RDB,AOF) 存放目录。默认/var/lib/redis。确保该目录存在且有写权限。dir /var/lib/redis -
dbfilename:RDB持久化文件名。默认dump.rdb。dbfilename dump.rdb -
appendonly: 是否开启AOF持久化。yes开启,no关闭 (默认)。appendonly yes -
appendfilename:AOF文件名。默认appendonly.aof。appendfilename appendonly.aof -
appendfsync:AOF文件同步策略。always(每写都同步,最安全慢)、everysec(每秒同步,折中)、no(由操作系统决定,最快但风险最大)。通常everysec。appendfsync everysec
保存并退出配置文件。
-
3.4 启动与停止 Redis 服务
OpenEuler 通常使用 systemd 管理服务。
-
启动 Redis 服务:
bashsudo systemctl start redis -
设置开机自启:
bashsudo systemctl enable redis -
检查服务状态:
bashsudo systemctl status redis如果看到
active (running)字样,表示服务已成功启动。 -
停止 Redis 服务:
bashsudo systemctl stop redis -
重启 Redis 服务: (修改配置后通常需要重启)
bashsudo systemctl restart redis
3.5 验证安装
-
使用
redis-cli连接本地服务:bashredis-cli如果设置了密码 (
requirepass),连接后需要认证:bash127.0.0.1:6379> AUTH your_strong_password_here OK -
测试基本命令:
bash127.0.0.1:6379> PING PONG 127.0.0.1:6379> SET testkey "Hello Redis" OK 127.0.0.1:6379> GET testkey "Hello Redis" 127.0.0.1:6379> DEL testkey (integer) 1
4. Redis 命令工具
Redis 安装后提供了一些命令行工具,用于管理、操作和诊断。
4.1 redis-cli:命令行客户端
-
功能: 与
Redis服务器交互的主要工具。用于执行命令、查看结果、管理数据库。 -
基本用法:
-
连接本地默认端口 (
6379):bashredis-cli -
连接指定主机和端口:
bashredis-cli -h hostname -p port -
连接带密码的服务 (在命令行指定密码,注意安全,密码可能被历史记录 ):
bashredis-cli -a your_password更安全的方式是先连接,然后在
cli内使用AUTH命令。 -
执行单条命令并退出:
bashredis-cli PING redis-cli -h host -p port -a password GET keyname
-
-
常用选项:
| 选项 | 描述 |
|---|---|
-h |
主机名 |
-p |
端口 |
-a |
密码 |
-n |
选择数据库编号(默认 0) |
-x |
从 STDIN 读取命令的最后一个参数(例如 `echo "value" |
--stat |
输出服务器统计信息 |
--scan |
扫描匹配模式的键(替代 KEYS 命令,不会阻塞) |
--bigkeys |
扫描寻找占用内存大的键 |
--latency |
测试服务器延迟 |
--latency-history |
测试服务器延迟(历史模式) |
--latency-dist |
测试服务器延迟(分布模式) |
--rdb |
导出 RDB 文件 |
4.2 redis-server:服务器程序
-
功能:
Redis服务器的可执行文件。通常由systemd或其他服务管理器启动。 -
基本用法: (通常不直接手动运行)
bashredis-server /path/to/redis.conf # 指定配置文件启动 redis-server --port 6380 # 指定端口启动 (使用默认配置) redis-server --help # 查看帮助
4.3 redis-benchmark:性能测试工具
-
功能: 用于对
Redis服务器进行性能基准测试。模拟多个客户端并发执行命令。 -
基本用法:
bashredis-benchmark -q # 快速测试常用命令 (PING, SET, GET, INCR, LPUSH, RPUSH, LPOP, RPOP, SADD, SPOP, LRANGE, MSET) redis-benchmark -h host -p port -a password -c 100 -n 100000 # -c 并发连接数, -n 总请求数 redis-benchmark -t set,get -r 1000000 # 测试 SET 和 GET 命令, -r 生成随机键的范围
4.4 redis-check-aof / redis-check-rdb:数据文件检查工具
-
功能:
redis-check-aof: 检查AOF(Append Only File) 文件的有效性,并可修复损坏的文件 (去除最后一条可能不完整的命令)。redis-check-rdb: 检查RDB文件的有效性 (Redis 5版本以上集成到redis-server中,redis-server --check-rdb或redis-check-rdb可用)。
-
基本用法:
bashredis-check-aof --fix /path/to/appendonly.aof # 检查并尝试修复 AOF 文件 redis-check-rdb /path/to/dump.rdb # 检查 RDB 文件
5. Redis 数据库常用命令详解
Redis提供了丰富的命令集。本节重点讲解数据库级别的常用命令,特别是键操作和基础字符串操作。
5.1 键 (Key) 操作命令
键是访问 Redis 中数据的基础。每个键都与一个特定的数据结构相关联。键操作命令用于管理这些键本身。
-
EXISTS-
功能: 检查指定的一个或多个键是否存在。
-
语法:
EXISTS key [key ...] -
参数: 一个或多个键名。
-
返回值: 整数。返回存在的键的数量。
-
时间复杂度: O(1) 对于每个键。
-
示例:
bash127.0.0.1:6379> SET user:1001:name "Alice" OK 127.0.0.1:6379> EXISTS user:1001:name (integer) 1 # 存在 127.0.0.1:6379> EXISTS user:1001:email (integer) 0 # 不存在 127.0.0.1:6379> EXISTS user:1001:name user:1001:email (integer) 1 # 只有第一个存在
-
-
DEL-
功能: 删除指定的一个或多个键及其关联的值。如果键不存在,则忽略。
-
语法:
DEL key [key ...] -
参数: 一个或多个键名。
-
返回值: 整数。返回被成功删除的键的数量 (不包括不存在的键)。
-
时间复杂度: O(1) 对于每个键。删除包含大量元素的集合、列表等的键时,时间复杂度取决于元素数量(例如,删除包含 n 个元素的列表是 O(n))。
-
注意: 删除大键(如包含数百万元素的列表、集合)可能会造成服务器阻塞。
-
示例:
bash127.0.0.1:6379> SET key1 "value1" OK 127.0.0.1:6379> SET key2 "value2" OK 127.0.0.1:6379> DEL key1 key2 key3 # key3 不存在 (integer) 2 # 删除了 key1 和 key2
-
-
TYPE-
功能: 返回指定键所存储值的数据结构类型。
-
语法:
TYPE key -
参数: 键名。
-
返回值: 字符串。可能的返回值有:
string(字符串)list(列表)set(集合)zset(有序集合)hash(哈希表)stream(流)none(键不存在)
-
时间复杂度: O(1)。
-
示例:
bash127.0.0.1:6379> SET mystr "hello" OK 127.0.0.1:6379> LPUSH mylist "a" "b" (integer) 2 127.0.0.1:6379> TYPE mystr string 127.0.0.1:6379> TYPE mylist list 127.0.0.1:6379> TYPE notexists none
-
-
EXPIRE/PEXPIRE-
功能: 为指定键设置生存时间 (TTL - Time To Live)。键在生存时间结束后会被自动删除。
EXPIRE: 以秒为单位设置 TTL。PEXPIRE: 以毫秒为单位设置 TTL。
-
语法:
EXPIRE key secondsPEXPIRE key milliseconds
-
参数:
key: 键名。seconds/milliseconds: 生存时间。
-
返回值: 整数。
1: 如果成功设置了过期时间。0: 如果键不存在或设置失败。
-
时间复杂度: O(1)。
-
关联命令:
EXPIREAT key unix-time-seconds: 设置键在指定的 Unix 时间戳 (秒) 过期。PEXPIREAT key unix-time-milliseconds: 设置键在指定的 Unix 时间戳 (毫秒) 过期。
-
示例:
bash127.0.0.1:6379> SET session:user123 "data" OK 127.0.0.1:6379> EXPIRE session:user123 1800 # 30 分钟后过期 (integer) 1 127.0.0.1:6379> PEXPIRE tempkey 5000 # 5 秒后过期 (5000 毫秒) (integer) 1
-
-
TTL/PTTL-
功能: 获取指定键的剩余生存时间 (TTL)。
TTL: 返回以秒为单位的剩余时间。PTTL: 返回以毫秒为单位的剩余时间。
-
语法:
TTL keyPTTL key
-
参数:
key: 键名。 -
返回值: 整数。
- 大于
0: 剩余的生存时间 (秒或毫秒)。 -1: 键存在但没有关联的过期时间 (永不过期)。-2: 键不存在。
- 大于
-
时间复杂度: O(1)。
-
示例:
bash127.0.0.1:6379> SET keywithttl "value" EX 100 # SET 时直接设置过期时间 100 秒 OK 127.0.0.1:6379> TTL keywithttl (integer) 97 # 大约剩余 97 秒 127.0.0.1:6379> PTTL keywithttl (integer) 96500 # 大约 96500 毫秒 127.0.0.1:6379> SET nottl "value" OK 127.0.0.1:6379> TTL nottl (integer) -1 127.0.0.1:6379> TTL notexists (integer) -2
-
-
RENAME/RENAMENX-
功能: 修改键的名称。
RENAME: 将键重命名为新名称。如果新名称已存在,它的值会被覆盖。RENAMENX: 仅当新名称不存在时,才将键重命名为新名称。
-
语法:
RENAME old_key new_keyRENAMENX old_key new_key
-
参数:
old_key: 原键名。new_key: 新键名。
-
返回值:
RENAME: 成功时返回OK。RENAMENX: 整数。1表示重命名成功 (新键名不存在),0表示失败 (新键名已存在)。
-
时间复杂度: O(1)。
-
注意: 如果
old_key不存在,两个命令都会返回错误。 -
示例:
bash127.0.0.1:6379> SET oldname "value" OK 127.0.0.1:6379> RENAME oldname newname OK 127.0.0.1:6379> GET newname "value" 127.0.0.1:6379> SET existskey "another" OK 127.0.0.1:6379> RENAMENX newname existskey (integer) 0 # 失败,因为 existskey 已存在 127.0.0.1:6379> RENAMENX newname brandnewkey (integer) 1 # 成功
-
-
DBSIZE-
功能: 返回当前数据库中键的总数量。
-
语法:
DBSIZE -
参数: 无。
-
返回值: 整数。当前数据库的键数量。
-
时间复杂度: O(1)。
-
注意: 这个命令计算的是数据库中的键数量,不是内存使用量。
-
示例:
bash127.0.0.1:6379> SET key1 "a" OK 127.0.0.1:6379> SET key2 "b" OK 127.0.0.1:6379> DBSIZE (integer) 2 127.0.0.1:6379> SELECT 1 # 切换到数据库 1 (默认有 16 个数据库,编号 0-15) OK 127.0.0.1:6379[1]> DBSIZE (integer) 0 # 新数据库是空的
-
5.2 安全与管理命令
CONFIG SET requirepass/AUTH-
CONFIG SET requirepass-
功能: 动态设置(或修改)客户端连接
Redis服务器所需的密码。此命令会立即生效。 -
语法:
CONFIG SET requirepass password -
参数:
password: 要设置的密码字符串。设为空字符串""表示清除密码。 -
返回值:
OK表示设置成功。 -
权限: 默认需要管理员权限。如果之前没有密码,执行此命令前不需要认证;如果已有密码,执行前需要用
AUTH认证。 -
注意:
- 使用此命令设置的密码是临时的,不会 保存到
redis.conf配置文件中。重启服务后会失效。要永久生效,必须修改redis.conf中的requirepass项并重启服务。 - 设置强密码非常重要,以防止未授权访问。
- 使用此命令设置的密码是临时的,不会 保存到
-
示例:
bash127.0.0.1:6379> CONFIG SET requirepass mynewpassword OK
-
-
AUTH-
功能: 客户端使用密码进行身份认证。
-
语法:
AUTH password -
参数:
password: 在redis.conf中配置的或通过CONFIG SET requirepass设置的密码。 -
返回值:
OK表示认证成功。错误信息表示失败。 -
使用场景:
- 在
redis-cli连接后,如果服务器要求密码,必须先执行AUTH password才能执行其他命令。 - 在应用程序连接
Redis时,连接库通常提供设置密码的选项,内部会执行AUTH。
- 在
-
示例:
bash$ redis-cli 127.0.0.1:6379> PING (error) NOAUTH Authentication required. # 需要认证 127.0.0.1:6379> AUTH mynewpassword OK 127.0.0.1:6379> PING PONG # 认证成功
-
-
5.3 字符串 (String) 操作命令
字符串是 Redis 最基本的数据类型。这里介绍 APPEND 和 STRLEN,并补充最基础的 SET 和 GET。
-
SET(补充)-
功能: 设置指定键的字符串值。如果键已存在,则覆盖旧值。
-
语法:
SET key value [EX seconds | PX milliseconds] [NX | XX] [KEEPTTL] -
参数:
key: 键名。value: 字符串值。EX seconds: 设置过期时间(秒)。PX milliseconds: 设置过期时间(毫秒)。NX: 仅当键不存在时才设置。XX: 仅当键存在时才设置。KEEPTTL: 保留键原有的生存时间 (如果键之前设置了 TTL)。
-
返回值:
OK表示设置成功。如果使用了NX或XX条件且条件不满足,返回nil。 -
时间复杂度: O(1)。
-
示例:
bash127.0.0.1:6379> SET username "Alice" OK 127.0.0.1:6379> SET username "Bob" XX # 因为 username 存在,成功覆盖 OK 127.0.0.1:6379> SET newkey "value" NX # 因为 newkey 不存在,成功设置 OK 127.0.0.1:6379> SET newkey "another" NX # newkey 已存在,设置失败 (nil) 127.0.0.1:6379> SET tempkey "data" EX 60 # 设置值并 60 秒后过期 OK
-
-
GET(补充)-
功能: 获取指定键的字符串值。如果键不存在或存储的不是字符串,返回
nil。 -
语法:
GET key -
参数:
key: 键名。 -
返回值: 字符串值或
nil。 -
时间复杂度: O(1)。
-
示例:
bash127.0.0.1:6379> SET greeting "Hello, Redis!" OK 127.0.0.1:6379> GET greeting "Hello, Redis!" 127.0.0.1:6379> GET notexists (nil)
-
-
APPEND-
功能: 将指定的字符串值追加到现有键的字符串值的末尾。如果键不存在,则创建一个新键并将其值设置为追加的字符串 (等同于
SET该字符串)。 -
语法:
APPEND key value -
参数:
key: 键名。value: 要追加的字符串。
-
返回值: 整数。追加操作后字符串的总长度。
-
时间复杂度: O(1)。平均情况下,分摊的时间复杂度是 O(1),因为
Redis字符串会预分配空间。 -
示例:
bash127.0.0.1:6379> SET mytext "Hello" OK 127.0.0.1:6379> APPEND mytext ", World!" (integer) 13 # "Hello, World!" 的长度是 13 127.0.0.1:6379> GET mytext "Hello, World!" 127.0.0.1:6379> APPEND newtext "Start" # newtext 不存在 (integer) 5 # 相当于 SET newtext "Start", 长度 5
-
-
STRLEN-
功能: 返回指定键存储的字符串值的长度(以字节为单位)。如果键不存在,返回
0。如果键存储的不是字符串,返回错误。 -
语法:
STRLEN key -
参数:
key: 键名。 -
返回值: 整数。字符串的长度(字节数)。键不存在时返回
0。 -
时间复杂度: O(1)。
-
注意:
Redis字符串是二进制安全的,可以存储任何二进制数据(如JPEG图片片段),STRLEN返回的就是二进制数据的字节长度。 -
示例:
bash127.0.0.1:6379> SET message "Redis is great!" OK 127.0.0.1:6379> STRLEN message (integer) 15 # 包含空格和感叹号 127.0.0.1:6379> SET binary "\x00\x01\x02\xff" # 存储二进制数据 OK 127.0.0.1:6379> STRLEN binary (integer) 4 # 4 个字节 127.0.0.1:6379> STRLEN notexists (integer) 0
-
其他常用字符串命令 (简要提及):
INCR key: 将键存储的数字值增加1。如果键不存在,先初始化为0再执行INCR。如果值不是数字,返回错误。DECR key: 将键存储的数字值减少1。INCRBY key increment: 将键存储的数字值增加指定的整数increment。DECRBY key decrement: 将键存储的数字值减少指定的整数decrement。INCRBYFLOAT key increment: 将键存储的数字值 (浮点数) 增加指定的浮点数increment。GETSET key value: 设置键的新字符串值,并返回旧值。原子操作。MGET key [key ...]: 获取所有给定键的值。MSET key value [key value ...]: 同时设置多个键值对。原子操作。SETRANGE key offset value: 从指定偏移量offset开始,覆写键字符串值的一部分。GETRANGE key start end: 获取键字符串值的子字符串,范围由start和end偏移量指定。
6. 总结
本章系统性地介绍了数据库基础,重点对比了关系型数据库 (RDBMS) 和非关系型数据库 (NoSQL) 的特点、适用场景及其代表产品。深入探讨了 Redis 作为高性能键值存储和数据结构服务器的核心特性、支持的数据结构及其广泛的典型应用场景。
详细讲解了在国产 OpenEuler 操作系统上部署 Redis 服务的完整步骤,包括安装、配置(重点关注网络绑定、密码、持久化、内存限制等关键项)、服务启动与管理,以及安装验证方法。
介绍了 Redis 提供的常用命令行工具 (redis-cli, redis-server, redis-benchmark, redis-check-aof/rdb) 的功能和基本用法。
重点剖析了 Redis 数据库级别的常用命令,特别是针对键 (EXISTS, DEL, TYPE, EXPIRE/PEXPIRE, TTL/PTTL, RENAME/RENAMENX, DBSIZE) 和基础字符串 (APPEND, STRLEN,并补充了 SET, GET) 的操作。对每个命令的功能、语法、参数、返回值、时间复杂度、注意事项和示例进行了详细说明。特别强调了安全相关的密码设置 (CONFIG SET requirepass) 和认证 (AUTH) 命令。
通过本章的学习,读者应能理解 Redis 的基本概念和优势,具备在 OpenEuler 上部署和管理 Redis 服务的能力,并掌握使用 redis-cli 执行基础数据操作命令的技能,为后续深入学习 Redis 更高级特性和数据结构打下坚实基础。
7. 附录:常用命令速查表
| 命令类别 | 命令 | 功能简述 | 示例 |
|---|---|---|---|
| 键操作 | EXISTS key |
检查键是否存在 | EXISTS user:1001 |
DEL key |
删除键 | DEL session:abc |
|
TYPE key |
返回键值的数据类型 | TYPE mylist |
|
EXPIRE key sec |
设置键过期时间(秒) | EXPIRE temp 60 |
|
TTL key |
获取键剩余生存时间(秒) | TTL temp |
|
RENAME key new |
重命名键 | RENAME oldname newname |
|
RENAMENX key n |
仅当新名不存在时重命名 | RENAMENX old new |
|
DBSIZE |
返回当前数据库键总数 | DBSIZE |
|
| 安全 | CONFIG SET reqp |
(动态)设置连接密码 | CONFIG SET requirepass pwd123 |
AUTH password |
客户端密码认证 | AUTH pwd123 |
|
| 字符串 | SET key value |
设置键的字符串值 | SET username "Alice" |
GET key |
获取键的字符串值 | GET username |
|
APPEND key val |
向键值追加字符串 | APPEND log "error occurred" |
|
STRLEN key |
返回键值的字符串长度 | STRLEN log |
|
| 连接/管理 | PING |
测试服务器是否可达 | PING |
SELECT index |
切换到指定数据库 (0-15) | SELECT 1 |
|
FLUSHDB |
清空当前数据库 | FLUSHDB (慎用!) |
|
FLUSHALL |
清空所有数据库 | FLUSHALL (慎用!) |
|
INFO [section] |
获取服务器信息和统计 | INFO, INFO memory |