纯干货·手把手带敲实训课
敲出你的第一行缓存代码,让数据飞起来!
在 Windows 安家落户
安装 Redis 与 Python 驱动
打破次元壁
用 Python 连通 Redis 数据库
边学边练增删改查
String / List / Hash 实操
主从/哨兵模式的 Python 玩法
电商场景综合大练兵
工欲善其事,必先利其器
在你的 Windows 电脑上把 Redis 跑起来
官方 Redis 主要支持 Linux。但在学习阶段,我们可以使用微软提供的 Windows 移植版。
Redis-x64-3.2.100.zip 压缩包下发到大家的桌面上。D盘 根目录,将文件夹重命名为 Redis。进入 D:\Redis 文件夹,在这个文件夹的空白处:
cmd 并回车,打开黑窗口。redis-server.exe redis.windows.conf注意:这个黑窗口绝对不能关!关了数据库就停了!
数据库跑起来了,接下来要让我们的 Python 具备和 Redis 沟通的能力。
在 PyCharm 底部找到 Terminal 选项卡,输入以下命令安装 redis-py 库:
大家动起手来,看到 Successfully installed 就代表安装成功了!
打通代码与数据的桥梁
测试连接与连接池配置实战
在 Python 中,我们使用 redis.StrictRedis 类来创建连接对象。你需要告诉它四大关键参数:
目标 IP 地址。连我们自己电脑,固定写 '127.0.0.1' 或者 'localhost'。
端口号。Redis 的默认大门永远是 6379。(必须是数字格式)
数据库编号。Redis 默认自带 16 个房间(0-15),我们今天都在 0 号房间玩。
必须设为 True!这样取出来的数据才是正常的中文/英文,而不是乱码一样的字节码(bytes)。
新建一个 Python 文件叫 demo01_connect.py,跟着老师敲下这几行代码:
预期结果:控制台如果打印出 连接测试结果: True,恭喜你,桥搭好了!
上一步我们是“直连”。在企业开发中,我们绝对不会用直连!
如果 1000 个用户同时访问网页,每个请求都去执行一次连接操作,就像 1000 个人同时买新自行车出门,太慢且浪费内存。
连接池(ConnectionPool):一次性买好 10 辆自行车放在池子里。
新建 demo02_pool.py,以后我们所有的操作,都基于这个连接池模板来写。
数据结构编程实操 (核心重点)
把理论课学过的增删改查,结合真实业务场景全部敲出来!
String 是 Redis 最基础的数据结构,可以存文本、数字、或者 JSON 格式的字符串数据。
| 方法名 | 作用 | 举例 (Python代码) |
|---|---|---|
| set(name, value) | 增 / 改:存入一个键值对 | client.set('age', 18) |
| get(name) | 查:获取指定键的值 | client.get('age') |
| setex(name, time, val) | 带过期时间的存入(常用于验证码) | client.setex('code', 60, '1234') |
场景:用户注册时,下发一个 10 秒过期的验证码。新建 demo03_string.py,先复制之前的连接池代码作为开头。
如果我们要统计一篇文章的浏览量,每次有人看,数字就 +1。如果用传统数据库,几万人同时点开,数据库会卡死。
但在 Redis 中,String 提供了专门的 自增 (INCR) 和 自减 (DECR) 命令,速度极快,绝不会算错!
不管你存的是 String、List 还是 Hash,它们都有一个“键名 (Key)”。我们要学会如何管理这些键。
| 方法名 | 作用说明 | 实战场景 |
|---|---|---|
| exists(name) | 查:判断这个键存不存在(返回 1 存在,0 不存在) | 防重提交、判断用户是否已登录 |
| ttl(name) | 查:查看这个键还有多少秒过期 | 给用户显示“支付倒计时还剩 X 秒” |
| expire(name, time) | 改:给一个已经存在的键,强行加上过期时间 | 用户操作后,延长他的登录状态 |
| delete(*names) | 删:终极删除术,直接抹除数据 | 用户注销、清空购物车缓存 |
List 是一个有顺序的队伍。最适合用来做“排队抢购”、“消息队列”、“最新文章列表”。
| 方法名 | 作用 | 举例 |
|---|---|---|
| lpush(name, *values) | 增:从左边(队头)塞入数据 | client.lpush('queue', 'A', 'B') |
| rpop(name) | 删/查:从右边(队尾)弹出一个数据 | client.rpop('queue') |
| lrange(name, start, end) | 查:获取指定范围的元素集合 | client.lrange('queue', 0, -1) (0到-1表示全部) |
| llen(name) | 查:看队伍里还有几个人 | client.llen('queue') |
场景:食堂排队,同学 A、B、C 依次排队,食堂大妈依次给队伍最前面的人打饭。新建 demo04_list.py。
Hash 特别像 Python 里的“字典(dict)”。一个键(key)里面,包着很多个属性(field)和值(value)。最适合存对象(比如一个商品的所有属性)。
| 方法名 | 作用 | 举例 |
|---|---|---|
| hset(name, mapping=dict) | 增:一次存入对象内的多个属性。 | client.hset('user1', mapping={'age':18}) |
| hget(name, key) | 查:只获取对象的某一个特定属性 | client.hget('user1', 'age') |
| hgetall(name) | 查:一口气获取对象的所有属性 | client.hgetall('user1') (返回字典) |
场景:我们要存李四的档案,并且要在不影响名字的前提下,单独修改他的成绩,并删除不必要的属性。
Set 就像一个神奇的口袋,它有两个特点:
1. 无序(丢进去的东西顺序全乱);
2. 绝对不重复(相同的放进去也会自动变成一个)。
非常适合用来做:共同好友计算、用户画像打标签、或者抽奖盒子!
| 方法名 | 作用 |
|---|---|
| sadd(name, *vals) | 增:往口袋里扔元素 |
| smembers(name) | 查:把口袋底朝天,看所有元素 |
| sismember(name, val) | 查:判断某人是否在口袋里 |
| srem(name, *vals) | 删:把某个人从口袋里踢出去 |
场景:用户给文章点赞,一个人只能点赞一次,重复点赞无效。用 Set 解决最完美!
ZSet 是 Redis 最强大、最独特的数据结构!它不仅能像 Set 一样保证元素不重复,还能给每个元素关联一个分数 (Score),并自动按分数排好名次。
| 方法名 | 作用 | 举例 |
|---|---|---|
| zadd(name, mapping=dict) | 增/改:添加成员及其分数。如果成员已存在,则更新分数。 | client.zadd('rank', {'Alice': 90}) |
| zrevrange(name, start, end) | 查:从大到小获取排名范围内的成员。(例如前三名) | client.zrevrange('rank', 0, 2) |
| zscore(name, value) | 查:获取某个特定成员的具体分数。 | client.zscore('rank', 'Alice') |
场景:王者荣耀大本营,我们需要实时更新玩家的战斗力,并立刻提取出全服前 3 名的大神!
架构进阶:代码如何应对企业级集群?
理论结合实战:当 Redis 不是单机时,我们的代码该怎么变?
理论课讲过“主从复制”,现在我们在 Windows 上自己开一个主从架构:1个老板(主),1个助理(从)。
D盘,把整个 Redis 文件夹复制并粘贴一份,改名叫 Redis-Slave。Redis-Slave 文件夹,找到 redis.windows.conf 文件,用记事本打开。Ctrl+F 搜索 port 6379,把它改成 port 6380 (助理不能占老板的工位)。slaveof,在下方空白处加一行核心配置:cmd,输入 redis-server.exe redis.windows.conf 启动从节点。新建 demo06_master_slave.py。我们测试一下:给老板发数据,能不能从助理那里读出来?如果往助理那里强行塞数据会怎样?
理论课讲过,哨兵负责在主节点死掉时,自动把从节点提拔为主节点。
问题来了:既然主节点IP随时可能因为故障而改变,我们的 Python 代码该连哪个 IP 呢?
代码不再直连 Redis,而是先去连哨兵集群。
问哨兵:“现在的 Master 是谁?”,拿到最新的 IP 后,代码再去操作实际的 Redis 节点。
Cluster 模式下有 16384 个哈希槽分布在很多台服务器上。
你不需要在代码里自己算哈希槽,Python 驱动已经非常聪明地把这一切封装好了。
你只要把集群里部分或全部的节点IP告诉它,它在内部就会自动管理连接和路由重定向(MOVED)。操作起来和单机版几乎一模一样。
双十一电商后台模拟练兵
把前面学到的知识融会贯通,独立完成以下任务!
你是公司的大数据开发工程师,现在距离双十一还有10分钟,你需要编写一个完整的 Python 脚本 ecommerce_task.py,完成以下三个核心业务的数据缓存操作。请利用连接池来管理连接。
coupon:code 的值设为 "VIP888",并设置 30秒 后过期。
order:queue,依次从队尾(左侧)推入三个订单号:"OD-001", "OD-002", "OD-003"。然后模拟处理系统,从队头(右侧)弹出一个订单并打印出来。
product:1001,里面包含:品牌(brand)为"华为",库存(stock)为 500。存入后,读取出它的库存并打印。
如果觉得无从下手,可以参考这个脚手架框架,把 # TODO 的部分补全即可!
恭喜大家!今天你们不仅在 Windows 上亲手搭建了 Redis,还用 Python 掌握了高频面试考点:连接池、字符串、列表、哈希,甚至感受了主从架构的读写分离操作。
记得把刚才挑战题的 `.py` 代码文件提交到学习通作为本节作业哦!下课!