Python操作redis数据库

Stella981
• 阅读 508

前言:这两天的事情不多,为了避免之前学习的一点点Python知识遗忘,我在Github上找了一些小项目跟着实践。之前的工作有写过相关的Python处理redis处理数据的脚本,但之前没有养成记录积累的习惯,所以~~~~(遗忘了),所以趁此机会学习一下Python操作redis。
安装:

# pip install redis>>> import redis>>> dir(redis)['AuthenticationError', 'BlockingConnectionPool', 'BusyLoadingError', 'Connection', 'ConnectionError', 'ConnectionPool', 'DataError', 'InvalidResponse', 'PubSubError', 'ReadOnlyError', 'Redis', 'RedisError', 'ResponseError', 'SSLConnection', 'StrictRedis', 'TimeoutError', 'UnixDomainSocketConnection', 'VERSION', 'WatchError', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_compat', 'client', 'connection', 'exceptions', 'from_url', 'int_or_str', 'lock', 'selector', 'utils']

连接redis数据库:

>>> r = redis.Redis(host='192.168.1.115', port=6379, db=7, password=None, encoding='utf-8')      # 默认不支持按指定encoding解析返回值,需要指定 decode_responses=True>>> type(r)<class 'redis.client.Redis'>                # redis.client.Redis 对象为大部分的redis命令都实现了接口具体法可以参考对应的redis命令

Python使用连接池来管理redis连接,默认Python会为每一个redis连接创建一个连接池,可以使用 connection_pool 来指定连接池,以此来实现客户端分片或更精细的控制各个客户端的管理(这个概念尚不懂,哈哈)。

>>> pool = redis.ConnectionPool(host='192.168.1.115', port=6379, db=7)
>>> r = redis.Redis(connection_pool=pool)

操作数据:

>>> r.dbsize()
0
>>> r.set('key1', 'value1')
True
>>> r.get('key1')
b'value1'
>>> r.get('key2')
>>> for i in range(1000):
...     key = 'key%s' % str(i)
...     value = 'value{}'.format(str(i))
...     r.set(key, value)
...     
>>> r.dbsize()
1000
>>> r.randomkey()
b'key247'
>>> r.get('key247')
b'value247'
>>> r.scan(0, 'key245*', 500)                 # *scan命令可以使用对应的*scan_iter,这样可以避免获取游标问题
(1022, [b'key245'])
>>> r.scan(1022, 'key245*', 500)
(0, [])
>>> r.delete('key1')                      # 由于del是Python的保留关键字,所有换为delete
1
>>> r.get('key1')

在Python2中默认返回的是str对象,但在Python3中所有返回都是bytes对象,需要自己把bytes解密成是str。

>>> value = r.get('key247')
>>> type(value)
<class 'bytes'>
>>> value.decode(encoding='utf-8')
'value247'

管道:管道可以多条命令以一个请求发送给redis服务器进行处理,可以显著的提高效率。

>>> pool = redis.ConnectionPool(host='192.168.1.115', port=6379, db=7, password=None)
>>> r = redis.Redis(connection_pool=pool, decode_responses=True, encoding='utf-8')
>>> r.set('bing', 'baz')
True
>>> pipe = r.pipeline(transaction=False)
>>> pipe.set('foo1', 'bar1')
Pipeline<ConnectionPool<Connection<host=192.168.1.115,port=6379,db=7>>>
>>> pipe.get('bing')
Pipeline<ConnectionPool<Connection<host=192.168.1.115,port=6379,db=7>>>
>>> pipe.execute()
[True, b'baz']                # True 为 pipe.set()返回, b'baz' 为pipe.get()返回

关于redis连接关闭问题:

看完整篇文档之后,我发现并没有提到redis连接的释放问题。我记得以前再Python2中使用在最后调用了 closed() 方法,于是查了一下网络资料,发现Python使用连接池来管理redis连接,无需主动关闭连接,连接对象被释放后对应的连接也会被关闭,按照以前调用 close() 方法其实也是没有作用的。

后话:我是根据 https://pypi.org/project/redis/  提供的redis模块官方文档来学习的,奈何学习redis知识不够,而且平常很少用到英语,这么一长篇英文文档看完注意力还是很难集中,后面的一部分内容就只能大概了解一下,以后如果机会再进行补全。

参考资料:https://pypi.org/project/redis/

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
2年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这