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 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
Python的另外几种语言实现
Jan 29 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
使用C++扩展Python的功能详解
Jan 12 Python
Python 实现12306登录功能实例代码
Feb 09 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
如何利用Boost.Python实现Python C/C++混合编程详解
Nov 08 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
pandas如何处理缺失值
Jul 31 Python
python 直接赋值和copy的区别详解
Aug 07 Python
python打包生成so文件的实现
Oct 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 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009/01/30 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
基于php 随机数的深入理解
2013/06/05 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
Python中字符串对齐方法介绍
2015/05/21 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
python操作列表的函数使用代码详解
2017/12/28 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
python实现猜单词游戏
2020/05/22 Python
喷漆工的岗位职责
2014/03/17 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
学校中秋节活动总结
2015/03/23 职场文书
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技