文章目录

  • redis-py常用的操作指令
    • 创建连接池
    • 字符串类型
    • 列表类型
    • 集合类型
    • 哈希类型
  • 利用redis缓存学生成绩
  • redis事务机制
  • 缓存观众投票数据信息案例
  • 线程池简单案例
  • 模拟秒杀

学习目标

  1. 掌握redis-py的连接池
  2. 掌握redis-py模板的CURD操作
  3. 掌握redis-py模块管理事务
  4. 完成具体的Redis案例

redis-py常用的操作指令

创建连接池

# -*- encoding: utf-8 -*-
"""
@File    : redis_db.py
@Time    : 2021-08-23 15:52
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
import redis
try:pool = redis.ConnectionPool(host = "localhost",port = 6379,db = 0,max_connections = 20)
except Exception as e:print(e)

字符串类型

# -*- encoding: utf-8 -*-
"""
@File    : example_1.py
@Time    : 2021-08-23 15:51
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
from redis_db import pool
import rediscon = redis.Redis(connection_pool = pool
)con.set("country", "英国")
con.set("city", "伦敦")
city = con.get("city").decode("utf-8")
con.expire("city", 5) #过期时间五秒钟print(city)
del  con
# -*- encoding: utf-8 -*-
"""
@File    : example_2.py
@Time    : 2021-08-23 16:28
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
from redis_db import pool
import redis#获得一个连接
con = redis.Redis(connection_pool = pool
)try:con.delete("country", "city")con.mset({"country":"德国","city":"柏林"})result = con.mget("country","city")for one in result:print(one.decode("utf-8"))
except Exception as e:print(e)
finally:del con

列表类型

# -*- encoding: utf-8 -*-
"""
@File    : example_3.py
@Time    : 2021-08-23 19:19
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
from redis_db import pool
import rediscon = redis.Redis(connection_pool = pool
)try:con.rpush("dname","董事会","秘书处","财务部","技术部")con.lpop("dname")result = con.lrange("dname", 0, -1)for one in result:print(one.decode("utf-8"))
except Exception as e:print(e)
finally:del con

集合类型

# -*- encoding: utf-8 -*-
"""
@File    : example_4.py
@Time    : 2021-08-23 20:14
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
from redis_db import pool
import rediscon = redis.Redis(connection_pool = pool
)
try:con.sadd("employee",8001,8002,8003)con.srem("employee",8002)result = con.smembers("employee")for one in result:print(one.decode("utf-8"))con.zadd("keyword",{"马云":0,"张朝阳":0,"丁磊":0})con.zincrby("keyword",10,"马云")result = con.zrevrange("keyword",0,-1)for one in result:print(one.decode("utf-8"))
except Exception as e:print(e)
finally:del con
8001
8003
马云
张朝阳
丁磊

哈希类型

# -*- encoding: utf-8 -*-
"""
@File    : example_5.py
@Time    : 2021-08-23 20:49
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
from redis_db import pool
import rediscon = redis.Redis(connection_pool = pool
)try:con.hmset("9527",{"name:":"scott","sex":"male","age":35})con.hset("9527","city","纽约")con.hdel("9527","age")result = con.hexists("9527","sex")print(result)result = con.hgetall("9527")# for one in result:#     print(one.decode("utf-8"), result[one].decode("utf-8"))for k, v in result.items():print(k.decode("utf-8"), v.decode("utf-8"))
except Exception as e:print(e)
finally:del  con
True
name: scott
sex male
city 纽约

利用redis缓存学生成绩

# -*- encoding: utf-8 -*-
"""
@File    : example_8.py
@Time    : 2021-08-24 13:49
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
#练习1,从txt文档中解析学生的信息,把考试语数外成绩超过85分的同学信息缓存到哈希表中
from redis_db import pool
import rediscon = redis.Redis(connection_pool = pool
)try:file = open(file = "chengji.txt",mode = "r", encoding = "utf-8")data = file.read().splitlines()#元组for one in data:temp = one.split(",")sid = temp[0]name = temp[1]classno = temp[2]score_1 = int(temp[3])score_2 = int(temp[4])score_3 = int(temp[5])if score_1 >= 85 and score_2 >= 85 and score_3 >= 85:con.hmset(sid, {"name":name,"classno":classno,"score_1":score_1,"score_2":score_2,"score_3":score_3})except Exception as e:print(e)
finally:if "file" in dir():file.close()del  con

redis事务机制

  1. redis事务机制为了什么?为了在并发执行时,被别的客户端的命令插队。事务机制就为了解决这个插队执行的问题。
    2.为了实现数据的一致性 在开启事务之前务必需要用watch命令监视要操作的记录,如果数据被别的客户端修改了则该事务关闭。满足了数据的一致性。
# -*- encoding: utf-8 -*-
"""
@File    : example_7.py
@Time    : 2021-08-24 11:35
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
#redis用pipline(管道)的方式向redis服务器传递批处理命令和执行事务
from redis_db import pool
import rediscon = redis.Redis(connection_pool = pool
)try:pipline = con.pipeline()pipline.watch("9527")pipline.multi()pipline.hset("9527","name","jack")pipline.hset("9527","age",23)pipline.execute()except Exception as e:print(e)
finally:if "pipline" in dir():pipline.reset()del con

缓存观众投票数据信息案例

# -*- encoding: utf-8 -*-
"""
@File    : example_6.py
@Time    : 2021-08-23 21:05
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
#用python程序模拟300位观众,为5位嘉宾随机投票,最后按照降序排列结果
from redis_db import pool
import redis
import randomcon = redis.Redis(connection_pool = pool
)try:con.delete("ballot")con.zadd("ballot",{"马云":0,"丁磊":0,"张朝阳":0,"马化腾":0,"李彦宏":0})names = ["马云","丁磊","张朝阳","马化腾","李彦宏"]for i in range(0, 300):num = random.randint(0,4)name = names[num]con.zincrby("ballot", 1 , name)result = con.zrevrange("ballot",0, -1, "WITHSCORES")#希望得到元组值和分数值要加上"WITHSCORES"for one in result:print(one[0].decode("utf-8"), int(one[1]))
except Exception as e:print(e)
finally:del con
丁磊 71
李彦宏 60
张朝阳 60
马化腾 57
马云 52

线程池简单案例

# -*- encoding: utf-8 -*-
"""
@File    : example_9.py
@Time    : 2021-08-24 16:33
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
from  concurrent.futures import ThreadPoolExecutordef say_hello():print("hello")excutor = ThreadPoolExecutor(50)
for i in range(0, 10):excutor.submit(say_hello)
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello

模拟秒杀

redis事务机制为了什么?为了在并发执行时,被别的客户端的命令插队。事务机制就为了解决这个插队执行的问题。为了实现数据的一致性 在开启事务之前务必需要用watch命令监视要操作的记录,如果数据被别的客户端修改了则该事务关闭。满足了数据的一致性。

# -*- encoding: utf-8 -*-
"""
@File    : example_10.py
@Time    : 2021-08-24 18:14
@Author  : XD
@Email   : gudianpai@qq.com
@Software: PyCharm
"""
#利用python多线程模拟商品秒杀活动,不可以出现超买和超卖的情况,假设A商品有50件参与秒杀活动,10分钟秒杀自动结束
import redis
from redis_db import pool
import random
from concurrent.futures import ThreadPoolExecutor
#生成用户ID
id = set()
while True:if len(id) == 1000:breaknum = random.randint(10000,100000)id.add(num)con = redis.Redis(connection_pool = pool
)try:con.delete("kill_total", "kill_num", "kill_flag", "kill_user")con.set("kill_total", 50)con.set("kill_num", 0)con.set("kill_flag", 1)con.expire("kill_flag", 10)except Exception as e:print(e)
finally:del con#线程池
executor = ThreadPoolExecutor(200)def buy():connection = redis.Redis(connection_pool = pool)pipline = connection.pipeline()try:if connection.exists("kill_flag") == 1:pipline.watch("kill_num", "kill_user",)total = int(pipline.get("kill_total").decode("utf-8"))num = int(pipline.get("kill_num").decode("utf-8"))if num < total:pipline.multi()pipline.incr("kill_num")user_id = id.pop()pipline.rpush("kill_user", user_id)pipline.execute()except Exception as e:print(e)finally:if "pipline" in dir():pipline.reset()del connectionfor i in range(0, 1000):executor.submit(buy)
print("秒杀已经结束")


Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
Watched variable changed.
秒杀已经结束
Too many connections
Too many connections
Too many connections
Too many connections
Too many connections

004redis与python的交互相关推荐

  1. C++程序员学Python:C与Python进行交互

    1.C调用python 其实C与python的交互很简单,最简单的就是下面的例子: 1 Py_Initialize(); 2 3 PyRun_SimpleString("str = \&qu ...

  2. python入门(一):进入python的交互模式、pip的使用和数据类型

    环境安装: https://www.python.org/ pycharm 社区版路径: http://www.jetbrains.com/pycharm/download/download-than ...

  3. C++和Python的交互

    C++和Python的交互 Python和C++的交互分为这两种情况 用C++扩展Python 将Python内嵌入C++ Boost.Python 安装 用C++实现一个模块,在Python中调用 ...

  4. 第一节、Alex 讲解 python+mysql 交互;

    Python Mysql 交互 A.Alex 的语法展示: import MySQLdb try: conn=MySQL.connect(host='localhost',user='root',pa ...

  5. python硬件交互_对Python的交互模式和直接运行.py文件的区别详解

    对Python的交互模式和直接运行.py文件的区别详解 看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下. 在命令行模式下,可以执行p ...

  6. python 调用控制台_如何使用Python的交互控制台

    简介 Python的交互控制台(也叫做Python解释器,或是Python Shell)为程序员提供了"运行指令"和"不创建文件测试测试代码"的快速途径. 交互 ...

  7. 怎样退出python的交互环境_python交互界面的退出方法

    运行python程序turtle画图,cmd的方式,画完成之后能解决在cmd中运行结束后自动关闭的问题吗? python不关闭控制台的 Python在交互环境敲代码时怎么换行,每次一按EnterPyt ...

  8. Python命令交互行代码清空

    在使用python命令交互界面时,调试代码比较多时可以使用命令清除命令交互界面的代码,命令如下: >>>import OS >>>_ = os.system('cl ...

  9. 【PySimpleGUI】Python用户交互图形界面开发(3)

    目录 前言 一.通过列表索引获取窗口返回值 二.通过字典的键获取返回值 前言 上一篇文章介绍了窗口关闭,按钮点击以及其他元素事件.[PySimpleGUI]Python用户交互图形界面开发(2) 这篇 ...

最新文章

  1. mysql数据库约束无符号_mysql 数据类型 约束条件
  2. AXI4总线协议的发展历史
  3. 【ubuntu】ubuntu18.04:在处理时有错误发生:ufw E: Sub-process /usr/bin/dpkg returned an error code (1)
  4. MySQL事务处理与事务隔离(锁机制)
  5. 360安全路由器v2处理器_您的路由器有多不安全?
  6. Octave入门基础
  7. 交换机putty怎么调试_弱电工程视频监控系统设计、安装、调试、维护全过程讲解...
  8. 使用cdn和npm引入的区别_中央空调和新风系统有什么区别?有必要一起装吗?
  9. C语言 strftime 格式化显示日期时间 时间戳
  10. 关于一个flask的服务接口实战(flask-migrate,flask-script,SQLAlchemy)
  11. 函数名的使用-闭包-迭代器
  12. 得寸进尺的摩根大通 步步为营
  13. 安装magicdrawUML出现的问题
  14. Qt阅读器-ofd格式
  15. 量产软件测试培训,U盘量产及在虚拟机中测试
  16. c语言json数据解析,C语言库函数解析JSON文件
  17. 《东周列国志》第三十七回 介子推守志焚绵上 太叔带怙宠入宫中
  18. 树莓派迅雷远程下载 | 树莓派小无相系列 1
  19. 人工智能真的要取代人类了?
  20. 谈莉娜,也被淘汰,社会真是太黑暗了,哎!

热门文章

  1. Spring Boot热部署
  2. java代码生成器_java代码生成器怎么用
  3. android module中获取 app_Android模块化中的服务发现机制
  4. ik分词和jieba分词哪个好_Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考...
  5. rocketmq存储结构_rocketMq高性能存储设计
  6. 【英语学习】【English L06】U04 Adventure L6 My favorite tourist destination
  7. Intel Core Enhanced Core架构/微架构/流水线 (3) - 流水线概述
  8. 杭电计算机组成实验2(二)超前进位加法器设计实验
  9. 数论只会 for 循环 (数学+分块+记忆化)
  10. jedis-2.4.1 中的JedisPoolConfig没MaxActive属性