NoSQL数据库Redis(一):数据库基础

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): 事务提交后,对数据的修改是永久性的。
  • 代表产品: 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): 数据存储为类似 JSONXML 的文档格式。MongoDB, CouchDB 是代表。
    • 列族存储 (Column-Family / Wide-Column Store): 数据按列族组织,适合存储稀疏数据。Cassandra, HBase 是代表。
    • 图数据库 (Graph Database): 数据以节点和关系的形式存储,擅长处理高度互联的数据。Neo4j 是代表。
  • 代表产品: 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 的核心特性
  1. 基于内存存储: 主要数据存储在内存中,提供极快的读写速度(通常达到微秒级别)。
  2. 持久化: 虽然基于内存,但提供了 RDB (快照) 和 AOF (追加日志) 两种机制将数据异步保存到磁盘,防止服务重启或宕机导致数据丢失。
  3. 丰富的数据结构: 支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理空间索引、流等。
  4. 高性能: 单线程模型避免了多线程竞争问题,配合非阻塞 I/O 和高效的数据结构,性能卓越。
  5. 高可用与分布式: 支持主从复制 (Replication)、哨兵模式 (Sentinel)、集群模式 (Cluster),提供故障转移和水平扩展能力。
  6. 原子操作: 单个命令的操作是原子的。通过 MULTI/EXEC (事务)、WATCH (乐观锁) 支持更复杂的原子操作序列。
  7. 发布/订阅 (Pub/Sub): 支持消息的发布与订阅模式。
  8. Lua 脚本: 支持使用 Lua 脚本执行复杂的、原子性的服务器端操作。
2.3 Redis 的主要数据结构
  • 字符串 (Strings): 最基本类型。可以包含文本、数字(整数、浮点数)或二进制数据(如图片片段)。最大容量 512MB。
  • 哈希表 (Hashes): 键值对集合,适合存储对象(如用户信息:fieldname, age, emailvalue 是对应的值)。
  • 列表 (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 准备工作
  1. 系统要求:

    • 运行 OpenEuler 操作系统的服务器或虚拟机。
    • 具有 root 或具有 sudo 权限的用户。
    • 稳定的网络连接。
  2. 更新系统: (建议)

    bash 复制代码
    sudo dnf update -y

    确保系统软件包是最新的。

3.2 安装 Redis

OpenEuler 的软件仓库 (dnf / yum) 通常包含 Redis 包。这是最简单的方式。

  1. 搜索可用 Redis 包:

    bash 复制代码
    sudo dnf search redis

    通常会看到类似 redisredis-server 的包名。

  2. 安装 Redis:

    bash 复制代码
    sudo dnf install redis -y

    此命令会安装 Redis 服务器 (redis-server) 和命令行客户端 (redis-cli)。

3.3 配置 Redis

安装完成后,主要的配置文件是 /etc/redis.conf

  1. 备份原始配置: (建议)

    bash 复制代码
    sudo cp /etc/redis.conf /etc/redis.conf.bak
  2. 编辑配置文件:

    bash 复制代码
    sudo vi /etc/redis.conf

    或使用其他文本编辑器。

  3. 关键配置项: (根据需求调整)

    • 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 管理服务。

  1. 启动 Redis 服务:

    bash 复制代码
    sudo systemctl start redis
  2. 设置开机自启:

    bash 复制代码
    sudo systemctl enable redis
  3. 检查服务状态:

    bash 复制代码
    sudo systemctl status redis

    如果看到 active (running) 字样,表示服务已成功启动。

  4. 停止 Redis 服务:

    bash 复制代码
    sudo systemctl stop redis
  5. 重启 Redis 服务: (修改配置后通常需要重启)

    bash 复制代码
    sudo systemctl restart redis
3.5 验证安装
  1. 使用 redis-cli 连接本地服务:

    bash 复制代码
    redis-cli

    如果设置了密码 (requirepass),连接后需要认证:

    bash 复制代码
    127.0.0.1:6379> AUTH your_strong_password_here
    OK
  2. 测试基本命令:

    bash 复制代码
    127.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):

      bash 复制代码
      redis-cli
    • 连接指定主机和端口:

      bash 复制代码
      redis-cli -h hostname -p port
    • 连接带密码的服务 (在命令行指定密码,注意安全,密码可能被历史记录 ):

      bash 复制代码
      redis-cli -a your_password

      更安全的方式是先连接,然后在 cli 内使用 AUTH 命令。

    • 执行单条命令并退出:

      bash 复制代码
      redis-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 或其他服务管理器启动。

  • 基本用法: (通常不直接手动运行)

    bash 复制代码
    redis-server /path/to/redis.conf # 指定配置文件启动
    redis-server --port 6380 # 指定端口启动 (使用默认配置)
    redis-server --help # 查看帮助
4.3 redis-benchmark:性能测试工具
  • 功能: 用于对 Redis 服务器进行性能基准测试。模拟多个客户端并发执行命令。

  • 基本用法:

    bash 复制代码
    redis-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-rdbredis-check-rdb 可用)。
  • 基本用法:

    bash 复制代码
    redis-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) 对于每个键。

    • 示例:

      bash 复制代码
      127.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))。

    • 注意: 删除大键(如包含数百万元素的列表、集合)可能会造成服务器阻塞。

    • 示例:

      bash 复制代码
      127.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)

    • 示例:

      bash 复制代码
      127.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 seconds
      • PEXPIRE key milliseconds
    • 参数:

      • key: 键名。
      • seconds / milliseconds: 生存时间。
    • 返回值: 整数。

      • 1: 如果成功设置了过期时间。
      • 0: 如果键不存在或设置失败。
    • 时间复杂度: O(1)

    • 关联命令:

      • EXPIREAT key unix-time-seconds: 设置键在指定的 Unix 时间戳 (秒) 过期。
      • PEXPIREAT key unix-time-milliseconds: 设置键在指定的 Unix 时间戳 (毫秒) 过期。
    • 示例:

      bash 复制代码
      127.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 key
      • PTTL key
    • 参数: key: 键名。

    • 返回值: 整数。

      • 大于 0: 剩余的生存时间 (秒或毫秒)。
      • -1: 键存在但没有关联的过期时间 (永不过期)。
      • -2: 键不存在。
    • 时间复杂度: O(1)

    • 示例:

      bash 复制代码
      127.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_key
      • RENAMENX old_key new_key
    • 参数:

      • old_key: 原键名。
      • new_key: 新键名。
    • 返回值:

      • RENAME: 成功时返回 OK
      • RENAMENX: 整数。1 表示重命名成功 (新键名不存在),0 表示失败 (新键名已存在)。
    • 时间复杂度: O(1)

    • 注意: 如果 old_key 不存在,两个命令都会返回错误。

    • 示例:

      bash 复制代码
      127.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)

    • 注意: 这个命令计算的是数据库中的键数量,不是内存使用量。

    • 示例:

      bash 复制代码
      127.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 项并重启服务。
        • 设置强密码非常重要,以防止未授权访问。
      • 示例:

        bash 复制代码
        127.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 最基本的数据类型。这里介绍 APPENDSTRLEN,并补充最基础的 SETGET

  • SET (补充)

    • 功能: 设置指定键的字符串值。如果键已存在,则覆盖旧值。

    • 语法: SET key value [EX seconds | PX milliseconds] [NX | XX] [KEEPTTL]

    • 参数:

      • key: 键名。
      • value: 字符串值。
      • EX seconds: 设置过期时间(秒)。
      • PX milliseconds: 设置过期时间(毫秒)。
      • NX: 仅当键不存在时才设置。
      • XX: 仅当键存在时才设置。
      • KEEPTTL: 保留键原有的生存时间 (如果键之前设置了 TTL)。
    • 返回值: OK 表示设置成功。如果使用了 NXXX 条件且条件不满足,返回 nil

    • 时间复杂度: O(1)

    • 示例:

      bash 复制代码
      127.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)

    • 示例:

      bash 复制代码
      127.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 字符串会预分配空间。

    • 示例:

      bash 复制代码
      127.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 返回的就是二进制数据的字节长度。

    • 示例:

      bash 复制代码
      127.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: 获取键字符串值的子字符串,范围由 startend 偏移量指定。

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
相关推荐
weixin_580614002 小时前
如何防止SQL注入利用存储过程_确保存储过程不拼字符串.txt
jvm·数据库·python
james的分享2 小时前
向量数据库之Milvus
数据库·milvus
weixin_408717772 小时前
mysql权限表查询性能如何优化_MySQL系统权限缓存原理
jvm·数据库·python
吕源林2 小时前
怎么优化MongoDB的软删除设计_布尔标记与删除时间戳
jvm·数据库·python
吕源林2 小时前
如何解决SQL存储过程连接泄露_确保在异常后关闭连接
jvm·数据库·python
一只游鱼2 小时前
langchain4j+redis+持久化存储记忆
java·redis·langchain4j
Gofarlic_OMS3 小时前
应对MathWorks合规审查的专项准备工作
大数据·服务器·网络·数据库·人工智能
七夜zippoe3 小时前
DolphinDB SQL查询:从基础到进阶
数据库·sql·进阶·聚合·dolphindb
有想法的py工程师3 小时前
PostgreSQL 深入heap_update() 与 HOT 机制(附源码级解析)
数据库·postgresql