首页 > 代码库 > Python 学习笔记 - Redis
Python 学习笔记 - Redis
Redis 和Memcached类似 也是一个开源的内存存储系统,存储格式也是通过键值对的方式。不过和memcached比起来,memcached的value只支持字符串,而redis支持字符串,列表,集合,hash等等;这些数据类型都支持push/pop,add/remove等操作,而且都是原子性的,也就是类似数据库的事物特征一样,所有的操作要么全部完成,要么全部失败,然后回滚到之前的状态。
现在来看看他的简单使用和发布订阅的功能。
服务器安装
[root@sydnagios ~]# wget http://download.redis.io/releases/redis-3.0.6.tar.gz [root@sydnagios ~]# tar xzf redis-3.0.6.tar.gz [root@sydnagios ~]# cd redis-3.0.6/ [root@sydnagios redis-3.0.6]# make
装好的界面如下,使用默认的配置文件,他的访问端口是6379
make[1]: Leaving directory `/root/redis-3.0.6/src‘ [root@sydnagios redis-3.0.6]# src/redis-server 24344:C 07 Nov 10:40:21.763 # Warning: no config file specified, using the default confif 24344:M 07 Nov 10:40:21.764 * Increased maximum number of open files to 10032 (it was or. _._ _.-``__ ‘‘-._ _.-`` `. `_. ‘‘-._ Redis 3.0.6 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ‘‘-._ ( ‘ , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|‘` _.-‘| Port: 6379 | `-._ `._ / _.-‘ | PID: 24344 `-._ `-._ `-./ _.-‘ _.-‘ |`-._`-._ `-.__.-‘ _.-‘_.-‘| | `-._`-._ _.-‘_.-‘ | http://redis.io `-._ `-._`-.__.-‘_.-‘ _.-‘ |`-._`-._ `-.__.-‘ _.-‘_.-‘| | `-._`-._ _.-‘_.-‘ | `-._ `-._`-.__.-‘_.-‘ _.-‘ `-._ `-.__.-‘ _.-‘ `-._ _.-‘ `-.__.-‘ 24344:M 07 Nov 10:40:21.766 # WARNING: The TCP backlog setting of 511 cannot be enforced. 24344:M 07 Nov 10:40:21.766 # Server started, Redis version 3.0.6 24344:M 07 Nov 10:40:21.766 # WARNING overcommit_memory is set to 0! Background save may. 24344:M 07 Nov 10:40:21.766 # WARNING you have Transparent Huge Pages (THP) support enab. 24344:M 07 Nov 10:40:21.766 * The server is now ready to accept connections on port 6379
然后别忘记打开防火墙端口
[root@sydnagios ~]# firewall-cmd --add-port=6379/tcp --permanent success [root@sydnagios ~]# systemctl restart firewalld
接下来用同一个目录下的客户端程序测试一下,成功设置和获取数据
[root@sydnagios redis-3.0.6]# src/redis-cli 127.0.0.1:6379> set foo bar OK 127.0.0.1:6379> get foo "bar" 127.0.0.1:6379>
现在看看Python下如何调用。
首先安装redis模块
C:\WINDOWS\system32>pip install redis Collecting redis Using cached redis-2.10.5-py2.py3-none-any.whl Installing collected packages: redis Successfully installed redis-2.10.5
第一个例子:
import redis r=redis.Redis(host=‘sydnagios‘,port=6379) r.set(‘name‘,‘John‘) print(r.get(‘name‘)) ------- b‘John‘
除了直接连接 也可以通过连接池连接,默认每个redis实例有自己的连接池,通过这种方式,可以多个实例共享一个连接池
import redis pool=redis.ConnectionPool(host=‘sydnagios‘,port=6379) r=redis.Redis(connection_pool=pool) print(r.get(‘name‘))
redis和memcached比起来,因为他支持多种数据结构,因此对应的操作函数也很多,几乎是memcached的10倍
下面是一些常见的,具体的函数使用可以参考 http://www.cnblogs.com/wupeiqi/articles/5132791.html
批量设置,批量获取
pool=redis.ConnectionPool(host=‘sydnagios‘,port=6379) r=redis.Redis(connection_pool=pool) r.mset(name=‘kevin‘,age=14) print(r.mget(‘name‘,‘age‘)) ----------- [b‘kevin‘, b‘14‘]
自增
import redis pool=redis.ConnectionPool(host=‘sydnagios‘,port=6379) r=redis.Redis(connection_pool=pool) r.incrby(‘age‘,10) print(r.get(‘age‘)) ------- b‘24‘
删除
import redis r=redis.Redis(host=‘sydnagios‘,port=6379) r.delete(‘set1‘)
Hash批量操作
import redis pool=redis.ConnectionPool(host=‘sydnagios‘,port=6379) r=redis.Redis(connection_pool=pool) r.hmset(‘computer‘,{‘Macbook‘:20000,‘Surface3‘:5000,‘iPhone7‘:9000}) print(r.hmget(‘computer‘,‘Macbook‘)) -------- [b‘20000‘]
list操作
import redis r=redis.Redis(host=‘sydnagios‘,port=6379) r.lpush(‘list1‘,‘apple‘) r.lpush(‘list1‘,‘pear‘) print(r.llen(‘list1‘)) print(r.lpop(‘list1‘)) print(r.llen(‘list1‘)) ------ 2 b‘pear‘ 1
set操作,集合的元素不可以重复
import redis r=redis.Redis(host=‘sydnagios‘,port=6379) r.sadd(‘set1‘,‘orange‘) r.sadd(‘set1‘,‘mango‘) print(r.scard(‘set1‘)) print(r.smembers(‘set1‘)) --------- 2 {b‘mango‘, b‘orange‘}
管道
默认redis-py在执行一次操作请求的时候会自动连接,然后断开;我们可以通过管道,一次性传入多条操作然后执行。
# !/usr/bin/env python # -*- coding:utf-8 -*- import redis pool = redis.ConnectionPool(host=‘sydnagios‘, port=6379) r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False) pipe = r.pipeline(transaction=True) r.set(‘name‘, ‘alex‘) r.set(‘age‘, 16) pipe.execute()
因为redis的函数实在太多 这里就不一一赘述了。
现在来看一个redis的使用场景,发布和订阅。
简单的说,发布者可以对一个频道发布数据,然后凡是订阅了这个频道的人都可以收到信息。
s3.py
import redis class RedisHelper: def __init__(self): self.__conn = redis.Redis(host=‘sydnagios‘) def publish(self, msg, chan): self.__conn.publish(chan, msg) return True def subscribe(self, chan): pub = self.__conn.pubsub() pub.subscribe(chan) pub.parse_response() return pub
s4.py(订阅者)
import s3 obj = s3.RedisHelper() data = obj.subscribe(‘fm111.7‘) print(data.parse_response())
s5.py(发布者)
import s3 obj = s3.RedisHelper() obj.publish(‘alex db‘, ‘fm111.7‘)
先执行订阅者的代码,进入等待状态,然后执行发布者的程序,对指定的channel发送数据‘alex db’,订阅者一方会收到以下数据
[b‘message‘, b‘fm111.7‘, b‘alex db‘]
本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1870139
Python 学习笔记 - Redis