Python redis操作实例分析【连接、管道、发布和订阅等】


Posted in Python onMay 16, 2019

本文实例讲述了Python redis操作。分享给大家供大家参考,具体如下:

一、redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便,Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。

二、python操作redis

1、连接方式

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
r = redis.Redis(host='192.168.0.110', port=6379,db=0)
r.set('name', 'zhangsan')  #添加
print (r.get('name'))  #获取

2、连接池

redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('name', 'zhangsan')  #添加
print (r.get('name'))  #获取

3、操作

4、管道

redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=True)
r.set('name', 'zhangsan')
r.set('name', 'lisi')
pipe.execute()

5、发布和订阅

首先定义一个RedisHelper类,连接Redis,定义频道为monitor,定义发布(publish)及订阅(subscribe)方法。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis
class RedisHelper(object):
  def __init__(self):
    self.__conn = redis.Redis(host='192.168.0.110',port=6379)#连接Redis
    self.channel = 'monitor' #定义名称
  def publish(self,msg):#定义发布方法
    self.__conn.publish(self.channel,msg)
    return True
  def subscribe(self):#定义订阅方法
    pub = self.__conn.pubsub()
    pub.subscribe(self.channel)
    pub.parse_response()
    return pub

发布者

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#发布
from RedisHelper import RedisHelper
obj = RedisHelper()
obj.publish('hello')#发布

订阅者

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#订阅
from RedisHelper import RedisHelper
obj = RedisHelper()
redis_sub = obj.subscribe()#调用订阅方法
while True:
  msg= redis_sub.parse_response()
  print (msg)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
Python元组拆包和具名元组解析实例详解
Mar 26 Python
如何利用python查找电脑文件
Apr 27 Python
Python中的函数作用域
May 07 Python
让代码变得更易维护的7个Python库
Oct 09 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
django框架模板语言使用方法详解
Jul 18 Python
深入理解Python 多线程
Jun 16 Python
python操作redis数据库的三种方法
Sep 10 Python
Python中qutip用法示例详解
Oct 02 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 #Python
Python 实现数据结构中的的栈队列
May 16 #Python
Python 一键制作微信好友图片墙的方法
May 16 #Python
Python实现京东秒杀功能代码
May 16 #Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 #Python
Python异步操作MySQL示例【使用aiomysql】
May 16 #Python
Django 表单模型选择框如何使用分组
May 16 #Python
You might like
php 常用类汇总 推荐收藏
2010/05/13 PHP
php页面消耗内存过大的处理办法
2013/03/18 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
求职简历的自我评价怎样写好
2013/10/07 职场文书
认购协议书范本
2014/04/22 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
高考升学宴答谢词
2015/01/20 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
学校隐患排查制度
2015/08/05 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python