Redis完全指南:从诞生到实战

一、Redis的前世今生

1.1 Redis的诞生背景

2009年,意大利程序员Salvatore Sanfilippo(网名antirez)正在为自己的创业项目开发一个实时日志分析系统。当时他发现传统的关系型数据库MySQL在处理实时数据时性能不足,无法满足他的需求。于是,他决定自己开发一个数据库来解决这个问题。

最初,antirez只是想创建一个简单的内存数据库,用来存储访问日志和实时统计数据。但随着开发的深入,他意识到这个项目可能对其他开发者也很有价值。2009年,Redis的第一个版本正式发布,并在GitHub上开源。

1.2 名字的由来

Redis这个名字来源于"REmote DIctionary Server"(远程字典服务器)的缩写。这个名字很好地概括了Redis的核心特性:它是一个可以通过网络访问的、基于键值对的数据存储系统。

1.3 发展历程

Redis的发展可以分为几个重要阶段:

2009-2010年:初创期

Redis刚发布时功能相对简单,主要支持字符串、列表、集合等基本数据类型。但它的高性能很快吸引了开发者的关注,用户群体迅速增长。

2010-2013年:成长期

这个阶段Redis不断增加新特性,包括发布订阅功能、事务支持、Lua脚本支持等。2013年,Redis 2.8版本引入了Sentinel哨兵机制,提供了高可用性解决方案。

2013-2015年:成熟期

2015年发布的Redis 3.0是一个里程碑版本,正式引入了Redis Cluster集群功能,使Redis具备了分布式部署能力。这让Redis从单机数据库进化为可以处理海量数据的分布式系统。

2016-2020年:企业级发展

Redis持续优化性能和稳定性,增加了模块系统、流数据类型等功能。2018年,Redis Labs公司调整了部分模块的开源协议,引发了社区讨论,但核心Redis仍保持BSD协议。

2020-2022年:架构革新期

2020年5月,Redis 6.0正式发布,这是一个具有里程碑意义的版本。它打破了Redis长期以来的单线程架构,引入了多线程I/O机制来处理网络数据读写和协议解析,同时保持命令执行仍为单线程以避免并发问题。这个版本还引入了ACL(访问控制列表)系统,允许基于用户、命令和键进行细粒度的权限控制,大大增强了安全性。此外,Redis 6.0支持了SSL/TLS加密通信、RESP3协议、客户端缓存等重要特性。

2022年4月,Redis 7.0发布,带来了超过50个新命令和大量核心改进。这个版本引入了Redis Functions功能,作为Lua脚本的升级方案,提供了更好的代码组织和版本管理。7.0版本还实现了多部分AOF持久化机制,将AOF文件拆分为多个部分以提高性能。命令自省功能得到增强,集群管理更加智能化。数据结构方面,List类型可以存储超过4GB的单个元素,内部编码从ziplist全面升级为更高效的listpack。

2024年:开源协议变更与社区分裂

2024年3月20日,Redis公司宣布了一个震动整个开源社区的决定:从Redis 7.4版本开始,将BSD-3-Clause开源协议变更为RSALv2(Redis Source Available License)和SSPLv1(Server Side Public License)双重许可。这意味着Redis在OSI(开源促进会)定义下不再是严格的开源软件,云服务商不能再免费使用Redis代码提供商业托管服务。

这一变化立即引发了社区的强烈反应。仅仅11天后,2024年3月31日,在Linux基金会的支持下,AWS、谷歌云、甲骨文、阿里云、华为等40多家公司宣布成立Valkey项目,基于Redis 7.2.4(最后的开源版本)进行分叉。Valkey项目由Redis的核心维护者领导,包括来自AWS的Madelyn Olson和来自腾讯的Zhao Zhao等资深开发者,他们贡献了Redis开源版本近一半的代码。

2024年4月16日,Valkey 7.2.5正式发布,完全兼容Redis 7.2.4,用户可以无缝迁移。2024年9月,Valkey发布了8.0版本,开始与Redis在功能上分道扬镳,引入了优化的多线程I/O、RDMA(远程直接内存访问)实验性支持、更高效的字典实现等新特性,部分命令性能提升高达41%。

2024-2026年:双轨发展时代

Redis公司方面,2024年7月发布了Redis 7.4版本,引入了Hash字段级过期功能(这是社区呼声最高的特性之一)、客户端缓存增强等特性。2024年末,Redis创始人Salvatore Sanfilippo(antirez)宣布回归Redis公司担任技术布道师,试图重建与社区的关系。

2025年5月1日,Redis 8.0正式发布,这是Redis公司在新许可下的首个主要版本。为了回应社区对开源的诉求,Redis 8.0重新引入了AGPLv3作为第三个许可选项,使其再次符合OSI开源标准。Redis 8.0在性能上实现了重大突破,引入了超过30项性能改进,常用命令延迟降低5.4%至87.4%,多核环境下吞吐量提升最高达112%(约2倍),复制速度提升18%。

更重要的是,Redis 8.0将原本分散的模块整合到核心发行版中,新增了8种数据结构:向量集(Vector Set,用于AI应用)、JSON、时间序列(Time Series)以及布隆过滤器、布谷鸟过滤器、Count-Min Sketch、Top-K和T-Digest五种概率数据结构。这使Redis从单纯的缓存数据库演变为功能完整的多模型数据存储平台。

Valkey项目同样发展迅速。AWS、谷歌云和阿里云等云厂商已经开始提供Valkey托管服务,例如Amazon ElastiCache for Valkey和MemoryDB for Valkey。根据2024年底的统计,Valkey已经吸引了大量Redis用户迁移,特别是在云环境中。Valkey 8.1版本(2025年发布)进一步优化了内存效率和性能,采用了新的哈希表实现。

现状与未来展望

截至2026年初,Redis和Valkey已经形成了明显的双轨格局:

  • Redis:由Redis公司主导开发,许可包括RSALv2、SSPLv1和AGPLv3三选一,拥有深厚的技术积累和完整的企业级功能,适合追求稳定性和商业支持的用户。

  • Valkey:由Linux基金会托管,采用BSD-3-Clause开源协议,得到主要云厂商支持,强调真正的开源精神和社区驱动开发,在性能优化上表现积极。

这种竞争态势对用户来说未必是坏事。两个项目都在加速创新,Redis专注于企业级特性和AI集成,Valkey注重性能优化和现代化架构。开发者可以根据自己的需求、许可偏好和生态系统选择合适的方案。历史会证明,究竟是Redis的深厚积累更胜一筹,还是Valkey的开源活力能够后来居上。

1.4 Redis的影响力

如今,Redis已经成为最流行的NoSQL数据库之一。据DB-Engines排名,Redis常年位居键值数据库第一名。全球众多知名企业如Twitter、GitHub、微博、阿里巴巴、腾讯等都在大规模使用Redis。

Redis的成功不仅在于其卓越的性能,更在于其简洁优雅的设计理念。antirez曾说:"我试图让Redis的每一个功能都保持简单,这样人们才能真正理解和使用它。"这种设计哲学让Redis成为了程序员最喜爱的工具之一。

二、Redis核心特性

2.1 内存数据库

Redis将所有数据存储在内存中,这是它高性能的根本原因。内存的读写速度远超磁盘,使Redis能够达到每秒数十万次的读写操作。

2.2 丰富的数据类型

Redis不仅仅是简单的键值存储,它支持多种数据结构:

  • String(字符串):最基础的类型,可以存储字符串、整数、浮点数
  • List(列表):有序的字符串列表,支持两端操作
  • Set(集合):无序且唯一的字符串集合
  • Sorted Set(有序集合):每个元素关联一个分数,按分数排序
  • Hash(哈希):键值对集合,适合存储对象
  • Bitmap(位图):基于字符串的位操作
  • HyperLogLog:用于基数统计的概率算法
  • Geospatial(地理空间):存储地理位置信息
  • Stream(流):消息队列和日志数据结构

2.3 持久化机制

虽然Redis是内存数据库,但它提供了两种持久化方式:

  • RDB(快照):定期将内存数据保存到磁盘
  • AOF(追加文件):记录每个写操作,可以完整恢复数据

2.4 高可用与分布式

  • 主从复制:数据自动同步到从节点
  • Sentinel哨兵:监控主从节点,自动故障转移
  • Cluster集群:数据分片存储,支持水平扩展

三、Redis安装指南

3.1 Linux系统安装

Redis官方支持的Linux发行版包括:

  • Ubuntu 22.04 (Jammy Jellyfish) 和 24.04 (Noble Numbat)
  • Rocky Linux 8.10 和 9.5
  • AlmaLinux 8.10 和 9.5
  • Debian 12 (Bookworm) 和 13 (Trixie)
方法一:通过包管理器安装(推荐新手)

Ubuntu/Debian系统:

bash 复制代码
# 添加Redis官方仓库
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

# 更新包列表
sudo apt update

# 安装Redis
sudo apt install redis

# 启动Redis服务
sudo systemctl start redis-server

# 设置开机自启
sudo systemctl enable redis-server

# 检查服务状态
sudo systemctl status redis-server

CentOS/RHEL系统:

bash 复制代码
# 添加Redis官方仓库
curl -fsSL https://packages.redis.io/gpg | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-redis > /dev/null

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://packages.redis.io/rpm/rhel$(rpm -E %{rhel})/redis.repo

# 安装Redis
sudo yum install redis

# 启动Redis服务
sudo systemctl start redis

# 设置开机自启
sudo systemctl enable redis

# 检查服务状态
sudo systemctl status redis
方法二:源码编译安装(推荐生产环境和最新版本)

这是官方推荐的安装方式,可以获得最新的稳定版本并进行自定义编译。

bash 复制代码
# 安装编译依赖工具
sudo apt install build-essential tcl  # Ubuntu/Debian
sudo yum groupinstall "Development Tools"  # CentOS/RHEL

# 下载Redis最新稳定版源码
wget https://download.redis.io/redis-stable.tar.gz

# 解压源码包
tar -xzvf redis-stable.tar.gz
cd redis-stable

# 编译Redis
make

# 可选:运行测试套件(确保编译正确,需要几分钟)
make test

# 安装Redis二进制文件到/usr/local/bin
sudo make install

# 编译后src目录下生成的重要文件:
# - redis-server: Redis服务器
# - redis-cli: Redis命令行客户端
# - redis-benchmark: 性能测试工具
# - redis-check-aof: AOF文件修复工具
# - redis-check-rdb: RDB文件检查工具
# - redis-sentinel: 哨兵模式程序

编译支持TLS加密连接:

bash 复制代码
# 安装OpenSSL开发库
sudo apt install libssl-dev  # Ubuntu/Debian
sudo yum install openssl-devel  # CentOS/RHEL

# 编译时启用TLS支持
make BUILD_TLS=yes

配置Redis为系统服务(正式安装):

bash 复制代码
# 创建必要的目录
sudo mkdir -p /etc/redis
sudo mkdir -p /var/redis/6379
sudo mkdir -p /var/log/redis

# 复制配置文件模板
sudo cp redis.conf /etc/redis/6379.conf

# 复制init脚本(如果存在)
sudo cp utils/redis_init_script /etc/init.d/redis_6379

# 修改配置文件关键设置
sudo vim /etc/redis/6379.conf

# 需要修改以下配置项:
# daemonize yes              # 以守护进程方式运行
# pidfile /var/run/redis_6379.pid  # PID文件路径
# port 6379                  # 监听端口
# dir /var/redis/6379        # 工作目录
# logfile /var/log/redis/redis_6379.log  # 日志文件

# 创建redis用户和组(可选,安全起见)
sudo useradd -r -s /bin/false redis
sudo chown -R redis:redis /var/redis
sudo chown -R redis:redis /var/log/redis

# 使用systemd管理(现代Linux系统推荐)
sudo tee /etc/systemd/system/redis.service > /dev/null <<EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动Redis服务
sudo systemctl start redis

# 设置开机自启
sudo systemctl enable redis

# 查看服务状态
sudo systemctl status redis

3.2 Windows系统安装

重要提示: Redis官方从未发布过原生Windows版本,仅支持Linux和macOS。Windows用户有以下选择:

方法一:使用WSL2安装(官方推荐)

Windows 10/11用户使用WSL2(Windows Subsystem for Linux)是最佳选择:

powershell 复制代码
# 在PowerShell(管理员权限)中安装WSL
wsl --install

# 重启计算机后,默认会安装Ubuntu
# 进入WSL Ubuntu环境后,按照前面的Ubuntu安装方法操作

# 添加Redis官方仓库
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

# 安装Redis
sudo apt update
sudo apt install redis

# 启动Redis
redis-server

# 在另一个WSL终端中测试连接
redis-cli ping
方法二:使用第三方Windows移植版(非官方,仅用于开发测试)

微软曾维护过Windows版本,现由社区维护:

下载安装:

  1. 访问GitHub: https://github.com/tporadowski/redis/releases
  2. 下载Redis-x64-xxx.zip压缩包
  3. 解压到指定目录,如 C:\Redis

手动启动:

cmd 复制代码
# 在命令提示符中进入Redis目录
cd C:\Redis

# 启动Redis服务器
redis-server.exe redis.windows.conf

安装为Windows服务:

cmd 复制代码
# 以管理员身份打开命令提示符
cd C:\Redis

# 安装Redis为Windows服务
redis-server.exe --service-install redis.windows-service.conf --loglevel verbose

# 启动服务
redis-server.exe --service-start

# 停止服务
redis-server.exe --service-stop

# 卸载服务
redis-server.exe --service-uninstall

连接测试:

cmd 复制代码
# 打开新的命令提示符窗口
cd C:\Redis
redis-cli.exe

# 或者指定主机和端口
redis-cli.exe -h 127.0.0.1 -p 6379

注意事项:

  • Windows版本仅建议用于开发和测试环境
  • 生产环境强烈建议使用Linux系统
  • Windows版本可能缺少某些功能和性能优化
  • 更新频率较慢,可能无法获得最新特性

3.3 macOS系统安装

Redis官方支持macOS系统,包括macOS 13(Ventura)、14(Sonoma)和15(Sequoia)。

使用Homebrew安装(官方推荐)

Homebrew是macOS最流行的包管理器:

bash 复制代码
# 1. 安装Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 验证Homebrew安装
brew --version

# 2. 安装Redis
brew install redis

# 3. 查看Redis信息
brew info redis
# 会显示配置文件位置:/usr/local/etc/redis.conf 或 /opt/homebrew/etc/redis.conf

# 4. 启动Redis服务(后台运行)
brew services start redis

# 查看服务状态
brew services list

# 停止Redis服务
brew services stop redis

# 重启Redis服务
brew services restart redis

# 5. 或者前台运行Redis(手动启动)
redis-server /usr/local/etc/redis.conf
# M1/M2芯片Mac路径可能是: /opt/homebrew/etc/redis.conf
从源码编译安装

如果需要最新版本或自定义编译:

bash 复制代码
# 下载源码
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable

# 编译
make

# 测试编译
make test

# 安装
sudo make install

# 启动Redis
redis-server
配置文件位置说明

Homebrew安装的Redis配置文件路径根据Mac架构不同:

  • Intel芯片Mac : /usr/local/etc/redis.conf
  • Apple Silicon(M1/M2) : /opt/homebrew/etc/redis.conf

数据文件默认保存在:

  • Intel芯片 : /usr/local/var/db/redis/
  • Apple Silicon : /opt/homebrew/var/db/redis/

3.4 Docker安装(跨平台推荐)

Docker方式最简单且跨平台,官方维护Docker镜像:

bash 复制代码
# 1. 拉取官方Redis镜像(最新稳定版)
docker pull redis:latest

# 或指定具体版本
docker pull redis:7.4

# 2. 基本运行(快速测试)
docker run --name my-redis -p 6379:6379 -d redis

# 3. 使用持久化存储(推荐生产环境)
docker run --name my-redis \
  -p 6379:6379 \
  -v redis-data:/data \
  -d redis redis-server --appendonly yes

# 4. 使用自定义配置文件
# 首先在本地创建配置文件
mkdir -p ~/redis/conf
wget -O ~/redis/conf/redis.conf https://raw.githubusercontent.com/redis/redis/7.4/redis.conf

# 编辑配置文件
vim ~/redis/conf/redis.conf
# 修改以下配置:
# bind 0.0.0.0  # 允许外部连接(注意安全)
# requirepass your_password  # 设置密码

# 运行容器并挂载配置文件
docker run --name my-redis \
  -p 6379:6379 \
  -v ~/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v redis-data:/data \
  -d redis redis-server /usr/local/etc/redis/redis.conf

# 5. 连接到Redis容器
docker exec -it my-redis redis-cli

# 使用密码连接
docker exec -it my-redis redis-cli -a your_password

# 6. 查看Redis日志
docker logs my-redis

# 实时查看日志
docker logs -f my-redis

# 7. 停止和启动容器
docker stop my-redis
docker start my-redis

# 8. 删除容器
docker rm -f my-redis

# 删除数据卷(谨慎操作,会删除所有数据)
docker volume rm redis-data

Docker Compose方式(推荐团队开发):

创建docker-compose.yml文件:

yaml 复制代码
version: '3.8'

services:
  redis:
    image: redis:7.4
    container_name: redis-server
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai

volumes:
  redis-data:

启动和管理:

bash 复制代码
# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v

Redis Stack(包含扩展模块):

如果需要Redis的扩展功能(如JSON、搜索、图等):

bash 复制代码
# 拉取Redis Stack镜像
docker pull redis/redis-stack:latest

# 运行Redis Stack
docker run --name redis-stack \
  -p 6379:6379 \
  -p 8001:8001 \
  -v redis-stack-data:/data \
  -d redis/redis-stack:latest

# 访问Redis Insight(Web管理界面)
# 浏览器打开: http://localhost:8001

3.5 验证安装与基本测试

安装完成后,验证Redis是否正常运行:

基本连接测试:

bash 复制代码
# 使用redis-cli连接本地Redis
redis-cli

# 测试连接
127.0.0.1:6379> ping
PONG

# 设置一个键值对
127.0.0.1:6379> set test "Hello Redis"
OK

# 获取值
127.0.0.1:6379> get test
"Hello Redis"

# 查看Redis服务器信息
127.0.0.1:6379> info server
# 会显示Redis版本、运行时间等信息

# 退出
127.0.0.1:6379> exit

连接远程Redis服务器:

bash 复制代码
# 指定主机和端口
redis-cli -h 192.168.1.100 -p 6379

# 使用密码连接
redis-cli -h 192.168.1.100 -p 6379 -a yourpassword

# 更安全的方式(不在命令行暴露密码)
redis-cli -h 192.168.1.100 -p 6379
127.0.0.1:6379> auth yourpassword
OK

# 或使用环境变量
export REDISCLI_AUTH=yourpassword
redis-cli -h 192.168.1.100 -p 6379

执行单条命令(不进入交互模式):

bash 复制代码
# 直接执行命令
redis-cli set mykey "value"
redis-cli get mykey

# 查看所有键
redis-cli keys '*'

# 获取Redis信息
redis-cli info

# 监控Redis命令执行
redis-cli monitor

# 测试延迟
redis-cli --latency

# 持续测试延迟(按Ctrl+C停止)
redis-cli --latency-history

性能测试:

Redis自带性能测试工具redis-benchmark:

bash 复制代码
# 基本性能测试(默认测试)
redis-benchmark

# 只测试SET和GET命令,10万次请求
redis-benchmark -t set,get -n 100000

# 测试指定主机,使用20个并发连接
redis-benchmark -h 192.168.1.100 -p 6379 -c 20 -n 100000

# 只测试SET,使用3字节的值
redis-benchmark -t set -n 100000 -d 3

# 使用管道模式(Pipeline)测试
redis-benchmark -n 100000 -P 16

# 安静模式(只显示每秒请求数)
redis-benchmark -q

检查Redis服务状态:

bash 复制代码
# systemd管理的服务
sudo systemctl status redis

# 查看Redis进程
ps aux | grep redis-server

# 检查Redis监听端口
sudo netstat -tlnp | grep 6379
# 或使用ss命令
sudo ss -tlnp | grep 6379

# 查看Redis日志
sudo tail -f /var/log/redis/redis.log

# 或使用journalctl(systemd)
sudo journalctl -u redis -f

常见问题排查:

bash 复制代码
# 问题1: 无法连接Redis
# 检查服务是否运行
sudo systemctl status redis

# 检查端口是否监听
sudo netstat -tlnp | grep 6379

# 检查防火墙设置
sudo firewall-cmd --list-all  # CentOS/RHEL
sudo ufw status  # Ubuntu

# 问题2: 连接被拒绝
# 检查bind配置(编辑redis.conf)
# bind 127.0.0.1  # 只允许本地连接
# bind 0.0.0.0    # 允许所有IP连接(不安全,需配置密码)

# 检查保护模式
# protected-mode yes  # 启用保护模式
# protected-mode no   # 关闭保护模式(需设置密码)

# 问题3: 权限问题
# 检查文件权限
ls -la /var/redis/
ls -la /var/log/redis/

# 修复权限
sudo chown -R redis:redis /var/redis/
sudo chown -R redis:redis /var/log/redis/

四、Redis基础使用

4.1 Redis命令行工具

redis-cli基本用法
bash 复制代码
# 连接本地Redis
redis-cli

# 连接远程Redis
redis-cli -h 192.168.1.100 -p 6379

# 使用密码连接
redis-cli -h 192.168.1.100 -p 6379 -a yourpassword

# 执行单条命令
redis-cli set mykey "value"

# 查看所有键
redis-cli keys *

4.2 字符串操作

字符串是Redis最基本的数据类型:

bash 复制代码
# 设置键值
SET name "张三"
SET age 25

# 获取值
GET name

# 设置过期时间(秒)
SETEX session:123 3600 "user_data"

# 仅当键不存在时设置
SETNX lock:resource "locked"

# 追加字符串
APPEND name "同学"

# 获取字符串长度
STRLEN name

# 数值操作
SET counter 0
INCR counter        # 加1
INCRBY counter 5    # 加5
DECR counter        # 减1
DECRBY counter 3    # 减3

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

4.3 列表操作

列表是有序的字符串集合:

bash 复制代码
# 从左侧插入
LPUSH tasks "任务1" "任务2" "任务3"

# 从右侧插入
RPUSH tasks "任务4"

# 获取列表长度
LLEN tasks

# 获取指定范围元素(0到-1表示所有元素)
LRANGE tasks 0 -1

# 从左侧弹出
LPOP tasks

# 从右侧弹出
RPOP tasks

# 获取指定索引元素
LINDEX tasks 0

# 设置指定索引元素
LSET tasks 0 "新任务"

# 阻塞式弹出(可用于消息队列)
BLPOP tasks 30  # 30秒超时

4.4 集合操作

集合是无序且唯一的字符串集合:

bash 复制代码
# 添加元素
SADD tags "Python" "Redis" "数据库"

# 查看所有成员
SMEMBERS tags

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

# 获取集合元素个数
SCARD tags

# 移除元素
SREM tags "Redis"

# 随机获取元素
SRANDMEMBER tags 2

# 弹出随机元素
SPOP tags

# 集合运算
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"

SINTER set1 set2      # 交集
SUNION set1 set2      # 并集
SDIFF set1 set2       # 差集

4.5 有序集合操作

有序集合为每个成员关联一个分数:

bash 复制代码
# 添加成员(分数 成员)
ZADD scores 95 "张三" 88 "李四" 92 "王五"

# 获取指定范围成员(按分数升序)
ZRANGE scores 0 -1

# 获取指定范围成员(带分数)
ZRANGE scores 0 -1 WITHSCORES

# 逆序获取
ZREVRANGE scores 0 -1 WITHSCORES

# 获取成员排名
ZRANK scores "张三"
ZREVRANK scores "张三"  # 逆序排名

# 获取成员分数
ZSCORE scores "张三"

# 增加成员分数
ZINCRBY scores 5 "李四"

# 按分数范围查询
ZRANGEBYSCORE scores 90 100 WITHSCORES

# 获取集合元素个数
ZCARD scores

# 移除成员
ZREM scores "王五"

4.6 哈希操作

哈希适合存储对象:

bash 复制代码
# 设置字段值
HSET user:1001 name "张三" age 25 city "北京"

# 获取字段值
HGET user:1001 name

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

# 获取所有字段
HKEYS user:1001

# 获取所有值
HVALS user:1001

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

# 删除字段
HDEL user:1001 city

# 获取字段数量
HLEN user:1001

# 批量设置
HMSET user:1002 name "李四" age 30 city "上海"

# 批量获取
HMGET user:1002 name age

# 字段值增加
HINCRBY user:1001 age 1

4.7 键管理命令

bash 复制代码
# 查看所有键
KEYS *

# 模糊查询
KEYS user:*

# 检查键是否存在
EXISTS name

# 删除键
DEL name

# 设置过期时间(秒)
EXPIRE name 60

# 设置过期时间(毫秒)
PEXPIRE name 60000

# 查看剩余过期时间
TTL name

# 移除过期时间
PERSIST name

# 查看键的数据类型
TYPE mykey

# 重命名键
RENAME oldkey newkey

# 仅当新键不存在时重命名
RENAMENX oldkey newkey

五、Redis实战应用场景

5.1 缓存系统

这是Redis最常见的应用场景:

python 复制代码
import redis
import json

# 连接Redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

def get_user(user_id):
    # 先从缓存获取
    cache_key = f"user:{user_id}"
    user_data = r.get(cache_key)
    
    if user_data:
        return json.loads(user_data)
    
    # 缓存未命中,从数据库查询
    user = db.query_user(user_id)  # 假设的数据库查询
    
    # 写入缓存,设置1小时过期
    r.setex(cache_key, 3600, json.dumps(user))
    
    return user

5.2 分布式锁

python 复制代码
import time
import uuid

def acquire_lock(lock_name, timeout=10):
    """获取分布式锁"""
    identifier = str(uuid.uuid4())
    lock_key = f"lock:{lock_name}"
    
    # 尝试获取锁,设置过期时间防止死锁
    if r.set(lock_key, identifier, nx=True, ex=timeout):
        return identifier
    return None

def release_lock(lock_name, identifier):
    """释放分布式锁"""
    lock_key = f"lock:{lock_name}"
    
    # 使用Lua脚本保证原子性
    lua_script = """
    if redis.call("get", KEYS[1]) == ARGV[1] then
        return redis.call("del", KEYS[1])
    else
        return 0
    end
    """
    
    return r.eval(lua_script, 1, lock_key, identifier)

# 使用示例
lock_id = acquire_lock("resource_123")
if lock_id:
    try:
        # 执行需要锁保护的操作
        print("执行业务逻辑")
    finally:
        release_lock("resource_123", lock_id)

5.3 消息队列

python 复制代码
# 生产者
def publish_task(task_data):
    r.lpush("task_queue", json.dumps(task_data))

# 消费者
def consume_tasks():
    while True:
        # 阻塞式获取任务
        task = r.brpop("task_queue", timeout=5)
        if task:
            task_data = json.loads(task[1])
            process_task(task_data)

# 发布订阅模式
def publisher():
    r.publish("news_channel", "重要新闻内容")

def subscriber():
    pubsub = r.pubsub()
    pubsub.subscribe("news_channel")
    
    for message in pubsub.listen():
        if message['type'] == 'message':
            print(f"收到消息: {message['data']}")

5.4 计数器和排行榜

python 复制代码
# 文章点赞计数
def like_article(article_id):
    r.incr(f"article:likes:{article_id}")

def get_likes(article_id):
    return int(r.get(f"article:likes:{article_id}") or 0)

# 游戏排行榜
def update_score(user_id, score):
    r.zadd("game_leaderboard", {user_id: score})

def get_top_players(count=10):
    # 获取前10名
    return r.zrevrange("game_leaderboard", 0, count-1, withscores=True)

def get_user_rank(user_id):
    # 获取用户排名(从1开始)
    rank = r.zrevrank("game_leaderboard", user_id)
    return rank + 1 if rank is not None else None

5.5 会话管理

python 复制代码
def create_session(user_id, session_data):
    session_id = str(uuid.uuid4())
    session_key = f"session:{session_id}"
    
    # 存储会话数据,30分钟过期
    r.setex(session_key, 1800, json.dumps({
        "user_id": user_id,
        **session_data
    }))
    
    return session_id

def get_session(session_id):
    session_key = f"session:{session_id}"
    data = r.get(session_key)
    
    if data:
        # 刷新过期时间
        r.expire(session_key, 1800)
        return json.loads(data)
    return None

5.6 限流控制

python 复制代码
def rate_limit(user_id, max_requests=100, window=60):
    """
    限流:每分钟最多100次请求
    """
    key = f"rate_limit:{user_id}:{int(time.time() // window)}"
    
    current = r.incr(key)
    
    if current == 1:
        r.expire(key, window)
    
    return current <= max_requests

# 使用示例
if rate_limit("user_123"):
    # 处理请求
    process_request()
else:
    # 返回限流错误
    return "请求过于频繁,请稍后再试"

六、Redis配置优化

6.1 配置文件详解

Redis的配置文件通常名为redis.conf(Windows下为redis.windows.conf)。从Redis 8开始,有两个配置文件:

  • redis.conf: 仅包含Redis服务器核心配置
  • redis-full.conf: 包含Redis服务器和所有扩展组件的配置
配置文件基本操作
bash 复制代码
# 使用指定配置文件启动Redis
redis-server /path/to/redis.conf

# 在运行时查看配置
redis-cli config get *
redis-cli config get maxmemory
redis-cli config get save

# 在运行时修改配置(重启后失效)
redis-cli config set maxmemory 2gb
redis-cli config set timeout 300

# 将内存中的配置写入redis.conf
redis-cli config rewrite

6.2 重要配置项详解

网络配置
conf 复制代码
# 绑定IP地址
# 127.0.0.1 - 只允许本地访问(最安全)
# 0.0.0.0 - 允许所有IP访问(需配置密码)
# 指定IP - 只允许特定IP访问
bind 127.0.0.1 -::1

# 保护模式(默认开启)
# 当没有设置bind和密码时,只接受本地连接
protected-mode yes

# 监听端口
port 6379

# TCP监听队列长度
# 高并发场景下建议调大
tcp-backlog 511

# 客户端空闲超时时间(秒,0表示不超时)
timeout 0

# TCP keepalive
# 定期发送TCP ACK到客户端,检测死连接
tcp-keepalive 300

# 最大客户端连接数
maxclients 10000
通用配置
conf 复制代码
# 是否以守护进程方式运行
daemonize yes

# PID文件路径
pidfile /var/run/redis_6379.pid

# 日志级别
# debug - 大量信息,适合开发调试
# verbose - 较多有用信息
# notice - 适度的日志信息,推荐生产环境
# warning - 仅记录重要/警告信息
loglevel notice

# 日志文件路径
# 空字符串表示输出到标准输出
logfile "/var/log/redis/redis.log"

# 数据库数量(默认16个,编号0-15)
databases 16

# 是否显示Redis logo
always-show-logo yes
安全配置
conf 复制代码
# 设置密码
# 客户端连接时需要使用 AUTH password
requirepass your_strong_password_here

# 重命名危险命令(防止误操作)
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG "CONFIG_SAFE_MODE"
rename-command SHUTDOWN "SHUTDOWN_SAFE"

# 禁用某些命令
rename-command KEYS ""
内存管理
conf 复制代码
# 最大内存限制
# 格式: 1kb=1024字节, 1mb=1024kb, 1gb=1024mb
maxmemory 2gb

# 内存达到上限时的淘汰策略
# volatile-lru: 在设置了过期时间的键中使用LRU算法淘汰
# allkeys-lru: 对所有键使用LRU算法淘汰
# volatile-lfu: 在设置了过期时间的键中使用LFU算法淘汰
# allkeys-lfu: 对所有键使用LFU算法淘汰
# volatile-random: 在设置了过期时间的键中随机淘汰
# allkeys-random: 对所有键随机淘汰
# volatile-ttl: 淘汰即将过期的键
# noeviction: 不淘汰,写操作返回错误
maxmemory-policy allkeys-lru

# LRU/LFU算法采样数量
# 值越大,越接近真实LRU,但消耗更多CPU
maxmemory-samples 5

# 从节点是否忽略maxmemory
# 设置为yes,从节点可以超过maxmemory限制
replica-ignore-maxmemory yes
持久化配置 - RDB
conf 复制代码
# RDB快照保存策略
# 格式: save <秒> <变更次数>
# 下面的配置表示:
# 900秒(15分钟)内至少1次写操作
# 300秒(5分钟)内至少10次写操作
# 60秒(1分钟)内至少10000次写操作
# 三个条件满足任意一个就触发保存
save 900 1
save 300 10
save 60 10000

# 禁用RDB可以设置为空
# save ""

# 后台保存出错时,停止写入
stop-writes-on-bgsave-error yes

# RDB文件压缩
# 压缩会占用CPU,但节省磁盘空间
rdbcompression yes

# RDB文件校验
# 存储和加载时进行CRC64校验
rdbchecksum yes

# RDB文件名
dbfilename dump.rdb

# RDB和AOF文件存储目录
dir /var/redis/6379
持久化配置 - AOF
conf 复制代码
# 启用AOF持久化
appendonly yes

# AOF文件名
appendfilename "appendonly.aof"

# AOF同步策略
# always: 每次写入都同步到磁盘(最安全但最慢)
# everysec: 每秒同步一次(推荐,平衡性能和安全)
# no: 由操作系统决定何时同步(最快但可能丢失更多数据)
appendfsync everysec

# AOF重写时是否同步
# 设置为no可以防止重写时的延迟峰值
no-appendfsync-on-rewrite no

# AOF自动重写触发条件
# 当AOF文件大小达到上次重写后大小的100%(翻倍)
auto-aof-rewrite-percentage 100
# 且AOF文件大小至少64MB时触发重写
auto-aof-rewrite-min-size 64mb

# 加载AOF时是否忽略最后一条不完整的命令
aof-load-truncated yes

# 是否使用RDB-AOF混合持久化
# 重写时,前半部分用RDB格式,后半部分用AOF格式
aof-use-rdb-preamble yes
复制配置(主从)
conf 复制代码
# 从节点只读(默认)
replica-read-only yes

# 主节点密码(从节点连接主节点时使用)
# masterauth <master-password>

# 从节点配置主节点信息
# replicaof <masterip> <masterport>

# 复制超时时间
repl-timeout 60

# 是否禁用TCP_NODELAY
# no表示启用TCP_NODELAY,降低延迟(推荐)
repl-disable-tcp-nodelay no

# 复制积压缓冲区大小
# 用于部分重同步,建议设置为主节点可能产生的命令量
repl-backlog-size 1mb

# 主节点失联后,复制积压缓冲区保留时间
repl-backlog-ttl 3600

# 从节点优先级(用于哨兵选主)
# 0表示永远不会被选为主节点
replica-priority 100
慢查询日志
conf 复制代码
# 慢查询阈值(微秒)
# 执行时间超过此值的命令会被记录
# 10000 = 10毫秒
slowlog-log-slower-than 10000

# 慢查询日志长度
# 只保存最近的N条慢查询
slowlog-max-len 128
高级配置
conf 复制代码
# Hash类型优化
# 元素数量小于等于512时使用ziplist编码
hash-max-ziplist-entries 512
# 单个元素大小小于等于64字节时使用ziplist
hash-max-ziplist-value 64

# List类型优化
# 负数表示大小限制,正数表示元素数量限制
list-max-ziplist-size -2

# List压缩深度
# 0表示不压缩,1表示头尾各1个节点不压缩
list-compress-depth 0

# Set类型优化
# 元素都是整数且数量不超过512时使用intset
set-max-intset-entries 512

# Sorted Set优化
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# HyperLogLog稀疏表示限制
hll-sparse-max-bytes 3000

# 是否启用活跃碎片整理
activedefrag yes

# 碎片整理最小碎片率(百分比)
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10

# 碎片整理最大努力程度
active-defrag-cycle-min 1
active-defrag-cycle-max 25

6.3 生产环境配置建议

基础生产配置模板
conf 复制代码
# ========== 网络配置 ==========
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60

# ========== 安全配置 ==========
requirepass YOUR_STRONG_PASSWORD_HERE

# ========== 通用配置 ==========
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis_6379.log
databases 16

# ========== 内存管理 ==========
maxmemory 4gb
maxmemory-policy allkeys-lru
maxmemory-samples 5

# ========== 持久化 - RDB ==========
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb

# ========== 持久化 - AOF ==========
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes

# ========== 工作目录 ==========
dir /var/redis/6379

# ========== 复制配置 ==========
replica-read-only yes
repl-disable-tcp-nodelay no
repl-backlog-size 256mb

# ========== 客户端限制 ==========
maxclients 10000

# ========== 慢查询 ==========
slowlog-log-slower-than 10000
slowlog-max-len 128

6.4 性能优化建议

  1. 合理设置最大内存

    • 为系统和其他进程预留至少25%内存
    • 如服务器8GB内存,Redis设置为6GB
    • 使用maxmemory限制内存使用
  2. 选择合适的淘汰策略

    • 缓存场景: allkeys-lruallkeys-lfu
    • 有明确过期时间的场景: volatile-lruvolatile-ttl
    • 不接受数据丢失: noeviction(需监控内存)
  3. 持久化策略选择

    • 只做缓存: 关闭持久化
    • 可接受少量数据丢失: 只用RDB
    • 数据重要: RDB + AOF混合模式
    • 极高可靠性: AOF + appendfsync always(性能较差)
  4. 网络优化

    • 启用TCP_NODELAY: repl-disable-tcp-nodelay no
    • 调大tcp-backlog应对高并发连接
  5. 使用Pipeline减少网络往返

    • 批量命令使用MGET、MSET
    • 客户端使用Pipeline技术
  6. 避免使用慢命令

    • 禁用或重命名KEYS命令,改用SCAN
    • 大量数据用HSCAN、SSCAN、ZSCAN
    • 避免大集合的SMEMBERS、HGETALL等操作
  7. 启用持久化优化

    • RDB压缩: rdbcompression yes
    • AOF重写时不同步: no-appendfsync-on-rewrite yes
    • 使用RDB-AOF混合格式: aof-use-rdb-preamble yes

七、常见问题与解决方案

7.1 Redis连接失败

问题: 无法连接到Redis服务器

解决方案:

  1. 检查Redis服务是否运行: sudo systemctl status redis
  2. 检查防火墙设置
  3. 检查bind配置是否正确
  4. 验证密码是否正确

7.2 内存占用过高

问题: Redis占用内存过多

解决方案:

  1. 设置maxmemory限制
  2. 配置合适的淘汰策略
  3. 为键设置过期时间
  4. 使用MEMORY USAGE key分析键的内存占用

7.3 性能下降

问题: Redis响应变慢

解决方案:

  1. 使用SLOWLOG GET查看慢查询
  2. 避免使用KEYS命令,改用SCAN
  3. 检查持久化配置是否影响性能
  4. 考虑使用主从复制分担读压力

八、总结

Redis从2009年诞生至今,已经发展成为最流行的内存数据库之一。它的成功源于简洁的设计、卓越的性能和丰富的功能。无论是作为缓存、消息队列、还是分布式锁,Redis都能胜任。

掌握Redis不仅要理解其基本操作,更要了解其底层原理和最佳实践。希望这篇文章能帮助你全面了解Redis,并在实际项目中灵活运用。

学习建议:

  1. 多动手实践,在本地搭建Redis环境
  2. 阅读官方文档,了解每个命令的详细用法
  3. 关注Redis社区,学习最新特性和最佳实践
  4. 在实际项目中应用,积累经验

Redis的世界很精彩,继续探索吧!


参考资源:

相关推荐
老邓计算机毕设2 分钟前
SSM智慧社区家政服务系统80q7o(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架
松涛和鸣1 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa1 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k2 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL3 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·3 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德3 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫3 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i4 小时前
完全卸载MariaDB
数据库·mariadb