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-cli2. 基本数据结构
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 23. 常用命令
- 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 LISTFunctions的优势:
- 应用启动时不需要加载脚本
- 多个客户端可以共享Function
- 可以版本管理,方便升级
- 性能更好
2. ACL改进
Redis 6.0引入了ACL(访问控制列表),7.0做了改进。
新特性:
- 支持按命令类别授权
- 支持key前缀授权
- 支持更细粒度的权限控制
- ACL日志记录
创建用户:
# 创建用户,只能访问以user:开头的key
ACL SETUSER user1 on >password1 ~user:* +@all
# 查看用户
ACL LIST
# 删除用户
ACL DELUSER user1ACL改进后,权限控制更灵活,更安全。
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 yes4. 集群改进
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:
# 从数据库查询
# 然后写入缓存
pass2. 用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-lru4. 持久化
- 重要数据用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,让你的系统更快更稳。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录