小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

python操作 redis

 comeonwyj 2019-03-23

前面我們簡(jiǎn)單介紹了redis nosql數(shù)據(jù)庫(kù),現(xiàn)在我們?cè)趐ython里面來(lái)使用redis。

一、python連接redis

在python中,要操作redis,目前主要是通過(guò)一個(gè)python-redis模塊來(lái)實(shí)現(xiàn)

1、在python中安裝redis模塊

1 pip3 install redis

2、在python中使用redis

  跟其他模塊一樣,在安裝好redis模塊后,要使用redis模塊就要先導(dǎo)入。

python連接redis數(shù)據(jù)庫(kù):

復(fù)制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 
 4 import redis
 5 
 6 '''
 7 這種連接是連接一次就斷了,耗資源.端口默認(rèn)6379,就不用寫(xiě)
 8 r = redis.Redis(host='127.0.0.1',port=6379,password='tianxuroot')
 9 r.set('name','root')
10 
11 print(r.get('name').decode('utf8'))
12 '''
13 '''
14 連接池:
15 當(dāng)程序創(chuàng)建數(shù)據(jù)源實(shí)例時(shí),系統(tǒng)會(huì)一次性創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)連接,并把這些數(shù)據(jù)庫(kù)連接保存在連接池中,當(dāng)程序需要進(jìn)行數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)時(shí),
16 無(wú)需重新新建數(shù)據(jù)庫(kù)連接,而是從連接池中取出一個(gè)空閑的數(shù)據(jù)庫(kù)連接
17 '''
18 pool = redis.ConnectionPool(host='127.0.0.1',password='helloworld')   #實(shí)現(xiàn)一個(gè)連接池
19 
20 r = redis.Redis(connection_pool=pool)
21 r.set('foo','bar')
22 print(r.get('foo').decode('utf8'))
復(fù)制代碼

 

二、Redis API使用

redis-py 的API的使用可以分類(lèi)為:

  • 連接方式
  • 連接池
  • 操作
    • String 操作
    • Hash 操作
    • List 操作
    • Set 操作
    • Sort Set 操作
  • 管道
  • 發(fā)布訂閱

前面通過(guò)一個(gè)連接實(shí)例來(lái)簡(jiǎn)述了python用過(guò)redis模塊連接redis數(shù)據(jù)庫(kù)的連接方式和連接池。

接下來(lái)主要看如何通過(guò)python來(lái)操作redis數(shù)據(jù)庫(kù):

1. String操作

redis中的String在在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)value來(lái)存儲(chǔ)。如圖:

復(fù)制代碼
set(name, value, ex=None, px=None, nx=False, xx=False)
  在Redis中設(shè)置值,默認(rèn),不存在則創(chuàng)建,存在則修改
  參數(shù):
       ex,過(guò)期時(shí)間(秒)
       px,過(guò)期時(shí)間(毫秒)
       nx,如果設(shè)置為T(mén)rue,則只有name不存在時(shí),當(dāng)前set操作才執(zhí)行
       xx,如果設(shè)置為T(mén)rue,則只有name存在時(shí),崗前set操作才執(zhí)行

setnx(name, value)
    #設(shè)置值,只有name不存在時(shí),執(zhí)行設(shè)置操作(添加)

setex(name, value, time)
  # 設(shè)置值   # 參數(shù): # time,過(guò)期時(shí)間(數(shù)字秒 或 timedelta對(duì)象) psetex(name, time_ms, value)
  # 設(shè)置值   # 參數(shù):
    # time_ms,過(guò)期時(shí)間(數(shù)字毫秒 或 timedelta對(duì)象) mset(*args, **kwargs) 批量設(shè)置值   如: mset(k1='v1', k2='v2') 或 mget({'k1': 'v1', 'k2': 'v2'}) get(name) 獲取值 mget(keys, *args) 批量獲取    如: mget('name', 'root') 或 r.mget(['name', 'root']) getset(name, value) 設(shè)置新值并獲取原來(lái)的值 getrange(key, start, end) # 獲取子序列(根據(jù)字節(jié)獲取,非字符)   # 參數(shù): #name,Redis 的 name # start,起始位置(字節(jié)) # end,結(jié)束位置(字節(jié))   # 如: "你好" ,0-3表示 "你" (utf8中一個(gè)中文字符占三個(gè)字節(jié)) setrange(name, offset, value) # 修改字符串內(nèi)容,從指定字符串索引開(kāi)始向后替換(新值太長(zhǎng)時(shí),則向后添加)   # 參數(shù): # offset,字符串的索引,字節(jié)(一個(gè)漢字三個(gè)字節(jié)) # value,要設(shè)置的值 setbit(name, offset, value) # 對(duì)name對(duì)應(yīng)值的二進(jìn)制表示的位進(jìn)行操作   # 參數(shù): # name,redis的name # offset,位的索引(將值變換成二進(jìn)制后再進(jìn)行索引) # value,值只能是 1 或 0   # 注:如果在Redis中有一個(gè)對(duì)應(yīng): n1 = "foo", 那么字符串foo的二進(jìn)制表示為:01100110 01101111 01101111 所以,如果執(zhí)行 setbit('n1', 7, 1),則就會(huì)將第7位設(shè)置為1, 那么最終二進(jìn)制則變成 01100111 01101111 01101111,即:"goo"   # 擴(kuò)展,轉(zhuǎn)換二進(jìn)制表示: # source = "你好啊" source = "foo" for i in source: num = ord(i) print bin(num).replace('b','') 特別的,如果source是漢字 "你好啊"怎么辦? 答:對(duì)于utf-8,每一個(gè)漢字占 3 個(gè)字節(jié),那么 "人生苦短" 則有 12個(gè)字節(jié) 對(duì)于漢字,for循環(huán)時(shí)候會(huì)按照 字節(jié) 迭代,那么在迭代時(shí),將每一個(gè)字節(jié)轉(zhuǎn)換 十進(jìn)制數(shù),然后再將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000 -------------------------- ----------------------------- ----------------------------- 你 好 啊   *用途舉例,用最省空間的方式,存儲(chǔ)在線(xiàn)用戶(hù)數(shù)及分別是哪些用戶(hù)在線(xiàn) getbit(name, offset) # 獲取name對(duì)應(yīng)的值的二進(jìn)制表示中的某位的值 (0或1) bitcount(key, start=None, end=None) # 獲取name對(duì)應(yīng)的值的二進(jìn)制表示中 1 的個(gè)數(shù)   # 參數(shù): # key,Redis的name # start,位起始位置 # end,位結(jié)束位置 strlen(name) # 返回name對(duì)應(yīng)值的字節(jié)長(zhǎng)度(一個(gè)漢字3個(gè)字節(jié)) incr(self, name, amount=1) # 自增 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自增。   # 參數(shù): # name,Redis的name # amount,自增數(shù)(必須是整數(shù))   # 注:同incrby incrbyfloat(self, name, amount=1.0) # 自增 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自增。   # 參數(shù): # name,Redis的name # amount,自增數(shù)(浮點(diǎn)型) decr(self, name, amount=1) # 自減 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自減。   # 參數(shù): # name,Redis的name # amount,自減數(shù)(整數(shù)) append(key, value) # 在redis name對(duì)應(yīng)的值后面追加內(nèi)容   # 參數(shù): key, redis的name value, 要追加的字符串
復(fù)制代碼

 

2. Hash操作

hash表現(xiàn)形式上有些像pyhton中的dict,可以存儲(chǔ)一組關(guān)聯(lián)性較強(qiáng)的數(shù)據(jù) , redis中Hash在內(nèi)存中的存儲(chǔ)格式如下圖:  

復(fù)制代碼
hset(name, key, value)
  # name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在,則創(chuàng)建;否則,修改), 注意: 在python中,鍵值對(duì)是dict, 這里的name必須是dict格式。eg:xxx[]、 xxx[k]...     
  # 參數(shù):
        # name,redis的name
        #key,name對(duì)應(yīng)的hash中的key
        # value,name對(duì)應(yīng)的hash中的value
  # 注:
        # hsetnx(name, key, value),當(dāng)name對(duì)應(yīng)的hash中不存在當(dāng)前key時(shí)則創(chuàng)建(相當(dāng)于添加)

hmset(name, mapping)
  # 在name對(duì)應(yīng)的hash中批量設(shè)置鍵值對(duì) 
  # 參數(shù):
        # name,redis的name
        # mapping,字典,如:{'k1':'v1', 'k2': 'v2'}
  # 如:
        # r.hmset('xx', {'k1':'v1', 'k2': 'v2'})

hget(name,key)
  # 在name對(duì)應(yīng)的hash中獲取根據(jù)key獲取value

hmget(name, keys, *args)
  # 在name對(duì)應(yīng)的hash中獲取多個(gè)key的值
  # 參數(shù):
        # name,reids對(duì)應(yīng)的name
        # keys,要獲取key集合,如:['k1', 'k2', 'k3']
        # *args,要獲取的key,如:k1,k2,k3
  # 如:
        # r.mget('xx', ['k1', 'k2'])
        #
        # print r.hmget('xx', 'k1', 'k2')

hgetall(name)
  #獲取name對(duì)應(yīng)hash的所有鍵值

hlen(name)
  # 獲取name對(duì)應(yīng)的hash中鍵值對(duì)的個(gè)數(shù)

hkeys(name)
  # 獲取name對(duì)應(yīng)的hash中所有的key的值

hvals(name)
  # 獲取name對(duì)應(yīng)的hash中所有的value的值

hexists(name, key)
  # 檢查name對(duì)應(yīng)的hash是否存在當(dāng)前傳入的key

hdel(name,*keys)
  # 將name對(duì)應(yīng)的hash中指定key的鍵值對(duì)刪除

hincrby(name, key, amount=1)
  # 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount
  # 參數(shù):
        # name,redis中的name
           # key, hash對(duì)應(yīng)的key
        # amount,自增數(shù)(整數(shù))

hincrbyfloat(name, key, amount=1.0)
  # 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount
  # 參數(shù):
        # name,redis中的name
        # key, hash對(duì)應(yīng)的key
        # amount,自增數(shù)(浮點(diǎn)數(shù))
  # 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount

hscan(name, cursor=0, match=None, count=None)
  Start a full hash scan with:
  HSCAN myhash 0
  Start a hash scan with fields matching a pattern with:
  HSCAN myhash 0 MATCH order_*
  Start a hash scan with fields matching a pattern and forcing the scan command to do more scanning with:
  HSCAN myhash 0 MATCH order_* COUNT 1000
  # 增量式迭代獲取,對(duì)于數(shù)據(jù)大的數(shù)據(jù)非常有用,hscan可以實(shí)現(xiàn)分片的獲取數(shù)據(jù),并非一次性將數(shù)據(jù)全部獲取完,從而放置內(nèi)存被撐爆
  # 參數(shù):
        # name,redis的name
          # cursor,游標(biāo)(基于游標(biāo)分批取獲取數(shù)據(jù))
        # match,匹配指定key,默認(rèn)None 表示所有的key
        # count,每次分片最少獲取個(gè)數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)
  # 如:
        # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
        # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
        # ...
        # 直到返回值cursor的值為0時(shí),表示數(shù)據(jù)已經(jīng)通過(guò)分片獲取完畢
 
hscan_iter(name, match=None, count=None)
  # 利用yield封裝hscan創(chuàng)建生成器,實(shí)現(xiàn)分批去redis中獲取數(shù)據(jù)     
  # 參數(shù):
        # match,匹配指定key,默認(rèn)None 表示所有的key
        # count,每次分片最少獲取個(gè)數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)
  # 如:
        # for item in r.hscan_iter('xx'):
        # print item
 
復(fù)制代碼

 

3. list

List操作,redis中的List在在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)List來(lái)存儲(chǔ)。如圖:  

復(fù)制代碼
lpush(name,values)
  # 在name對(duì)應(yīng)的list中添加元素,每個(gè)新的元素都添加到列表的最左邊
  # 如:
        # r.lpush('oo', 11,22,33)
        # 保存順序?yàn)? 33,22,11
  # 擴(kuò)展:
        # rpush(name, values) 表示從右向左操作

lpushx(name,value)
  # 在name對(duì)應(yīng)的list中添加元素,只有name已經(jīng)存在時(shí),值添加到列表的最左邊
  # 更多: # rpushx(name, value) 表示從右向左操作 llen(name)   # name對(duì)應(yīng)的list元素的個(gè)數(shù) linsert(name, where, refvalue, value))   # 在name對(duì)應(yīng)的列表的某一個(gè)值前或后插入一個(gè)新值   # 參數(shù): # name,redis的name # where,BEFORE或AFTER # refvalue,標(biāo)桿值,即:在它前后插入數(shù)據(jù) # value,要插入的數(shù)據(jù) r.lset(name, index, value)   # 對(duì)name對(duì)應(yīng)的list中的某一個(gè)索引位置重新賦值   # 參數(shù): # name,redis的name # index,list的索引位置 # value,要設(shè)置的值 r.lrem(name, value, num)   # 在name對(duì)應(yīng)的list中刪除指定的值   # 參數(shù): # name,redis的name # value,要?jiǎng)h除的值 # num,num=0,刪除列表中所有的指定值; # num=2,從前到后,刪除2個(gè); # num=-2,從后向前,刪除2個(gè) lpop(name)   # 在name對(duì)應(yīng)的列表的左側(cè)獲取第一個(gè)元素并在列表中移除,返回值則是第一個(gè)元素   # 更多: # rpop(name) 表示從右向左操作 lindex(name, index)   #在name對(duì)應(yīng)的列表中根據(jù)索引獲取列表元素 lrange(name, start, end)   # 在name對(duì)應(yīng)的列表分片獲取數(shù)據(jù)   # 參數(shù): # name,redis的name # start,索引的起始位置 # end,索引結(jié)束位置 ltrim(name, start, end)   # 在name對(duì)應(yīng)的列表中移除沒(méi)有在start-end索引之間的值   # 參數(shù): # name,redis的name # start,索引的起始位置 # end,索引結(jié)束位置 rpoplpush(src, dst)   # 從一個(gè)列表取出最右邊的元素,同時(shí)將其添加至另一個(gè)列表的最左邊   # 參數(shù): # src,要取數(shù)據(jù)的列表的name # dst,要添加數(shù)據(jù)的列表的name blpop(keys, timeout)   # 將多個(gè)列表排列,按照從左到右去pop對(duì)應(yīng)列表的元素   # 參數(shù): # keys,redis的name的集合 # timeout,超時(shí)時(shí)間,當(dāng)元素所有列表的元素獲取完之后,阻塞等待列表內(nèi)有數(shù)據(jù)的時(shí)間(秒), 0 表示永遠(yuǎn)阻塞   # 更多: # r.brpop(keys, timeout),從右向左獲取數(shù)據(jù) brpoplpush(src, dst, timeout=0)   # 從一個(gè)列表的右側(cè)移除一個(gè)元素并將其添加到另一個(gè)列表的左側(cè)   # 參數(shù): # src,取出并要移除元素的列表對(duì)應(yīng)的name # dst,要插入元素的列表對(duì)應(yīng)的name # timeout,當(dāng)src對(duì)應(yīng)的列表中沒(méi)有數(shù)據(jù)時(shí),阻塞等待其有數(shù)據(jù)的超時(shí)時(shí)間(秒),0 表示永遠(yuǎn)阻塞
復(fù)制代碼

 

4.set集合操作

  Set操作,Set集合就是不允許重復(fù)的列表。這里包括了一般的集合和有序集合。

復(fù)制代碼
sadd(name,values)
  # name對(duì)應(yīng)的集合中添加元素

scard(name)
  #獲取name對(duì)應(yīng)的集合中元素個(gè)數(shù)

sdiff(keys, *args)
  #在第一個(gè)name對(duì)應(yīng)的集合中且不在其他name對(duì)應(yīng)的集合的元素集合

sdiffstore(dest, keys, *args)
  # 獲取第一個(gè)name對(duì)應(yīng)的集合中且不在其他name對(duì)應(yīng)的集合,再將其新加入到dest對(duì)應(yīng)的集合中

sinter(keys, *args)
  # 獲取多一個(gè)name對(duì)應(yīng)集合的并集

sinterstore(dest, keys, *args)
  # 獲取多一個(gè)name對(duì)應(yīng)集合的并集,再講其加入到dest對(duì)應(yīng)的集合中

sismember(name, value)
  # 檢查value是否是name對(duì)應(yīng)的集合的成員

smembers(name)
  # 獲取name對(duì)應(yīng)的集合的所有成員

smove(src, dst, value)
  # 將某個(gè)成員從一個(gè)集合中移動(dòng)到另外一個(gè)集合

spop(name)
  # 從集合的右側(cè)(尾部)移除一個(gè)成員,并將其返回

srandmember(name, numbers)
  # 從name對(duì)應(yīng)的集合中隨機(jī)獲取 numbers 個(gè)元素

srem(name, values)
  # 在name對(duì)應(yīng)的集合中刪除某些值

sunion(keys, *args)
  # 獲取多一個(gè)name對(duì)應(yīng)的集合的并集

sunionstore(dest,keys, *args)
  # 獲取多一個(gè)name對(duì)應(yīng)的集合的并集,并將結(jié)果保存到dest對(duì)應(yīng)的集合中

sscan(name, cursor=0, match=None, count=None)
sscan_iter(name, match=None, count=None)
  # 同字符串的操作,用于增量迭代分批獲取元素,避免內(nèi)存消耗太大
復(fù)制代碼

有序集合,在集合的基礎(chǔ)上,為每元素排序;元素的排序需要根據(jù)另外一個(gè)值來(lái)進(jìn)行比較,所以,對(duì)于有序集合,每一個(gè)元素有兩個(gè)值,即:值和分?jǐn)?shù),分?jǐn)?shù)專(zhuān)門(mén)用來(lái)做排序。
復(fù)制代碼
zadd(name, *args, **kwargs)
  # 在name對(duì)應(yīng)的有序集合中添加元素
  # 如:
        # zadd('zz', 'n1', 1, 'n2', 2)
        #
        # zadd('zz', n1=11, n2=22)

zcard(name)
  # 獲取name對(duì)應(yīng)的有序集合元素的數(shù)量

zcount(name, min, max)
  # 獲取name對(duì)應(yīng)的有序集合中分?jǐn)?shù) 在 [min,max] 之間的個(gè)數(shù)

zincrby(name, value, amount)
  # 自增name對(duì)應(yīng)的有序集合的 name 對(duì)應(yīng)的分?jǐn)?shù)

r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
  # 按照索引范圍獲取name對(duì)應(yīng)的有序集合的元素
  # 參數(shù):
        # name,redis的name
        # start,有序集合索引起始位置(非分?jǐn)?shù))
        # end,有序集合索引結(jié)束位置(非分?jǐn)?shù))
        # desc,排序規(guī)則,默認(rèn)按照分?jǐn)?shù)從小到大排序
        # withscores,是否獲取元素的分?jǐn)?shù),默認(rèn)只獲取元素的值
        # score_cast_func,對(duì)分?jǐn)?shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換的函數(shù)

  # 更多:
        # 從大到小排序
        # zrevrange(name, start, end, withscores=False, score_cast_func=float)
    # 按照分?jǐn)?shù)范圍獲取name對(duì)應(yīng)的有序集合的元素
        # zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
        # 從大到小排序
        # zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)

zrank(name, value)
  # 獲取某個(gè)值在 name對(duì)應(yīng)的有序集合中的排行(從 0 開(kāi)始)
  # 更多:
        # zrevrank(name, value),從大到小排序

zrem(name, values)
  # 刪除name對(duì)應(yīng)的有序集合中值是values的成員
  # 如:zrem('zz', ['s1', 's2'])

zremrangebyrank(name, min, max)
  # 根據(jù)排行范圍刪除

zremrangebyscore(name, min, max)
  # 根據(jù)分?jǐn)?shù)范圍刪除

zscore(name, value)
  # 獲取name對(duì)應(yīng)有序集合中 value 對(duì)應(yīng)的分?jǐn)?shù)

zinterstore(dest, keys, aggregate=None)
  # 獲取兩個(gè)有序集合的交集,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作
  # aggregate的值為:  SUM  MIN  MAX
  
zunionstore(dest, keys, aggregate=None)
  # 獲取兩個(gè)有序集合的并集,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作
  # aggregate的值為:  SUM  MIN  MAX

zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
zscan_iter(name, match=None, count=None,score_cast_func=float)
  # 同字符串相似,相較于字符串新增score_cast_func,用來(lái)對(duì)分?jǐn)?shù)進(jìn)行操作
復(fù)制代碼

 

5、其他常用操作

 

復(fù)制代碼
delete(*names)
  # 根據(jù)刪除redis中的任意數(shù)據(jù)類(lèi)型

exists(name)
  # 檢測(cè)redis的name是否存在

keys(pattern='*')
  # 根據(jù)模型獲取redis的name
  # 更多:
        # KEYS * 匹配數(shù)據(jù)庫(kù)中所有 key 。
        # KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
        # KEYS h*llo 匹配 hllo 和 heeeeello 等。
        # KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo

expire(name ,time)
  # 為某個(gè)redis的某個(gè)name設(shè)置超時(shí)時(shí)間

rename(src, dst)
  # 對(duì)redis中src的name重命名為dst

move(name, db))
  # 將redis的某個(gè)值移動(dòng)到指定的db下

randomkey()
  # 隨機(jī)獲取一個(gè)redis的name(不刪除)

type(name)
  # 獲取name對(duì)應(yīng)值的類(lèi)型

scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None)
  # 同字符串操作,用于增量迭代獲取key
復(fù)制代碼

 

三、管道

  redis-py默認(rèn)在執(zhí)行每次請(qǐng)求都會(huì)創(chuàng)建(連接池申請(qǐng)連接)和斷開(kāi)(歸還連接池)一次連接操作,如果想要在一次請(qǐng)求中指定多個(gè)命令,則可以使用pipline實(shí)現(xiàn)一次請(qǐng)求指定多個(gè)命令,并且默認(rèn)情況下一次pipline 是原子性操作。

復(fù)制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import redis
 5  
 6 pool = redis.ConnectionPool(host='192.168.22.132', port=6379)
 7 r = redis.Redis(connection_pool=pool)
 8 
 9 # pipe = r.pipeline(transaction=False)
10 pipe = r.pipeline(transaction=True)
11 
12 pipe.set('name', 'root')
13 pipe.set('role', 'root')
14 
15 pipe.execute()
復(fù)制代碼

 

四、發(fā)布與訂閱

發(fā)布者:服務(wù)器

訂閱者:Dashboad和數(shù)據(jù)處理

redis_helper:

復(fù)制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 
 4 import redis
 5 
 6 class RedisHelper(object):
 7 
 8     def __init__(self):
 9         self.__conn = redis.Redis(host='localhost')   #連接本機(jī),ip不用寫(xiě)
10         self.chan_sub = 'fm104.5'
11         self.chan_pub = 'fm86'  #這個(gè)頻道沒(méi)用到啊...
12 
13     def public(self,msg):
14         self.__conn.publish(self.chan_sub,msg)
15         return True
16 
17     def subscribe(self):
18         pub = self.__conn.pubsub()
19         pub.subscribe(self.chan_sub)  #訂閱的頻道
20         pub.parse_response()  #準(zhǔn)備好監(jiān)聽(tīng)(再調(diào)用一次就是開(kāi)始監(jiān)聽(tīng))
21         return pub
復(fù)制代碼

redis訂閱:

復(fù)制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 
 4 from redis_helper import RedisHelper
 5 
 6 obj = RedisHelper()
 7 redis_sub = obj.subscribe()
 8 
 9 while True:
10     msg = redis_sub.parse_response()
11     print(msg)   #[b'message', b'fm104.5', b'who are you?']
12     # print(msg[2].decode('utf8'))
復(fù)制代碼

redis發(fā)布:

復(fù)制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 
 4 '''
 5 發(fā)布與訂閱是不同于存值取值,存值取值不需要同步,發(fā)布與訂閱是需要同步的
 6 '''
 7 '''
 8 #這樣是可以的,為了配套,使用下面的
 9 import redis
10 
11 obj = redis.Redis(password='helloworld')
12 obj.publish('fm104.5','hello')
13 
14 '''
15 
16 from redis_helper import RedisHelper
17 
18 obj = RedisHelper()
19 obj.public('hello')
復(fù)制代碼

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多