python 模块Redis模块,连接Redis数据库
off999 2024-11-04 13:16 29 浏览 0 评论
一、安装
官网:https://redis-py.readthedocs.io/en/stable/
pip install redis
二、连接数据库
- 同步连接
import redis
with redis.Redis(host='127.0.0.1',port=6379,decode_responses=True) as connect:
connect.set('test','哈哈哈哈')
print(connect.get('test'))
- 异步连接
import asyncio
import redis.asyncio as redis
async def run():
async with redis.Redis(host='127.0.0.1',port=6379,decode_responses=True) as connect:
await connect.set('test','我是异步')
result = await connect.get('test')
print(result)
asyncio.run(run())
三、连接数据库函数
- redis.Redis() 连接数据库
redis.Redis(
host='localhost', #ip地址
port=6379, #端口
db=0, #数据库,默认 0
password=None, #密码
single_connection_client=False, #True,不使用连接池
connection_pool=None, #连接池
decode_responses=False, #True时,将返回结果decode,即将bytes类型改为默认utf-8
socket_timeout=None, #响应的时间
socket_connect_timeout=None, #建立连接超时时间
retry_on_timeout=False, #True时, 命令超时后,将会重试一次, 重试成功则正常返回; 失败则抛出timeout异常;False时直接抛出异常
retry_on_error=None, #重试错误列表
max_connections=None, #最大连接数
)
- redis.asyncio.Redis() 异步连接数据库
import redis.asyncio as redis
redis.Redis(
host='localhost', #ip地址
port=6379, #端口
db=0, #数据库,默认 0
password=None, #密码
single_connection_client=False, #True,不使用连接池
connection_pool=None, #连接池
decode_responses=False, #True时,将返回结果decode,即将bytes类型改为默认utf-8
socket_timeout=None, #响应的时间
socket_connect_timeout=None, #建立连接超时时间
retry_on_timeout=False, #True时, 命令超时后,将会重试一次, 重试成功则正常返回; 失败则抛出timeout异常;False时直接抛出异常
retry_on_error=None, #重试错误列表
max_connections=None, #最大连接数
)
四、字符串操作,异步需要使用async await
- connect.set(name,value,ex=None, px=None, nx=False, xx=False) 设置值
'''
设置键和值(字符串类型)
ex - 过期时间(秒)
px - 过期时间(毫秒)
nx - 如果设置为True,则只有name不存在时,当前set操作才执行
xx - 如果设置为True,则只有name存在时,当前set操作才执行
'''
connect.set('test','哈哈哈哈')
- connect.setnx(name,value) 设置值,只有name不存在时,执行设置操作
- connect.setex(name, time, value)) 设置值,time过期时间(秒)
- connect.psetex(name, time_ms, value) 设置值,time_ms过期时间(毫秒)
- connect.mset({name1:value1,name2:value2,name3:value3,....}) 批量设置值
- connect.get(name) 获取值
- connect.mget(name1,name2,name3,.....) 批量获取值
- connect.getrange(name, start, end) 获取部分值
'''
name:键值名
start:开始index
end:结束index,不包含结束index的字符
'''
connect.set('test','哈哈哈哈')
print(connect.getrange('test', 0, 2))
- connect.getset(name,value) 设置新值,并获取旧值
- connect.setrange(name, offset, value) 从指定字符串索引offset开始,替换字符串
- connect.append(name,value) 在原有字符基础上追加字符
- connect.strlen(name) 返回name对应值的字节长度(一个汉字3个字节)
- connect.incr(name, amount=1) 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增
- connect.decr(name, amount=1) 自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减
- connect.incrby(name, amount=1) 在原有数值基础上加上一定的数值,当 name 不存在时,则创建 name=amount
- connect.decrby(name, amount=1) 在原有数值基础上减去一定的数值,当 name 不存在时,则创建 name=amount
- connect.incrbyfloat( name, amount=1.0) 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。
- connect.setbit(name, offset, value) 对 name 对应值的二进制表示的位进行操作
- connect.getbit(name,offset) 获取name对应的值的二进制表示中的某位的值 (0或1)
- connect.bitcount(key, start=None, end=None) 获取name对应的值的二进制表示中 1 的个数
五、列表操作,异步需要使用async await
- connect.lpush(name,values) 添加列表,从左边新增加
connect.lpush('test_list',1,2,3,4)
- connect.rpush(name,values) 添加列表,从右边新增加
- connect.lpushx(name,value) 向已有name的列表的左边添加元素,没有的话无法创建
- connect.rpushx(name,value) 向已有name的列表的右边添加元素,没有的话无法创建
- connect.linsert(name, where, refvalue, value) 在name对应的列表的某一个值前或后插入一个新值
'''
name - redis的name
where - BEFORE或AFTER
refvalue - 标杆值,即:在它前后插入数据
value - 要插入的数据
'''
connect.linsert('test_list','BEFORE','2','5')
- connect.lset(name, index, value) 指定索引位置重新赋值
- connect.lrem(name, value, num) 删除指定的value,num为负数时从后向前删除
- connect.lpop(name) 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
- connect.rpop() 在name对应的列表的右侧获取第一个元素并在列表中移除,返回值则是第一个元素
- connect.blpop(keys, timeout) 将多个列表排列,按照从左到右去pop对应列表的元素
- connect.brpop(keys, timeout) 将多个列表排列,按照从右到左去移除各个列表内的元素
connect.blpop(['test_list','test_list1'], timeout=2)
- connect.rpoplpush(src, dst) 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
'''
src - 要取数据的列表的 name
dst - 要添加数据的列表的 name
'''
connect.rpoplpush('test_list','test_list1')
- connect.brpoplpush(src, dst) 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
'''
src - 取出并要移除元素的列表对应的name
dst - 要插入元素的列表对应的name
timeout - 当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
'''
connect.brpoplpush('test_list','test_list1')
- connect.ltrim(name, start, end) 在name对应的列表中移除没有在start-end索引之间的值
- connect.llen(name) 获取name列表中值的数量
- connect.lindex(index) 取值(根据索引号取值)
- connect.lrange(name,start,end) 在name对应的列表中取出start-end索引之间的值,包含end
六、hash类型操作,异步需要使用async await
- connect.hset(name, key, value) 增加hash类型键值
- connect.hsetnx(name, key, value) 设置值,只有name不存在时,执行设置操作
- connect.hget(name,key) 获取对应的key值
- connect.hmset(name,{key1:value1,key2:value2,key3:value3,.....}) 批量添加值
- connect.hmget(name,[key1,key2,key3,...]) 批量获取值
- connect.hgetall(name) 取出所有的值
- connect.hkeys(name) 获取所有的key
- connect.hvals(name) 获取所有的value
- connect.hscan(name, cursor=0, match=None, count=None) 取值查看--分片读取
'''
name - redis的name
cursor - 游标(基于游标分批取获取数据)
match - 匹配指定key,默认None 表示所有的key
count - 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
'''
connect.hscan('test')
- connect.hscan_iter(name, match=None, count=None) 利用yield封装hscan创建生成器,实现分批去redis中获取数据
'''
match - 匹配指定key,默认None 表示所有的key
count - 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
'''
test = connect.hscan_iter('test')
for i in test:
print(i)
- connect.hlen(name) 获取hash中键值对的个数
- connect.hstrlen(name,key) 获取指定key值的长度
- connect.hincrby(name, key, amount=1) 自增自减数(将key对应的value--整数 自增1或者2,或者别的整数 负数就是自减)
- connect.hincrbyfloat(name, key, amount=1.0) 自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,或者别的浮点数 负数就是自减)
- connect.hdel(name,keys) 删除hash中键值对
connect.hdel('test','name') #删除一个
connect.hdel('test',['name','age']) #删除多个
- connect.hexists(name, key) 判断hash中key是否存在
七、set类型操作,异步需要使用async await
- connect.sadd(name,values) 对应的集合中添加元素
connect.sadd('test_set',1,2,3,4,5)
- connect.scard(name) 获取name集合中的个数
- connect.smembers(name) 获取name集合中的所有元素
- connect.sscan(name, cursor=0, match=None, count=None)
- connect.sscan_iter(name, match=None, count=None)
- connect.srem(name, values) 在name对应的集合中删除某些值
- connect.spop(name) 从集合移除一个成员,并将其返回,说明一下,集合是无序的,所有是随机删除的
- connect.srandmember(namem,num) 从集合随机取出num个元素
- connect.smove(src, dst, value) 将某个成员从一个集合中移动到另外一个集合
- connect.sismember(name, value) 检查value是否是name对应的集合的成员,结果为True和False
- connect.sdiff(keys) 获取多个集合的差集
connect.sdiff(['test_set','test_set1','test_set2'])
- connect.sdiffstore(dest, keys) 获取多个集合的差集,并存进一个新的集合
connect.sdiffstore('new_test_set',['test_set','test_set1','test_set2'])
- connect.sinter(keys) 获取多个集合的交集
- connect.sinterstore(dest, keys) 获取多个集合的差集,并存进一个新的集合
- connect.sunion(keys) 获取多个集合的并集
- connect.sunionstore(dest, keys) 获取多个集合的并集,并存进一个新的集合
八、有序集合类型,异步需要使用async await
- connect.zadd(name,mapping,nx= False,xx= False,ch= False,incr= False,gt= False,lt= False) 对应的集合中添加元素
'''
name - redis的name
mapping - 添加到集合的键值对
nx - 强制ZADD只创建新元素而不更新已经存在的元素的分数。
xx - 强制ZADD只更新已经存在的元素的分数存在。不会添加新元素。
ch - 将返回值修改为已更改的元素数。更改的元素包括添加的新元素和元素谁的分数变了。
incr - 修改ZADD的行为像ZINCRBY。在这种模式下,只有a可以指定单个元素/分数对,分数是数量现有的分数将增加到。使用此模式时ZADD的返回值将是元素的新分数。
LT - 仅在新分数小于时更新现有元素当前分数。这个标志不会阻止添加新元素。
GT - 仅在新分数大于时更新现有元素当前分数。这个标志不会阻止添加新元素。
'''
connect.zadd('test',{'key1': 20,'key2': 10})
- connect.zcard(name) 获取元素集合中的个数
- connect.zrange(name, start, end, desc=False, withscores=False, score_cast_func=float) 按照索引范围获取name对应的有序集合的元素
'''
name - redis的name
start - 有序集合索引起始位置(非分数)
end - 有序集合索引结束位置(非分数)
desc - 排序规则,默认按照分数从小到大排序
withscores - 是否获取元素的分数,默认只获取元素的值
score_cast_func - 对分数进行数据转换的函数
'''
connect.zrange('test',0,1,withscores=True)
- connect.zrevrange(name, start, end, withscores=False, score_cast_func=float) 从大到小排序(同zrange默认排序,集合是从大到小排序的)
- connect.zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float) 按照分数范围获取name对应的有序集合的元素
'''
name - redis的name
min - 最小值
max - 最大值
start - 有序集合索引起始位置(非分数)
num - 获取数量
withscores - 是否获取元素的分数,默认只获取元素的值
score_cast_func - 对分数进行数据转换的函数
'''
connect.zrangebyscore('test',min=0,max=10,start=0,num=1,withscores=True)
- connect.zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float) 按照分数范围获取有序集合的元素并排序(默认从大到小排序)
- connect.zscan(name, cursor=0, match=None, count=None, score_cast_func=float) 获取所有元素
- connect.zscan_iter(name, match=None, count=None, score_cast_func=float) 获取所有元素--迭代器
- connect.zcount(name, min, max) 获取name对应的有序集合中分数 在 [min,max] 之间的个数
- connect.zincrby(name, value, amount) 自增
- connect.zrank(name, value) 获取索引,按照分数顺序(从小到大)
- connect.zrevrank(name, value) 获取索引,按照倒序(从大到小)
- connect.zrem(name, value1,value2,...) 删除name对应的有序集合中值是values的成员
- connect.zremrangebyrank(name, min, max) 根据索引范围删除
- connect.zremrangebyscore(name, min, max) 根据分数范围删除
- connect.zscore(name, value) 获取对应值的分数
九、其他函数,异步需要使用async await
- connect.close() 关闭Redis连接
- connect.select(index) 切换数据库
connect.select(0)
connect.select(1)
connect.select(2)
- connect.ping() 判断服务器是否连接成功
- connect.echo(str) 从服务器输出字符串
- connect.dbsize() 返回服务器中的键数
- connect.keys(pattern) 返回匹配' ' pattern ' '的键列表,不传返回全部
- connect.scan_iter(match,count) 返回匹配match键迭代器,不传返回全部
- connect.time() 返回服务器时间为包含两个元素的int元组
- connect.lastsave()返回一个Python datetime对象,表示对象最后一次使用的时间
- connect.save() 保存数据
- connect.bgsave() 异步保存数据
- connect.shutdonw(save= False,nosave = False,now = False,force = False,abort = False,) 如果Redis配置了持久化,数据将在关机前被刷新
'''
save - 也会强制执行DB保存操作
nosave - 将阻止数据库保存操作,即使有一个或多个保存点配置
now - 跳过等待滞后副本,即它绕过了第一步关机顺序
force - 忽略任何通常会阻止服务器退出的错误
abort - 取消正在进行的关机,不能与其他标志结合使用
'''
- connect.move(name,db) 将键name移动到另一个数据库 db
- connect.flushall(asynchronous = False) 删除当前主机上所有数据库中的所有键,asynchronous 是否异步
- connect.flushdb(asynchronous = False) 删除当前数据库中的所有键,asynchronous 是否异步
- connect.dump(name) 返回存储在指定键处的值的序列化版本
- connect.type(name) 返回键类型
- connect.rename(src,dst) 重命名键src为dst
- connect.renamex(src,dst) 如果dst不存在,则将src重命名为dst
- connect.delete(names) 删除一个或多个由names指定的键
- connect.exists(names) 一个或多个由'names指定的键是是否存在
- connect.expire(name,time,nx = False,xx= False,gt = False,lt = False) 使用给定在键name上为time秒设置一个过期标志
'''
name - redis的name
time - 过期时间
nx - 仅当密钥没有过期时设置过期
xx - 仅当密钥已存在过期时才设置过期
gt - 仅当新过期时间大于当前过期时间时设置过期时间
lt - 仅在新到期时间小于当前到期时间时设置到期时间
'''
- connect.expireat(name,when,nx = False,xx= False,gt = False,lt = False) 使用给定的“选项”在键name上设置一个过期标志
'''
name - redis的name
when - 可以表示为整数表示unix时间或Python datetime对象
nx - 仅当密钥没有过期时设置过期
xx - 仅当密钥已存在过期时才设置过期
gt - 仅当新过期时间大于当前过期时间时设置过期时间
lt - 仅在新到期时间小于当前到期时间时设置到期时间
'''
- connect.pexpire(name,time,nx = False,xx= False,gt = False,lt = False) 使用给定在键name上为timeh毫秒设置一个过期标志
'''
name - redis的name
time - 过期时间
nx - 仅当密钥没有过期时设置过期
xx - 仅当密钥已存在过期时才设置过期
gt - 仅当新过期时间大于当前过期时间时设置过期时间
lt - 仅在新到期时间小于当前到期时间时设置到期时间
'''
- connect.pexpireat(name,when,nx = False,xx= False,gt = False,lt = False) 使用给定的“选项”在键name上设置一个过期标志
'''
name - redis的name
when - 可以表示为整数表示unix时间或Python datetime对象
nx - 仅当密钥没有过期时设置过期
xx - 仅当密钥已存在过期时才设置过期
gt - 仅当新过期时间大于当前过期时间时设置过期时间
lt - 仅在新到期时间小于当前到期时间时设置到期时间
'''
- connect.ttl(name) 返回键name到期前的秒数
- connect.pttl(name) 返回键name到期前的毫秒数
- connect.persist(name) 删除name的过期
十、连接池,异步需要使用async await
- redis.ConnectionPool(option) option参数大部分和redis.Redis一致
import redis
pool = redis.ConnectionPool(host='127.0.0.1',port=6379,decode_responses=True)
connect = redis.Redis(connection_pool=pool)
connect.set('name','数据库0')
print(connect.get('name'))
- redis.BlockingConnectionPool(option) option参数大部分和redis.Redis一致
BlockingConnectionPool和ConnectionPool功能是一样的,但是是线程安全的,在多线程的环境下,建议用BlockingConnectionPool,比如gunicorn使用了多线程的worker。同时,当所有连接都在使用时,获取可用连接不会抛异常,而是可以设置等待时间。
相关推荐
- 大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍
-
“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...
- 电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器
-
在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...
- 设置了加密密码zip文件要如何打开?这几个方法可以试试~
-
Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...
- 大文件想要传输成功,怎么把ZIP文件分卷压缩
-
不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...
- 高效处理 RAR 分卷压缩包:合并解压操作全攻略
-
在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...
- 2个方法教你如何删除ZIP压缩包密码
-
zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...
- 速转!漏洞预警丨压缩软件Winrar目录穿越漏洞
-
WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...
- 文件解压方法和工具分享_文件解压工具下载
-
压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记3
-
1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...
- Python内置tarfile模块:读写 tar 归档文件详解
-
一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...
- 使用python展开tar包_python拓展
-
类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...
- 银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留
-
近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...
- ZIP文件怎么打开?2个简单方法教你轻松搞定!
-
在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...
- Ubuntu—解压多个zip压缩文件.zip .z01 .z02
-
方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...
- 如何使用7-Zip对文件进行加密压缩
-
7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)