学习 Redis:一份写给新手的详细教程 – wiki词典

I apologize for the repeated failures. It appears I do not have the tool required to write a file to your system.

However, I have generated the content for the article you requested. Here is the full text of “学习 Redis:一份写给新手的详细教程” in Markdown format. You can copy and paste this content into a new file and save it as redis_tutorial.md.

学习 Redis:一份写给新手的详细教程

Redis 是一款开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它通常被称为“数据结构服务器”,因为其支持的键值数据类型非常丰富。Redis 由 C 语言编写,以其卓越的速度和性能而闻名,这主要归功于它将所有数据都存储在内存中。

Redis 的主要特性

  • 速度快:通过将数据存放在内存中,Redis 实现了低延迟的读写操作,使其比基于磁盘的数据库快得多。
  • 丰富的数据结构:Redis 支持多种数据结构,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets),可以实现灵活的数据建模。
  • 持久化:虽然主要在内存中运行,Redis 提供了将数据持久化到磁盘的机制,确保在重启或故障后数据能够恢复。
  • 复制:支持主从异步复制,可实现高可用性和读写分离。
  • 发布/订阅:内置了发布/订阅消息模式,可用于实时通信。
  • 事务:Redis 允许将一组命令作为一个原子步骤来执行。
  • Lua 脚本:支持内置的 Lua 脚本,用于在服务器端原子性地执行复杂操作。

常见用例

由于其高性能和灵活性,Redis 在各种应用中得到了广泛使用:

  • 缓存:最常见的用途是缓存频繁访问的数据,以减轻主数据库的压力并提高应用响应时间。
  • 实时分析:Redis 能够以亚毫秒级的延迟处理数据,是实时分析、排行榜和游戏应用的理想选择。
  • 会话管理:在分布式系统中,将用户会话数据存储在 Redis 中可以实现多台服务器之间的快速访问。
  • 消息队列:发布/订阅功能使 Redis 成为轻量级消息和任务队列的合适选择。

安装

要开始使用 Redis,你需要在你的系统上安装 Redis 服务器。推荐的安装方式是 从源码编译 或使用操作系统的包管理器。

Linux (以 Ubuntu/Debian 为例)

  1. 更新软件包列表:
    bash
    sudo apt update
  2. 安装 Redis 服务器:
    bash
    sudo apt install redis-server

    安装后 Redis 应该会自动启动。
  3. 设置 Redis 开机自启:
    bash
    sudo systemctl enable redis-server

macOS

在 macOS 上安装 Redis 最简单的方法是使用 Homebrew:

  1. 安装 Homebrew (如果尚未安装):
    bash
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. 安装 Redis:
    bash
    brew install redis
  3. 启动 Redis 服务:
    bash
    brew services start redis

Windows

对于 Windows 用户,推荐的方法是使用 适用于 Linux 的 Windows 子系统 (WSL),然后在 WSL 环境中按照 Linux 的安装步骤进行操作。

测试安装

安装后,你可以使用 Redis 命令行界面 (redis-cli) 来验证 Redis 是否正在运行并可访问:

  1. 打开终端并启动 redis-eli:
    bash
    redis-cli
  2. 使用 PING 命令测试连接:
    127.0.0.1:6379> PING
    PONG

    如果你收到了 PONG,说明 Redis 工作正常。

基本数据结构和命令

Redis 将数据存储为键值对,其中键总是字符串,而值可以是多种数据类型之一。

1. 字符串 (Strings)

字符串是 Redis 最基本的数据类型,可以包含任何类型的数据(文本、整数、浮点数、二进制数据)。

  • SET key value: 设置 key 的字符串值为 value
    SET mykey "Hello Redis"
    OK
  • GET key: 获取 key 的字符串值。
    GET mykey
    "Hello Redis"
  • DEL key: 删除 key
    DEL mykey
    (integer) 1
  • INCR key: 将 key 的整数值加一。
    SET counter 10
    OK
    INCR counter
    (integer) 11
  • DECR key: 将 key 的整数值减一。
    DECR counter
    (integer) 10

2. 哈希 (Hashes)

哈希是字段-值对的集合,类似于 Python 中的字典或 JSON 对象。

  • HSET key field value [field value ...]: 在 key 对应的哈希中设置一个或多个 field 的值为 value
    HSET user:1000 name "Alice" email "[email protected]"
    (integer) 2
  • HGET key field: 获取 key 对应的哈希中 field 的值。
    HGET user:1000 name
    "Alice"
  • HMGET key field [field ...]: 获取 key 对应的哈希中一个或多个 field 的值。
    HMGET user:1000 name email
    1) "Alice"
    2) "[email protected]"
  • HINCRBY key field increment: 将 key 对应的哈希中 field 的整数值增加 increment
    HSET product:101 views 0
    (integer) 1
    HINCRBY product:101 views 1
    (integer) 1

3. 列表 (Lists)

列表是字符串的有序集合,按插入顺序排序。你可以在列表的头部和尾部推入和弹出元素。

  • LPUSH key value [value ...]: 将一个或多个 value 插入到 key 对应列表的头部(左侧)。
    LPUSH mylist "world"
    (integer) 1
    LPUSH mylist "hello"
    (integer) 2
  • RPUSH key value [value ...]: 将一个或多个 value 插入到 key 对应列表的尾部(右侧)。
    RPUSH anotherlist "item1" "item2"
    (integer) 2
  • LPOP key: 移除并返回 key 对应列表的第一个元素。
    LPOP mylist
    "hello"
  • RPOP key: 移除并返回 key 对应列表的最后一个元素。
    RPOP anotherlist
    "item2"
  • LLEN key: 返回 key 对应列表的长度。
    LLEN mylist
    (integer) 1

4. 集合 (Sets)

集合是唯一字符串的无序集合。它们对于标签或跟踪唯一项等任务很有用。

  • SADD key member [member ...]: 将一个或多个 member 添加到 key 对应的集合中。
    SADD myset "apple" "banana" "cherry"
    (integer) 3
  • SREM key member [member ...]: 从 key 对应的集合中移除一个或多个 member
    SREM myset "banana"
    (integer) 1
  • SMEMBERS key: 返回 key 对应集合中的所有成员。
    SMEMBERS myset
    1) "cherry"
    2) "apple"
  • SISMEMBER key member: 判断 member 是否是 key 对应集合的成员,是则返回 1,否则返回 0
    SISMEMBER myset "apple"
    (integer) 1
    SISMEMBER myset "grape"
    (integer) 0

5. 有序集合 (Sorted Sets / ZSets)

有序集合是唯一成员的集合,类似于集合,但每个成员都与一个浮点数分数相关联。元素始终按其分数排序。

  • ZADD key score member [score member ...]: 将一个或多个 member 及其 score 添加到 key 对应的有序集合中。
    ZADD leaderboard 100 "player1" 150 "player2" 75 "player3"
    (integer) 3
  • ZRANGE key start stop [WITHSCORES]: 返回 key 对应的有序集合中指定 range(0-based)内的元素。WITHSCORES 会同时返回分数。
    ZRANGE leaderboard 0 -1 WITHSCORES
    1) "player3"
    2) "75"
    3) "player1"
    4) "100"
    5) "player2"
    6) "150"
  • ZRANK key member: 返回 memberkey 对应有序集合中的排名,分数从低到高排序。
    ZRANK leaderboard "player1"
    (integer) 1

持久化

Redis 是一个内存数据存储,这意味着数据主要存储在 RAM 中。如果 Redis 服务器在未启用持久化的情况下重启,所有数据都将丢失。为了防止这种情况,Redis 提供了两种主要的持久化机制:RDB 和 AOF。

1. RDB (Redis Database) 快照

RDB 持久化在指定的时间间隔内创建数据集的时间点快照。

  • 工作原理:Redis fork 一个子进程,将整个数据集写入磁盘上的一个二进制文件(默认为 dump.rdb)。父进程继续为请求提供服务。
  • 优点:
    • 非常紧凑的单文件数据表示,非常适合备份和灾难恢复。
    • 最大化 Redis 性能,因为父进程避免了磁盘 I/O。
    • 与 AOF 相比,大数据集的重启速度更快。
  • 缺点:
    • 如果 Redis 在两次快照之间崩溃,可能会丢失数据。

2. AOF (Append-Only File)

AOF 持久化将服务器收到的每个写操作记录到一个仅追加的日志文件(默认为 appendonly.aof)。

  • 工作原理:Redis 记录每个修改数据集的命令。重启时,Redis 会重放此日志以重建数据集。
  • 优点:
    • 更高的持久性,数据丢失最小化(可以配置为每秒甚至每个命令同步一次)。
    • AOF 文件是人类可读的,更容易理解。
  • 缺点:
    • AOF 文件可能比 RDB 文件大。
    • 重启可能较慢,因为 Redis 需要重放所有命令。

混合持久化

可以在同一个 Redis 实例中结合使用 AOF 和 RDB。在这种情况下,当 Redis 重启时,将使用 AOF 文件来重建数据集,因为 AOF 文件能保证是最新最全的。


使用 Python 操作 Redis

你可以使用各种编程语言与 Redis 进行交互。以下是使用 Python 和 redis-py 库的示例。

1. 安装 redis-py

首先,你需要安装 redis-py 库:

bash
pip install redis

2. 连接到 Redis

你可以通过创建一个 Redis 客户端实例来连接到 Redis 服务器。默认情况下,它连接到 localhost:6379

“`python
import redis

连接到 Redis 服务器

host=’localhost’, port=6379, db=0 是默认值

r = redis.Redis(host=’localhost’, port=6379, db=0, decode_responses=True)

decode_responses=True 确保检索到的数据被解码为字符串

“`

3. 使用 redis-py 进行基本操作

以下是使用 redis-py 客户端进行常见 Redis 操作的示例:

“`python
import redis

r = redis.Redis(host=’localhost’, port=6379, db=0, decode_responses=True)

— 字符串 —

print(“— 字符串 —“)
r.set(‘name’, ‘Alice’) # 设置字符串值
print(f”Name: {r.get(‘name’)}”) # 获取字符串值

r.incr(‘page_views’) # 递增计数器
r.incr(‘page_views’)
print(f”Page Views: {r.get(‘page_views’)}”)

r.delete(‘name’) # 删除键
print(f”Name after deletion: {r.get(‘name’)}”)

— 哈希 —

print(“\n— 哈希 —“)
r.hset(‘user:1’, mapping={
‘name’: ‘Bob’,
’email’: ‘[email protected]’,
‘age’: 30
}) # 在哈希中设置多个字段
print(f”User 1 Name: {r.hget(‘user:1’, ‘name’)}”) # 从哈希中获取单个字段
print(f”User 1 Details: {r.hgetall(‘user:1’)}”) # 从哈希中获取所有字段和值

r.hincrby(‘user:1’, ‘age’, 1) # 递增哈希字段
print(f”User 1 Age after increment: {r.hget(‘user:1’, ‘age’)}”)

— 列表 —

print(“\n— 列表 —“)
r.rpush(‘task_queue’, ‘task1’, ‘task2’) # 将元素推送到列表的右侧(尾部)
r.lpush(‘task_queue’, ‘task0’) # 将元素推送到列表的左侧(头部)
print(f”Task Queue: {r.lrange(‘task_queue’, 0, -1)}”) # 获取列表中的所有元素

print(f”Popped from left: {r.lpop(‘task_queue’)}”) # 从左侧弹出
print(f”Task Queue after LPOP: {r.lrange(‘task_queue’, 0, -1)}”)

— 集合 —

print(“\n— 集合 —“)
r.sadd(‘tags:article:1’, ‘python’, ‘redis’, ‘tutorial’) # 向集合中添加成员
r.sadd(‘tags:article:1’, ‘python’) # 添加已存在的成员无效
print(f”Tags for article 1: {r.smembers(‘tags:article:1’)}”) # 获取集合中的所有成员

print(f”Is ‘redis’ a tag? {r.sismember(‘tags:article:1’, ‘redis’)}”) # 检查成员是否存在

— 有序集合 —

print(“\n— 有序集合 —“)
r.zadd(‘game_scores’, {‘playerA’: 100, ‘playerB’: 150, ‘playerC’: 75}) # 添加带分数的成员
print(f”Leaderboard (lowest to highest score): {r.zrange(‘game_scores’, 0, -1, withscores=True)}”)

print(f”Rank of playerB: {r.zrank(‘game_scores’, ‘playerB’)}”) # 获取排名(0-based)
“`


总结和进一步学习

Redis 是现代应用开发中一个强大而多功能的工具,提供高性能和灵活的数据建模能力。其内存特性使其成为缓存、实时数据处理和消息代理的绝佳选择。

要深入学习 Redis,请探索 Redis 官方文档,其中提供了全面的指南、命令参考以及集群和高可用性等高级主题。

滚动至顶部