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 Requests安装与简单运用
Apr 07 Python
python实现kNN算法
Dec 20 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
Python异常处理操作实例详解
May 10 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
python删除文件、清空目录的实现方法
Sep 23 Python
python实现网络五子棋
Apr 11 Python
教你用python实现一个无界面的小型图书管理系统
May 21 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
详解PHP中的PDO类
2015/07/06 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
2011/04/28 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
python ip正则式
2009/05/07 Python
Golang与python线程详解及简单实例
2017/04/27 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
详解Python的三种可变参数
2019/05/08 Python
python之拟合的实现
2019/07/19 Python
python lambda的使用详解
2021/02/26 Python
super关键字的用法
2012/04/10 面试题
民警个人对照检查剖析材料
2014/09/17 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
初中生物教学随笔
2015/08/15 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL