python redis订阅_Python 学习笔记 - Redis
Redis 和Memcached類似 也是一個(gè)開(kāi)源的內(nèi)存存儲(chǔ)系統(tǒng),存儲(chǔ)格式也是通過(guò)鍵值對(duì)的方式。不過(guò)和memcached比起來(lái),memcached的value只支持字符串,而redis支持字符串,列表,集合,hash等等;這些數(shù)據(jù)類型都支持push/pop,add/remove等操作,而且都是原子性的,也就是類似數(shù)據(jù)庫(kù)的事物特征一樣,所有的操作要么全部完成,要么全部失敗,然后回滾到之前的狀態(tài)。
現(xiàn)在來(lái)看看他的簡(jiǎn)單使用和發(fā)布訂閱的功能。
服務(wù)器安裝[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
裝好的界面如下,使用默認(rèn)的配置文件,他的訪問(wèn)端口是6379make[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
然后別忘記打開(kāi)防火墻端口[root@sydnagios?~]#?firewall-cmd?--add-port=6379/tcp?--permanent
success
[root@sydnagios?~]#?systemctl?restart?firewalld
接下來(lái)用同一個(gè)目錄下的客戶端程序測(cè)試一下,成功設(shè)置和獲取數(shù)據(jù)[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>
現(xiàn)在看看Python下如何調(diào)用。
首先安裝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
第一個(gè)例子:import?redis
r=redis.Redis(host='sydnagios',port=6379)
r.set('name','John')
print(r.get('name'))
-------
b'John'
除了直接連接 也可以通過(guò)連接池連接,默認(rèn)每個(gè)redis實(shí)例有自己的連接池,通過(guò)這種方式,可以多個(gè)實(shí)例共享一個(gè)連接池import?redis
pool=redis.ConnectionPool(host='sydnagios',port=6379)
r=redis.Redis(connection_pool=pool)
print(r.get('name'))
redis和memcached比起來(lái),因?yàn)樗С侄喾N數(shù)據(jù)結(jié)構(gòu),因此對(duì)應(yīng)的操作函數(shù)也很多,幾乎是memcached的10倍
批量設(shè)置,批量獲取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操作,集合的元素不可以重復(fù)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'}
管道
默認(rèn)redis-py在執(zhí)行一次操作請(qǐng)求的時(shí)候會(huì)自動(dòng)連接,然后斷開(kāi);我們可以通過(guò)管道,一次性傳入多條操作然后執(zhí)行。#?!/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()
因?yàn)閞edis的函數(shù)實(shí)在太多 這里就不一一贅述了。
現(xiàn)在來(lái)看一個(gè)redis的使用場(chǎng)景,發(fā)布和訂閱。
簡(jiǎn)單的說(shuō),發(fā)布者可以對(duì)一個(gè)頻道發(fā)布數(shù)據(jù),然后凡是訂閱了這個(gè)頻道的人都可以收到信息。
s3.pyimport?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(發(fā)布者)import?s3
obj?=?s3.RedisHelper()
obj.publish('alex?db',?'fm111.7')
先執(zhí)行訂閱者的代碼,進(jìn)入等待狀態(tài),然后執(zhí)行發(fā)布者的程序,對(duì)指定的channel發(fā)送數(shù)據(jù)‘a(chǎn)lex db’,訂閱者一方會(huì)收到以下數(shù)據(jù)[b'message',?b'fm111.7',?b'alex?db']
總結(jié)
以上是生活随笔為你收集整理的python redis订阅_Python 学习笔记 - Redis的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android 京东白条支付,京东网银钱
- 下一篇: php transfer-encodin