python中redis包操作数据库的教程


Posted in Python onApril 19, 2022

一、安装

  • redis 是一个 Key-Value 数据库
  • Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希类型)等类型
pip install redis

二、连接

import redis

# 方式一
r = redis.StrictRedis(host='localhost', port=6379, db=0)

# 方式二
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 方式三,连接池
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

三、string基本命令

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 设置值并设置过期时间, ex单位: 秒
r.set('food', 'mutton', ex=3)
# 获取值
r.get('food')
# 设置值并设置过期时间, px单位: 毫秒
r.set('food', 'beef', px=3)
# nx=True时,则只有name不存在时,当前set操作才执行
r.set('fruit', 'watermelon', nx=True)
# xx=True时,则只有name存在时,当前set操作才执行
r.set('fruit', 'watermelon', xx=True)
# setnx设置值,只有name不存在时,执行设置操作
r.setnx('fruit1', 'banana')
# setex第一个参数是key,第二个是过期时间(秒),第三个是值
r.setex("fruit2", 5, "orange")
# psetex第一个参数是key,第二个是过期时间(毫秒),第三个是值
r.psetex("fruit3", 5000, "apple")
# 批量设置值 mset(*args, **kwargs)
r.mset(k1="v1", k2="v2")
# 批量获取
r.mget('k1', 'k2')
r.mget(['k1', 'k2'])
# 设置新值并获取原来的值
r.getset("food", "barbecue")
# 获取子序列(根据字节获取,非字符)
r.getrange("cn_name", 0, 2)
r.getrange("en_name", 0, -1)
# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
r.setrange("en_name", 1, "ccc")
# 对 name 对应值的二进制表示的位进行操作
r.setbit(name, offset, value)
# 获取name对应的值的二进制表示中的某位的值,0或1
r.getbit("foo1", 0)
# 获取name对应的值的二进制表示中 1 的个数
r.bitcount("foo",0,1)
# 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值
r.bitop("AND","new","foo","foo1")
# 返回name对应值的字节长度(一个汉字3个字节)
r.strlen("foo")
# 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。
r.incr("foo", amount=1)
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
r.incrbyfloat("foo1", amount=2.0)
# 自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。
r.decr("foo4", amount=3)
# 在redis name对应的值后面追加内容
r.append("name", "haha")

四、hash基本命令

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
r.hset("hash1", "k1", "v1")
# 在name对应的hash中批量设置键值对
r.hmset("hash2", {"k2": "v2", "k3": "v3"})
# 在name对应的hash中获取根据key获取value
r.hmget("hash2", "k2", "k3")
r.hmget("hash2", ["k2", "k3"])
# 取出所有的键值对
r.hgetall("hash1")
# 得到所有键值对的格式 hash长度
r.hlen("hash1")
# 得到所有的keys(类似字典的取所有keys)
r.hkeys("hash1")
# 得到所有的value(类似字典的取所有value)
r.hvals("hash1")
# 判断成员是否存在(类似字典的in)
r.hexists("hash1", "k4")
# 删除键值对
r.hdel("hash1", "k1")
# 自增自减整数
r.hincrby("hash1", "k3", amount=-1)
# 自增自减浮点数
r.hincrbyfloat("hash1", "k5", amount=-1.0)
# 取值查看--分片读取
r.hscan("hash1")
# 利用yield封装hscan创建生成器,实现分批去redis中获取数据
for item in r.hscan_iter('hash1'):
print(item)
print(r.hscan_iter("hash1"))

五、list基本命令

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 增加 (从左边新增加)--没有就新建
r.lpush("list1", 11, 22, 33)
# 增加(从右边增加)--没有就新建
r.rpush("list2", 11, 22, 33)
# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
r.lpushx("list10", 10)
# 往已经有的name的列表的右边添加元素,没有的话无法创建
r.rpushx("list2", 99)
# 在name对应的列表的某一个值前或后插入一个新值
r.linsert("list2", "before", "11", "00")
# 修改(指定索引号进行修改)
r.lset("list2", 0, -11)
# 删除(指定值进行删除)
r.lrem("list2", "11", 1)
# 删除并返回
r.lpop("list2") # 删除列表最左边的元素,并且返回删除的元素
r.rpop("list2") # 删除列表最右边的元素,并且返回删除的元素
# 删除索引之外的值
r.ltrim("list2", 0, 2)
# 根据索引号取值
r.lindex("list2", 0)
# 移动 元素从一个列表移动到另外一个列表
r.rpoplpush("list1", "list2")
# 移动 元素从一个列表移动到另外一个列表 可以设置超时
r.brpoplpush("list1", "list2", timeout=2)
# 一次移除多个列表
r.blpop(["list10", "list11"], timeout=2)
# 自定义增量迭代
def list_iter(name):
"""
自定义redis列表增量迭代
:param name: redis中的name,即:迭代name对应的列表
:return: yield 返回 列表元素
"""
list_count = r.llen(name)
for index in range(list_count):
yield r.lindex(name, index)

六、set基本命令

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 新增
r.sadd("set1", 33, 44, 55, 66)
# 获取元素个数 类似于len
r.scard("set1")
# 获取集合中所有的成员
r.smembers("set1")
# 获取集合中所有的成员--元组形式
r.sscan("set1")
# 获取集合中所有的成员--迭代器的方式
for i in r.sscan_iter("set1"):
print(i)
# 差集
r.sdiff("set1", "set2")
# 差集--差集存在一个新的集合中
r.sdiffstore("set3", "set1", "set2")
# 交集
r.sinter("set1", "set2")
# 交集--交集存在一个新的集合中
r.sinterstore("set3", "set1", "set2")
# 并集
r.sunion("set1", "set2")
# 并集--并集存在一个新的集合
r.sunionstore("set3", "set1", "set2")
# 判断是否是集合的成员 类似in
r.sismember("set1", 33)
# 移动 将某个成员从一个集合中移动到另外一个集合
r.smove("set1", "set2", 44)
# 删除--随机删除并且返回被删除值
r.spop("set2")
# 删除--指定值删除
r.srem("set2", 11)

七、zset基本命令

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 新增
r.zadd("zset2", 'm1', 22, 'm2', 44)
# 获取有序集合元素个数 类似于len
r.zcard("zset1")
# 获取有序集合的所有元素
r.zrevrange("zset1", 0, -1)
# 获取所有元素--迭代器
for i in r.zscan_iter("zset3"): # 遍历迭代器
print(i)
# 获取name对应的有序集合中分数 在 [min,max] 之间的个数
r.zcount("zset3", 11, 22)
# 自增
r.zincrby("zset3", "n2", amount=2)
# 获取值的索引号
r.zrank("zset3", "n1")
# 删除--指定值删除
r.zrem("zset3", "n3")
# 删除--根据排行范围删除,按照索引号来删除
r.zremrangebyrank("zset3", 0, 1)
# 删除--根据分数范围删除
r.zremrangebyscore("zset3", 11, 22)
# 获取值对应的分数
r.zscore("zset3", "n27")

八、其他通用命令

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 删除 根据删除redis中的任意数据类型
r.delete("gender")
# 检查名字是否存在
r.exists("zset1")
# 模糊匹配 根据模型获取redis的name
r.keys("foo*")
# 设置超时时间
r.expire("list5", time=3)
# 重命名
r.rename("list5", "list5-1")
# 随机获取name
r.randomkey()
# 获取类型
r.type("set1")
# 查询所有的Key
r.keys()
# 当前redis包含多少条数据
r.dbsize()
# 清空r中的所有数据
r.flushdb()

九、管道命令

  • redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作
  • 如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令
  • 并且默认情况下一次pipline 是原子性操作
  • 管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类
  • 它通过减少服务器-客户端之间反复的TCP数据库包
  • 从而大大提高了执行批量命令的功能
import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 默认的情况下,管道里执行的命令可以保证执行的原子性
# 默认 pipe = r.pipeline(transaction=True)
# 禁止 pipe = r.pipeline(transaction=False)

# 创建一个管道
pipe = r.pipeline()

pipe.set('name', 'jack')
pipe.set('role', 'sb')
pipe.sadd('faz', 'baz')
pipe.incr('num')
pipe.execute()

# 或者写成 pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()

print(r.get("name"))
print(r.get("role"))
print(r.get("num"))

到此这篇关于python 包 redis 数据库的操作教程的文章就介绍到这了!

Python 相关文章推荐
Python入门篇之对象类型
Oct 17 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
python实现换位加密算法的示例
Oct 14 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
Python读取JSON数据操作实例解析
May 18 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
Python echarts实现数据可视化实例详解
Mar 03 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 Python
python中pymysql包操作数据库方法
Apr 19 #Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 #Python
python中urllib包的网络请求教程
Apr 19 #Python
python APScheduler执行定时任务介绍
Apr 19 #Python
Python数据可视化之Seaborn的安装及使用
python 闭包函数详细介绍
Apr 19 #Python
Python  lambda匿名函数和三元运算符
Apr 19 #Python
You might like
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
zend framework重定向方法小结
2016/05/28 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
我的javascript 函数链之演变
2011/04/07 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
python fabric实现远程操作和部署示例
2014/03/25 Python
Python3基础之list列表实例解析
2014/08/13 Python
python中退出多层循环的方法
2018/11/27 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
高一自我鉴定
2013/12/17 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸
小程序实现侧滑删除功能
2022/06/25 Javascript