Redis 7.0于2022年4月正式发布,带来了很多新特性。

本文是Redis 7.0的入门指南,从零开始介绍Redis的基本概念,以及7.0版本的新特性,包括Redis Functions、ACL改进、多部分AOF、集群改进、命令改进等,适合Redis新手和想了解新版本的开发者。

一、Redis是什么

1. 基本概念

Redis(Remote Dictionary Server)是一个开源的内存数据库。

它的特点:

  • 基于内存,读写速度极快
  • 支持多种数据结构(字符串、哈希、列表、集合、有序集合等)
  • 支持持久化(RDB和AOF)
  • 支持主从复制、哨兵、集群
  • 支持事务、Lua脚本
  • 支持发布订阅

Redis的应用场景:

  • 缓存:最常用的场景,缓存热点数据
  • 数据库:可以作为主数据库使用
  • 消息队列:列表结构可以做简单的消息队列
  • 分布式锁:用SETNX实现分布式锁
  • 计数器:用INCR实现计数器
  • 排行榜:用有序集合实现排行榜

2. 为什么用Redis

Redis的优势:

  • 速度快:基于内存,读写速度是微秒级
  • 数据结构丰富:支持多种数据结构,适用场景广
  • 持久化:支持RDB和AOF,数据不丢失
  • 高可用:支持主从、哨兵、集群
  • 简单易用:命令简单,学习成本低
  • 生态成熟:客户端库丰富,社区活跃

3. Redis的版本历史

Redis的主要版本:

  • Redis 2.x:基础功能完善
  • Redis 3.x:集群功能
  • Redis 4.x:模块系统、混合持久化
  • Redis 5.x:Stream数据结构
  • Redis 6.x:ACL、多线程IO
  • Redis 7.x:当前最新版本,很多新特性

二、Redis基础

1. 安装和启动

安装Redis:

# Ubuntu/Debian
sudo apt install redis-server

# CentOS/RHEL
sudo yum install redis

# macOS
brew install redis

# 源码编译
wget https://download.redis.io/releases/redis-7.0.0.tar.gz
tar xzf redis-7.0.0.tar.gz
cd redis-7.0.0
make
make install

启动Redis:

redis-server

连接Redis:

redis-cli

2. 基本数据结构

Redis支持多种数据结构:

字符串(String):

SET key value
GET key
INCR counter
DECR counter
EXPIRE key 60  # 60秒过期

哈希(Hash):

HSET user:1 name "张三" age 25
HGET user:1 name
HGETALL user:1

列表(List):

LPUSH queue "task1"
RPUSH queue "task2"
LPOP queue
RPOP queue
LRANGE queue 0 -1

集合(Set):

SADD tags "java" "python" "go"
SMEMBERS tags
SISMEMBER tags "java"

有序集合(Sorted Set):

ZADD ranking 100 "user1" 90 "user2" 80 "user3"
ZRANGE ranking 0 -1 WITHSCORES
ZREVRANGE ranking 0 2

3. 常用命令

  • KEYS:查看所有key(生产环境慎用)
  • SCAN:迭代key(生产环境推荐)
  • EXISTS:判断key是否存在
  • DEL:删除key
  • EXPIRE:设置过期时间
  • TTL:查看剩余过期时间
  • TYPE:查看key的类型
  • INFO:查看服务器信息

三、Redis 7.0新特性

Redis 7.0带来了很多新特性,我挑几个重要的介绍。

1. Redis Functions

这是Redis 7.0最重要的新特性。

Redis Functions是一种新的服务端脚本方式,类似于Lua脚本,但更强大。

和Lua脚本的区别:

  • Functions是持久化的,存在数据库里,重启不丢失
  • Functions有版本管理,可以升级
  • Functions有更好的性能
  • Functions支持更复杂的逻辑

创建Function:

# 创建一个Function
FUNCTION LOAD "#!lua name=mylib\nredis.register_function('hello', function() return 'Hello World' end)"

# 调用Function
FCALL hello 0

# 查看所有Function
FUNCTION LIST

Functions的优势:

  • 应用启动时不需要加载脚本
  • 多个客户端可以共享Function
  • 可以版本管理,方便升级
  • 性能更好

2. ACL改进

Redis 6.0引入了ACL(访问控制列表),7.0做了改进。

新特性:

  • 支持按命令类别授权
  • 支持key前缀授权
  • 支持更细粒度的权限控制
  • ACL日志记录

创建用户:

# 创建用户,只能访问以user:开头的key
ACL SETUSER user1 on >password1 ~user:* +@all

# 查看用户
ACL LIST

# 删除用户
ACL DELUSER user1

ACL改进后,权限控制更灵活,更安全。

3. 多部分AOF

Redis 7.0改进了AOF(Append Only File)持久化。

之前的AOF是一个文件,7.0改成了多部分:

  • base文件:基础数据
  • incr文件:增量数据
  • manifest文件:清单文件

好处:

  • AOF重写更快
  • 恢复更快
  • 更节省磁盘空间
  • 更可靠

配置:

appendonly yes
appendfilename "appendonly.aof"
aof-use-rdb-preamble yes

4. 集群改进

Redis 7.0对集群做了很多改进:

  • 集群的命令更丰富
  • 支持更多的命令在集群中使用
  • 集群的故障转移更稳定
  • 集群的配置更灵活

比如,之前很多命令在集群中不支持跨slot,7.0改进了很多。

5. 命令改进

Redis 7.0改进了很多命令:

  • ZMPOP:从多个有序集合中弹出元素
  • LMPOP:从多个列表中弹出元素
  • BLMOVE:阻塞式列表移动
  • EXPIRETIME:查看过期时间戳
  • PEXPIRETIME:查看过期时间戳(毫秒)
  • GETDEL:获取并删除
  • GETEX:获取并设置过期时间

这些新命令,让Redis的使用更方便。

6. 客户端改进

Redis 7.0改进了客户端管理:

  • 客户端信息更详细
  • 支持客户端名称
  • 支持客户端ID
  • 可以更方便地管理客户端连接

7. 性能改进

Redis 7.0在性能上也有提升:

  • 多线程IO优化
  • 内存管理优化
  • 命令执行优化
  • 集群通信优化

整体性能,比6.0有提升。

四、Redis 7.0实战

1. 用Redis做缓存

最常见的用法。

import redis

r = redis.Redis(host='localhost', port=6379, db=0)

# 设置缓存,过期时间60秒
r.set('user:1', '{"name": "张三", "age": 25}', ex=60)

# 获取缓存
user = r.get('user:1')
if user:
    print(user)
else:
    # 从数据库查询
    # 然后写入缓存
    pass

2. 用Redis做分布式锁

import redis
import time

r = redis.Redis(host='localhost', port=6379, db=0)

# 获取锁
lock = r.set('lock:order', '1', nx=True, ex=10)
if lock:
    try:
        # 执行业务逻辑
        print('获取锁成功,执行业务')
        time.sleep(5)
    finally:
        # 释放锁
        r.delete('lock:order')
else:
    print('获取锁失败')

3. 用Redis做排行榜

import redis

r = redis.Redis(host='localhost', port=6379, db=0)

# 添加分数
r.zadd('ranking', {'user1': 100, 'user2': 90, 'user3': 80})

# 获取排行榜(前3名)
top3 = r.zrevrange('ranking', 0, 2, withscores=True)
for user, score in top3:
    print(f'{user}: {score}')

# 增加分数
r.zincrby('ranking', 10, 'user1')

4. 用Redis Functions

import redis

r = redis.Redis(host='localhost', port=6379, db=0)

# 加载Function
function_code = """
#!lua name=utils
redis.register_function('get_and_delete', function(keys, args)
    local key = keys[1]
    local value = redis.call('GET', key)
    redis.call('DEL', key)
    return value
end)
"""
r.function_load(function_code, replace=True)

# 调用Function
result = r.fcall('get_and_delete', 1, 'mykey')
print(result)

五、Redis最佳实践

1. 键名设计

  • 用冒号分隔,如user:1、order:100
  • 不要太长,节省内存
  • 不要太短,提高可读性
  • 统一命名规范

2. 过期时间

  • 缓存一定要设置过期时间
  • 不要让数据无限增长
  • 合理设置过期时间,不要太长也不要太短

3. 内存管理

  • 设置maxmemory,限制最大内存
  • 配置淘汰策略(allkeys-lru推荐)
  • 定期清理无用数据
  • 监控内存使用

配置:

maxmemory 2gb
maxmemory-policy allkeys-lru

4. 持久化

  • 重要数据用AOF
  • 可以同时用RDB和AOF
  • 定期备份
  • 测试恢复流程

5. 安全

  • 绑定内网IP,不要暴露公网
  • 设置密码(requirepass)
  • 用ACL控制权限
  • 禁用危险命令(FLUSHALL、KEYS等)

配置:

bind 127.0.0.1
requirepass yourpassword
rename-command FLUSHALL ""
rename-command KEYS ""

6. 性能优化

  • 用pipeline批量操作
  • 避免大key(超过10KB的value)
  • 避免热key(单个key访问量太大)
  • 用连接池
  • 合理选择数据结构

六、常见问题

1. Redis和Memcached的区别?

  • Redis支持更多数据结构
  • Redis支持持久化
  • Redis支持集群
  • Redis功能更丰富
  • Memcached更简单,纯缓存

2. Redis是单线程还是多线程?

  • 命令执行是单线程的
  • 6.0之后,网络IO是多线程的
  • 持久化、集群同步等是多线程的
  • 单线程避免了锁的开销,速度快

3. Redis为什么快?

  • 基于内存,读写速度快
  • 单线程,避免锁竞争
  • IO多路复用,高并发
  • 高效的数据结构
  • C语言实现,性能高

4. Redis的数据会丢失吗?

  • 如果不开启持久化,重启会丢失
  • 开启RDB,可能丢失最后一次快照之后的数据
  • 开启AOF,最多丢失1秒的数据
  • 同时开启RDB和AOF,最安全

5. Redis集群怎么选?

  • 数据量小,用主从+哨兵
  • 数据量大,用Redis Cluster
  • 云环境,可以用云厂商的Redis服务

七、学习资源

1. 官方文档

  • Redis官网:https://redis.io
  • Redis文档:https://redis.io/docs
  • Redis命令参考:https://redis.io/commands

2. 书籍

  • 《Redis设计与实现》:深入理解Redis原理
  • 《Redis开发与运维》:实战指南
  • 《Redis实战》:入门好书

3. 在线课程

  • 各大平台的Redis教程
  • Redis官方教程
  • 技术博客和文章

八、写在最后

Redis 7.0是一个重要的版本,带来了很多新特性。Redis Functions、ACL改进、多部分AOF、集群改进、命令改进……这些新特性,让Redis更强大、更灵活、更安全。

如果你是Redis新手,建议从基础开始,先掌握基本数据结构和常用命令,再深入学习高级特性。如果你已经在用Redis,建议升级到7.0,体验新特性。

Redis是一个强大的工具,用好了能大幅提升系统性能。但也要注意,它不是银弹,要根据实际场景选择。

2022年了,Redis已经发展到7.0,功能越来越丰富,性能越来越强。不管是做缓存、做数据库、做消息队列,Redis都能胜任。

最后,用一句话总结:"Redis 7.0,更强大、更灵活、更安全。从基础开始,逐步深入,你也能成为Redis高手。"

愿你用好Redis,让你的系统更快更稳。