python redis模块

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

python也提供的操作redis的模块。通过这个模块我们就可以向redis中写入和获取数据了。

看一个简单的插入和查询数据的代码。

#!/usr/bin/env python
# -*-coding:utf-8-*-
import redis
#创建一个Redis方法实例,指定redis服务所在的地址和端口
r = redis.Redis(host=‘192.168.10.105‘, port=6379)
"""
通过set()方法向redis中写入数据,因为redis存储是k-v类型的字典模式
所以下面的的代码相当于向redis中写入一个字典{‘foo‘:‘Bar‘}
"""
r.set(‘foo‘, ‘Bar‘)
#通过get()方法从redis中key值‘foo‘对应的value值
print r.get(‘foo‘)

运行结果如下

Bar

连接池

先说一下线程池(进程池)与连接池的区别。按我的理解,线程池(进程池)是限制执行一个任务的时候最多可以启动多少个线程(进程),一条线程(进程)处理完任务就消亡掉了。随后马上再创建一条新的线程(进程)到队列里获取任务执行再消亡。这样周而复始的运作。线程(进程)池只是限制一下同时存在的线程(进程)数量上限而已。这个方式的好处是不用预留大量线程等待连接,避免占用资源。缺点就是需要反复创建和销毁线程,这个过程开销也很大。

连接池里面跑的都是线程。这些线程用来连接应用和数据库。每个连接池只要启动就会最少产生n个线程用于等待连接。当应用的连接数大于现有的线程数时,就产生新的线程应对连接请求。但是当达到预设上线的时候就不再产生新线程,其他请求只能等着有空余线程之后直接再连上。这样在繁忙的时候线程只会产生和等待不会消亡。当业务高峰过去。没每断开一个连接就会消亡掉一个线程。知道线程降低到最小线程数n的时候,线程数量就不会继续消亡了。这种方式的好处是不用反复创建新的线程增加创建开销。但是一启动就需要创建很多线程等着连接。时间久了也会对资源过度占用。

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

import redis
"""
调用ConnectionPool()方法创建一个连接池实例,这里不管指定了redis服务器的ip和port还可以指定连接池
的最大连接数。如果不指定的话就是按系统的最大连接数取值(具体是什么有时候需要好好看看源码的解释)
"""
pool = redis.ConnectionPool(host=‘192.168.10.105‘, port=6379,max_connections=10)
"""
实例化redis的API的时候填入的参数变为刚刚定义的连接池
"""
r = redis.Redis(connection_pool=pool)
r.set(‘foo‘, ‘Bar‘)
print r.get(‘foo‘)

执行结果和调用的普通的方法没什么区别,只是用了连接池之后最多只能有10个这样的set操作连接到redis服务器

Bar

管道

我们上面的命令都是一次执行一个set操作,每次set都会连接一次数据库。如果set的量比较大,操作有比较密集的话就可以使用pipline管道操作。这个方法的作用就是把set这类的针对redis的操作都放入管道中,最后统一执行一次。这样的好处就是一次连接执行多条命令,减少与redis的连接次数。看代码

#!/usr/bin/env python
# -*-coding:utf-8-
import redis
"""
调用ConnectionPool()方法创建一个连接池实例,这里不管指定了redis服务器的ip和port还可以指定连接池
的最大连接数。如果不指定的话就是按系统的最大连接数取值(具体是什么有时候需要好好看看源码的解释)
"""
pool = redis.ConnectionPool(host=‘192.168.10.105‘, port=6379,max_connections=10)
r = redis.Redis(connection_pool=pool)
"""
默认情况下,向redis中set一次数据就叫一次原子性的操作。说白了就是事物操作如果set成功就没事了,如果不
成功就把插入的数据回退。非原子性的操作就是不管成功与否都继续进行也没有回退的数据。是否启用原子性操作
就通过transaction关键字来设置
"""
# pipe = r.pipeline(transaction=False)
#创建一个管道实例
pipe = r.pipeline(transaction=True)
#管道下面插入要执行的语句
r.set(‘name‘, ‘alex‘)
r.set(‘role‘, ‘sb‘)
#执行通道里的所有命令
pipe.execute()

redis订阅和发布。

redis有个很有用的功能,它的原理就像个收音机一样。一个订阅者就相当于听众,一个发布者类似于主播。redis就是个广播电台。主播(发布者)通过电台(redis)传达给听众(订阅者)。另外要说明一下的就是主播和听众不是一对多,而是多对多的关系。可以多个主播多个听众的。下面通过代码来实现一下。

先来把电台这边的搭建好

#!/usr/bin/env python
# coding:utf-8
import redis
r=redis.Redis(host=‘192.168.10.105‘,port=6379)
#就这么简单,两句话。向指定的频道发送消息
r.publish(‘wgw_channel‘,‘hello everyone‘)

下面写个听众这一端的代码

#!/usr/bin/env python
# -*-coding:utf-8-*-
import redis
r=redis.Redis(host=‘192.168.10.105‘,port=6379)
#打开收音机电源
sub=r.pubsub()
#调整收音机的接收频率,两边的频率必须一样,不然就收不到了。
sub.subscribe(‘wgw_channel‘)
#调整好了就循环接受接收电台的信号,播放出来
while True:
    print sub.parse_response()

客户端运行起来之后会收到如下的运行结果

D:\Python27\python.exe F:/python_file/day12/test.py

#这一行第一次运行的时候肯定会出现,这个相当于频道的一个启动提示

[‘subscribe‘, ‘wgw_channel‘, 1L]

#这里开始就是接收到的从电台主播那里发送过来的消息了

[‘message‘, ‘wgw_channel‘, ‘hello everyone‘]

时间: 2024-08-05 16:16:35

python redis模块的相关文章

CentOS6.5安装python redis模块

1.下载安装包https://pypi.python.org/packages/source/r/redis/redis-2.10.3.tar.gz 2.解压tar -zxf redis-2.10.3.tar.gz 3.进入redis-2.10.3目录 4.python setup.py install 5.进入python客户端 import redis

Python redis

Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性

22Python标准库系列之Redis模块

Python标准库系列之Redis模块 What is redis? Redis is an open source (BSD licensed), in-memory data structure store, used as database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, b

SaltStack源码分析之使用Redis模块

Redis模块路径 /usr/lib/python2.6/site-packages/salt/modules/redismod.py Redis模块会首先检查是否安装有Redis的Python驱动 # -*- coding: utf-8 -*- ''' Module to provide redis functionality to Salt .. versionadded:: 2014.7.0 :configuration: This module requires the redis py

python redis链接建立实现分析

今天在写zabbix storm job监控脚本的时候用到了python的redis模块,之前也有用过,但是没有过多的了解,今天看了下相关的api和源码,看到有ConnectionPool的实现,这里简单说下.在ConnectionPool之前,如果需要连接redis,我都是用StrictRedis这个类,在源码中可以看到这个类的具体解释: redis.StrictRedis Implementation of the Redis protocol.This abstract class pro

Day05 - Python 常用模块

1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模块support.py 1 def print_func( par ): 2 print("Hello : ", par) 3 return 1)import 语句 想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下: import module1[, m

day02 Python 的模块,运算,数据类型以及方法

初识pyhton的模块: 什么是模块: 我的理解就是实现一个功能的函数,把它封装起来,在你需要使用的时候直接调用即可,我的印象里类似于shell 的单独函数脚本. python 的模块分为标准的和第三方的,标准的直接使用即可,第三方需要安装,可以使用pip 来安装模块,这个我们以后再讲. 模块都在哪里呢? 其实模块也是一个文件,我们通过搜索发现自带的模块都在python安装目录的base/lib下,第三方的模块则是在base/lib/site-packages 如何使用模块: 我们在使用模块的某

Day5 模块及Python常用模块

模块概述 定义:模块,用一砣代码实现了某类功能的代码集合. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,提供了代码的重用性.在Python中,一个.py文件就称之为一个模块(Module). 注意: 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 简单地说,模块就是一个保存了Python代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码! 模块分为三种: 自定义模块 开源模块 内置模块 使用模块有什么

python常用模块基础

1.补充上篇中的os,sys模块的几个小功能 import os,sys res1=os.system('ipconfig')#os.system(commad)执行操作系统命令,不返回执行结果 res2=os.popen('ipconfig').read()#os.popen(commad)执行操作系统命令,返回执行结果,通过read方法可以读取内容 inpu=sys.argv#argv获取执行该python文件时的参数为list,如 ls -a 这里的a就是参数 if len(inpu)>1