一、认识RedisRedis 是一个内存数据库常用于缓存和高性能数据存储。特点数据存储在内存读写速度快毫秒级甚至微秒级支持多种数据结构String、Hash、List、Set、Sorted SetZSet支持过期时间TTL可以当作缓存支持 Pub/Sub 发布/订阅适合实时消息通俗来讲 Redis 就是一个超级升级版的键值对结构。二、安装Redis推荐使用Docker安装方便快捷没有Docker可以访问官网Docker: Accelerated Container Application Development选择对应安装包进行下载。需要注意的是启动 Redis 容器是运行在 Docker 引擎上的因此 Docker 程序不能退出退出则所有容器都会关闭。打开终端执行以下命令# 拉取最新 Redis 镜像dockerpull redis:latest# 启动 Redis 容器映射本地 6379 端口dockerrun-d--namemy_redis-p6379:6379 redis# 测试 Redis 是否启动redis-cliping# 正常输出 PONGdocker run用来创建并启动容器-d代表在后台运行--name my_redis指定容器名字-p 6379:6379端口映射本地 6379 连 Redis的6379redis使用官方 Redis 镜像。三、终端使用Redis1. 找容器继续在终端执行docker ps可以查看正在运行的 Redis 容器:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc123456789 redisdocker-…2days ago Up2days0.0.0.0-6379 my_redis在以上输出中找到IMAGE为redis的行并确认NAMES字段值和我们刚启动容器名相同。2. 查数据然后我们就可以记住容器 IDabc123456789或 容器名my_redis二选一即可一条命令直接进入 Redis 命令行客户端# 替换为你的容器名/IDdockerexec-itmy_redis redis-cli执行后会进入 Redis 交互模式提示符变为127.0.0.1:6379直接输入查询命令即可。tip1. 默认数量容器内的 Redis 默认创建16 个独立数据库编号从0到15。2. 默认数据库你连接 Redis 时默认自动进入 0 号库。3. 隔离性不同数据库之间数据完全隔离在 0 库写的 key在 1 库看不到互不干扰。2.1 基础查询命令# 1. 查看当前数据库的所有 key测试环境用生产环境禁用keys *# 2. 查看 Redis 所有数据库的 key 数量默认16个库0~15info keyspace# 3. 切换数据库比如切换到第1个库默认在 0 库select12.2 数据查询命令# 先查看某个 key 的类型typemykey# ① 字符串类型最常用Stringget mykey# ② 哈希类型存对象Hashhgetall myhash# ③ 列表类型 Listlrange mylist0-1# 0 -1 表示查看所有元素# ④ 集合类型 Setsmembers myset# ⑤ 有序集合类型 ZSetzrange myzset0-13. 删除容器 / 清空数据需求命令只清空内存数据容器保留docker exec -it my_redis redis-cli flushall只删容器数据保留docker rm -f my_redis彻底删容器 清空所有数据执行上条命令 删除 D:\my_redis-data 文件夹四、python操作 Redis在python中FastAPI推荐使用redis安装pipinstallredis连接 Redisimportredis# 连接本地 Redisrredis.Redis(hostlocalhost,port6379,db0,decode_responsesTrue)# 测试是否连接print(r.ping())# True 表示连接成功1. String 类型键值对可以理解为键值对key - value在项目中用来存用户登录 Token或游客临时数据# 设置 key过期 7 天r.set(user:session:1001,token_abc123,ex7*24*60*60)# 获取 keytokenr.get(user:session:1001)print(token)# 输出 token_abc123# 删除 keyr.delete(user:session:1001)解释user:session:1001是 key用户 ID 对应的登录会话token_abc123是 value登录令牌ex表示过期时间这里 7 天2. Hash 类型字典可以理解为字典一个 key 里存很多字段在项目中用来存用户信息数据user_id1001# 创建用户状态r.hset(fuser:state:{user_id},mapping{name:Li,status:1,age:18})# 添加伙伴列表字符串保存r.hset(fuser:state:{user_id},players,1002,1003)# 读取用户状态user_infor.hgetall(fuser:state:{user_id})print(user_info)# 输出 {name: Li,, status: 1, age: 18, players: 1002,1003}# 更新用户状态无字段顺序要求r.hset(fuser:state:{user_id},status,2)# 修改一个字段r.hset(fuser:state:{user_id},mapping{status:2,age:20,players:1001,1002,1003})# 修改多个字段3. Set 类型集合可以理解为集合无序自动去重在项目中用来存一些唯一列表数据玩家列表# 添加元素r.sadd(room:2001:players,1001)# 玩家 1001 加入房间r.sadd(room:2001:players,1002)# 玩家 1002 加入房间r.sadd(room:2001:players,1001)# 重复加入不会报错也不会重复存# 读取集合元素playersr.smembers(room:2001:players)print(players)# 输出 {1001, 1002}顺序不固定# 判断某元素是否在集合中is_inr.sismember(room:2001:players,1001)print(is_in)# True# 删除元素r.srem(room:2001:players,1002)playersr.smembers(room:2001:players)print(players)# 输出 {1001}# 获取集合长度countr.scard(room:2001:players)print(count)# 输出 14. ZSet有序集合可以理解为排行榜每个元素都有一个分数Redis 会自动排序在项目中用来存榜单数据# 添加分数r.zadd(ranking:total:score,{1001:5000,1002:4800})# 获取前 3 名top3r.zrevrange(ranking:total:score,0,2,withscoresTrue)print(top3)# 输出 [(1001, 5000), (1002, 4800)]# 查询某用户排名rankr.zrevrank(ranking:total:score,1001)print(rank1)# 排名从 1 开始解释ZSet 会按分数自动排序zrevrange从高分到低分取前 N 名5. List列表可以理解为一排排数据可以从两头操作在项目中用来做分数异步校验队列# 入队r.lpush(game:score:check:queue,1001:5000:1683900000)# 出队scorer.rpop(game:score:check:queue)print(score)# 输出 1001:5000:16839000006. Pub/Sub发布/订阅用来做实时消息广播在项目中用来聊天消息# 订阅消息频道pubsubr.pubsub()pubsub.subscribe(room:msg:2002)# 发布消息chat_msg{type:chat,userId:1001,msg:你好}r.publish(room:msg:2002,json.dumps(chat_msg))# 循环监听频道中的消息formessageinpubsub.listen():# 过滤出用户发送的消息ifmessage[type]message:# 解析 JSON 字符串datajson.loads(message[data])# 过滤出聊天消息ifdata[type]chat:print(f用户{data[userId]}:{data[msg]})解释subscribe订阅频道所有订阅者都能收到消息publish发送消息到频道实时同步房间信息五、Redis 持久化在安装 Redis 一节中我们使用docker run -d --name my_redis -p 6379:6379 redis创建并启动 Redis容器但Redis 默认数据只存在内存重启 / 宕机数据就丢所以为了不使数据丢失我们采用持久化——把内存数据保存到硬盘文件重启后自动恢复。1. Redis 的两种持久化方式1.1 RDB 快照默认开启原理定时给全量数据拍快照保存在容器内的/data目录下文件dump.rdb优点文件小、恢复速度极快、性能损耗小缺点会丢数据两次快照之间写入的数据会丢失默认规则15 分钟 1 次、5 分钟 10 次、60 秒 1 万次写入1.2 AOF 日志推荐原理记录每一条写命令实时写入容器内的/data目录下文件appendonly.aof优点数据几乎 100% 不丢失最安全缺点文件更大、恢复稍慢用法创建容器时redis-server --appendonly yes就是启动 Redis 服务并开启 AOF 持久化2. 硬盘挂载永久保存Redis 应用以上两种持久化方式数据会存放在容器内的/data目录下无论电脑重启容器重启都不会丢失。不过想让数据更加安全即把容器删掉也不会丢失就必须用-v 宿主机目录:/data把数据存在你电脑上才是真正永久保存;因此完整的AOF 挂载整理如下dockerrun-d--namemy_redis-p6379:6379-vD:\my_redis-data:/data redis redis-server--appendonlyyes