Redis 中文学习手册

Redis 中文学习手册

  • [1.Redis 简介](#1.Redis 简介)
  • [2. 安装与启动](#2. 安装与启动)
  • [3. 数据类型详解](#3. 数据类型详解)
  • [4. 键(key)操作](#4. 键(key)操作)
  • [5. 字符串(String)](#5. 字符串(String))
  • [6. 哈希(Hash)](#6. 哈希(Hash))
  • [7. 列表(List)](#7. 列表(List))
  • [8. 集合(Set)](#8. 集合(Set))
  • [9. 有序集合(Sorted Set)](#9. 有序集合(Sorted Set))
  • [10. 事务处理](#10. 事务处理)
  • [11. 发布订阅](#11. 发布订阅)
  • [12. 持久化配置](#12. 持久化配置)
  • [13. 主从复制](#13. 主从复制)
  • 主节点配置 (redis.conf)
  • 从节点配置
  • [14. 性能优化](#14. 性能优化)
  • [15. 应用场景](#15. 应用场景)

1.Redis 简介

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,常用作数据库、缓存和消息中间件。

核心特性:

🚀 基于内存:数据存储在内存中,读写速度极快

💾 持久化:支持数据持久化到磁盘

🏗️ 多种数据结构:支持字符串、哈希、列表、集合、有序集合等

🔄 主从复制:支持数据备份和高可用

⚡ 高性能:单线程模型,避免上下文切换

📝 支持事务:保证命令的原子性执行

🔔 发布订阅:支持消息发布订阅模式

2. 安装与启动

Linux 安装

bash 复制代码
# Ubuntu/Debian
sudo apt update
sudo apt install redis-server


# CentOS/RHEL
sudo yum install epel-release
sudo yum install redis

# 启动服务
sudo systemctl start redis
sudo systemctl enable redis

# 检查状态
sudo systemctl status redis

Windows 安装

bash 复制代码
# 使用 Chocolatey
choco install redis-64

# 或下载 MSI 安装包从官网

Docker 安装

bash 复制代码
# 拉取镜像
docker pull redis

# 运行容器
docker run -d --name redis-server -p 6379:6379 redis

# 带密码运行
docker run -d --name redis-server -p 6379:6379 redis redis-server --requirepass "yourpassword"

基本配置 (redis.conf)

bash 复制代码
# 绑定IP地址
bind 127.0.0.1

# 端口号
port 6379

# 密码认证
requirepass your_secure_password

# 持久化设置
save 900 1      # 900秒内至少1个key变化
save 300 10     # 300秒内至少10个key变化
save 60 10000   # 60秒内至少10000个key变化

# 数据库数量
databases 16

# 日志级别
loglevel notice

3. 数据类型详解

数据类型 存储结构 特性 应用场景
String 字符串 二进制安全 缓存、计数器
Hash 字段值对 适合存储对象 用户信息、配置
List 链表 有序、可重复 消息队列、最新列表
Set 集合 无序、唯一 标签、好友关系
Sorted Set 有序集合 按分数排序 排行榜、优先级队列

4. 键(key)操作

基本键操作

bash 复制代码
# 设置键值(过期时间30秒)
SET key value EX 30

# 获取值
GET key

# 检查键是否存在
EXISTS key

# 删除键
DEL key1 key2 key3

# 查找匹配的键
KEYS user:*          # 查找user开头的所有键
KEYS *order*         # 查找包含order的键

# 设置过期时间
EXPIRE key 60        # 60秒后过期
TTL key              # 查看剩余时间

# 移出过期时间
PERSIST key

# 重命名键
RENAME old_key new_key

# 获取键类型
TYPE key

键的遍历

bash 复制代码
# 使用SCAN替代KEYS(避免阻塞)
SCAN 0 MATCH user:* COUNT 10
SCAN 17 MATCH product:* COUNT 20

5. 字符串(String)

基本操作

bash 复制代码
# 设置值
SET username "张三"
SET page_views 100

# 获取值
GET username

# 只在键不存在时设置
SETNX new_key "value"

# 设置值并过期时间
SETEX cache_key 300 "cached_data"

# 批量操作
MSET key1 "value1" key2 "value2" key3 "value3"
MGET key1 key2 key3

数字操作

bash 复制代码
# 递增操作
INCR page_views        # 增加1
INCRBY page_views 5    # 增加5

# 递减操作
DECR stock_count       # 减少1
DECRBY stock_count 3   # 减少3

# 浮点数操作
INCRBYFLOAT price 1.5

位操作

bash 复制代码
# 用户在线状态统计
SETBIT online_status 1001 1    # 用户1001在线
SETBIT online_status 1002 0    # 用户1002离线

# 检查状态
GETBIT online_status 1001

# 统计在线用户数
BITCOUNT online_status

6. 哈希(Hash)

基本操作

bash 复制代码
# 设置用户信息
HSET user:1001 name "李四" age 25 email "lisi@example.com"

# 获取单个字段
HGET user:1001 name

# 批量设置字段
HMSET user:1002 name "王五" age 30 city "北京"

# 批量获取字段
HMGET user:1001 name age email

# 获取所有字段和值
HGETALL user:1001

# 获取所有字段名
HKEYS user:1001

# 获取所有字段值
HVALS user:1001

高级操作

bash 复制代码
# 删除字段
HDEL user:1001 email

# 判断字段是否存在
HEXISTS user:1001 phone

# 获取字段数量
HLEN user:1001

# 字段值递增
HINCRBY user:1001 age 1
HINCRBYFLOAT product:1001 price 0.5

# 扫描哈希(大数据量时使用)
HSCAN user:1001 0 MATCH *name* COUNT 10

7. 列表(List)

基本操作

bash 复制代码
# 向左添加元素
LPUSH messages "first message"
LPUSH messages "second message"

# 向右添加元素
RPUSH messages "third message"

# 获取列表长度
LLEN messages

# 获取元素
LRANGE messages 0 -1    # 获取所有元素
LRANGE messages 0 2     # 获取前3个元素

# 弹出元素
LPOP messages           # 从左弹出
RPOP messages           # 从右弹出

阻塞操作

bash 复制代码
# 阻塞弹出(用于消息队列)
BLPOP task_queue 30     # 阻塞30秒等待任务
BRPOP task_queue 60     # 阻塞60秒等待任务

# 应用场景:任务队列
LPUSH task_queue "task1"
LPUSH task_queue "task2"
BRPOP task_queue 0      # 0表示无限等待

高级操作

bash 复制代码
# 按索引操作
LINDEX messages 0       # 获取第一个元素
LSET messages 1 "new value"  # 设置指定位置元素

# 插入元素
LINSERT messages BEFORE "value" "new_value"
LINSERT messages AFTER "value" "new_value"

# 删除元素
LREM messages 2 "value"  # 从前往删除2个匹配元素
LREM messages -2 "value" # 从后往前删除2个匹配元素

# 修剪列表
LTRIM messages 0 4      # 只保留前5个元素

8. 集合(Set)

基本操作

bash 复制代码
# 添加元素
SADD tags "redis" "database" "cache"

# 获取所有元素
SMEMBERS tags

# 删除元素
SREM tags "cache"

# 判断元素是否存在
SISMEMBER tags "redis"

# 获取集合大小
SCARD tags

# 随机获取元素
SRANDMEMBER tags
SPOP tags              # 随机弹出元素
集合运算
bash
# 用户标签示例
SADD user:1001:tags "sports" "music" "reading"
SADD user:1002:tags "music" "movies" "travel"

# 交集(共同兴趣)
SINTER user:1001:tags user:1002:tags

# 并集(所有兴趣)
SUNION user:1001:tags user:1002:tags

# 差集(用户1有但用户2没有的)
SDIFF user:1001:tags user:1002:tags

# 存储运算结果
SINTERSTORE common_tags user:1001:tags user:1002:tags

9. 有序集合(Sorted Set)

基本操作

bash 复制代码
# 添加成员和分数
ZADD leaderboard 1500 "player1"
ZADD leaderboard 1800 "player2" 2000 "player3"

# 获取排名(升序)
ZRANK leaderboard "player1"

# 获取排名(降序)
ZREVRANK leaderboard "player1"

# 按分数范围获取
ZRANGEBYSCORE leaderboard 1000 2000 WITHSCORES

# 获取前3名
ZREVRANGE leaderboard 0 2 WITHSCORES
高级操作
bash
# 获取分数
ZSCORE leaderboard "player1"

# 递增分数
ZINCRBY leaderboard 50 "player1"

# 按排名删除
ZREMRANGEBYRANK leaderboard 0 0    # 删除最后一名

# 按分数范围删除
ZREMRANGEBYSCORE leaderboard 0 1000

# 统计分数区间成员数
ZCOUNT leaderboard 1500 2000

# 集合运算
ZUNIONSTORE total_scores 2 set1 set2 WEIGHTS 1 0.5

10. 事务处理

基本事务

bash 复制代码
# 开始事务
MULTI

# 执行多个命令
SET balance:1001 500
DECRBY balance:1001 100
INCRBY balance:1002 100

# 提交事务
EXEC

# 取消事务
DISCARD

乐观锁

bash 复制代码
# 监视键
WATCH balance:1001

# 开始事务
MULTI
DECRBY balance:1001 50
INCRBY balance:1002 50

# 如果balance:1001被其他客户端修改,EXEC会失败
EXEC

Lua脚本

bash 复制代码
# 执行简单脚本
EVAL "return redis.call('GET', KEYS[1])" 1 user:1001

# 复杂业务逻辑
EVAL "
local current = redis.call('GET', KEYS[1])
if not current then
    return nil
end
if tonumber(current) < tonumber(ARGV[1]) then
    return 'insufficient_balance'
end
redis.call('DECRBY', KEYS[1], ARGV[1])
redis.call('INCRBY', KEYS[2], ARGV[1])
return 'success'
" 2 balance:1001 balance:1002 100

11. 发布订阅

基本使用

bash 复制代码
# 订阅频道(客户端1)
SUBSCRIBE news notifications

# 发布消息(客户端2)
PUBLISH news "今日头条新闻"
PUBLISH notifications "系统维护通知"

# 取消订阅
UNSUBSCRIBE news
模式订阅
bash
# 订阅匹配模式的频道
PSUBSCRIBE user.* notifications.*

# 发布到匹配频道
PUBLISH user.login "用户登录事件"
PUBLISH user.logout "用户登出事件"

# 取消模式订阅
PUNSUBSCRIBE user.*

12. 持久化配置

RDB 持久化

bash 复制代码
# 手动触发保存
SAVE          # 阻塞保存
BGSAVE        # 后台保存

# 自动保存配置
save 900 1    # 15分钟内至少1个变更
save 300 10   # 5分钟内至少10个变更
save 60 10000 # 1分钟内至少10000个变更

# RDB文件配置
dbfilename dump.rdb
dir /var/lib/redis
AOF 持久化
bash
# 开启AOF
appendonly yes

# 同步策略
appendfsync always     # 每次写操作都同步
appendfsync everysec   # 每秒同步(推荐)
appendfsync no         # 由操作系统决定

# AOF重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 手动重写
BGREWRITEAOF

13. 主从复制

主从配置

``bash

主节点配置 (redis.conf)

requirepass master_password

masterauth slave_password

从节点配置

replicaof 192.168.1.100 6379

masterauth master_password

replica-read-only yes

复制代码
复制管理
```bash
# 查看复制信息
INFO replication

# 手动设置主节点
REPLICAOF 192.168.1.100 6379

# 升级为独立节点
REPLICAOF NO ONE

# 检查同步状态
ROLE

14. 性能优化

内存优化

bash 复制代码
# 内存使用信息
INFO memory

# 内存优化配置
maxmemory 2gb
maxmemory-policy allkeys-lru

# 内存碎片整理
config set activedefrag yes
性能监控
bash
# 监控命令执行
MONITOR

# 慢查询日志
slowlog-log-slower-than 10000  # 10毫秒
slowlog-max-len 128

# 查看慢查询
SLOWLOG GET 10

# 性能统计
INFO stats
INFO commandstats
连接优化
bash
# 连接池配置
maxclients 10000
timeout 300

# 连接信息
CLIENT LIST
CLIENT KILL addr ip:port

# 暂停客户端
CLIENT PAUSE 5000    # 暂停5秒

15. 应用场景

缓存场景

bash 复制代码
# 缓存用户信息
SETEX user:1001:cache 300 "user_data_json"

# 缓存穿透保护
SETNX lock:user:1001 1 EX 10

# 缓存更新策略
DEL user:1001:cache
SETEX user:1001:cache 300 "new_data"

会话存储

bash 复制代码
# 用户会话
SETEX session:abc123 1800 "user_data"

# 更新会话
EXPIRE session:abc123 1800

# 会话清理
DEL session:abc123

排行榜系统

bash 复制代码
# 游戏分数排行
ZADD game_leaderboard 5000 "player1"
ZADD game_leaderboard 4800 "player2"

# 获取前10名
ZREVRANGE game_leaderboard 0 9 WITHSCORES

# 获取玩家排名
ZREVRANK game_leaderboard "player1"
ZSCORE game_leaderboard "player1"

消息队列

bash 复制代码
# 简单队列
LPUSH task_queue "task_data"
BRPOP task_queue 30

# 延迟队列
ZADD delayed_queue 1640995200 "delayed_task"
ZRANGEBYSCORE delayed_queue 0 1640995199

限流系统

bash 复制代码
# 简单限流
INCR rate_limit:user:1001
EXPIRE rate_limit:user:1001 60

# 滑动窗口限流
ZADD rate_window 1640995200 "request1"
ZREMRANGEBYSCORE rate_window 0 1640995100
ZCARD rate_window
相关推荐
青衫码上行3 小时前
【从0开始学习Java | 第21篇】网络编程综合练习
java·网络·学习
web安全工具库3 小时前
告别刀耕火种:用 Makefile 自动化 C 语言项目编译
linux·运维·c语言·开发语言·数据库·算法·自动化
disanleya4 小时前
怎样安全地开启MySQL远程管理权限?
数据库·mysql
失心疯_20234 小时前
PyQt开发_小学学习辅助工具
学习·pyqt
我的xiaodoujiao4 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 18--测试框架Pytest基础 2--插件和参数化
python·学习·测试工具·pytest
今天只学一颗糖4 小时前
Linux学习笔记--GPIO控制器驱动
笔记·学习
yuxb734 小时前
Ceph 分布式存储学习笔记(四):文件系统存储管理
笔记·ceph·学习
Larry_Yanan4 小时前
QML学习笔记(四十一)QML的ColorDialog和FontDialog
笔记·学习
【非典型Coder】4 小时前
Statement和PreparedStatement区别
数据库