日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Python運維項目中用到的redis經驗及數(shù)據類型

先感嘆下,學東西一定要活學活用!   我用redis也有幾年的歷史了,今個才想到把集合可以當python list用。  最近做了幾個項目都摻雜了redis, 遇到了一些個問題和開發(fā)中提高性能的方法,這都分享出來,共同學習。

下面先簡單講講Redis集合的數(shù)據類型。

Sets 就是一個集合,集合的概念就是一堆不重復值的組合。利用Redis提供的Sets數(shù)據結構,可以存儲一些集合性的數(shù)據,比如在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis還為集合提供了求交集、并集、差集等操作,可以非常方便的實現(xiàn)如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。  上面說的是新浪微博的應用。

sadd,創(chuàng)建一個集合,并添加數(shù)據。

 
 
  1. [root@66 ~]# redis-cli   
  2. redis 127.0.0.1:6379>    
  3. redis 127.0.0.1:6379>    
  4. redis 127.0.0.1:6379> sadd xiaorui aaa   
  5. (integer) 1   
  6. redis 127.0.0.1:6379> sadd xiaorui bbb   
  7. (integer) 1   
  8. redis 127.0.0.1:6379> sadd xiaorui ccc   
  9. (integer) 1   
  10. redis 127.0.0.1:6379>    
  11. redis 127.0.0.1:6379> SMEMBERS xiaorui   
  12. 1) "aaa" 
  13. 2) "ccc" 
  14. 3) "bbb" 
  15. redis 127.0.0.1:6379>    
  16. redis 127.0.0.1:6379> 

set集合是不能寫重復的內容的

 
 
  1. redis 127.0.0.1:6379> sadd xiaorui fuck_shencan   
  2. (integer) 1   
  3. redis 127.0.0.1:6379> sadd xiaorui fuck_shencan   
  4. (integer) 0   
  5. redis 127.0.0.1:6379> 

查看集合的大小

 
 
  1. redis 127.0.0.1:6379> SCARD xiaorui   
  2. (integer) 3   
  3. redis 127.0.0.1:6379> 

刪除

 
 
  1. redis 127.0.0.1:6379> SREM xiaorui aaa   
  2. (integer) 1   
  3. redis 127.0.0.1:6379> SMEMBERS xiaorui   
  4. 1) "ccc" 
  5. 2) "bbb" 
  6. redis 127.0.0.1:6379> 

兩個集合的交集之處

 
 
  1. redis 127.0.0.1:6379> SADD key1 a   
  2. (integer) 1   
  3. redis 127.0.0.1:6379> SADD key1 b   
  4. (integer) 1   
  5. redis 127.0.0.1:6379> SADD key1 c   
  6. (integer) 1   
  7. redis 127.0.0.1:6379> SADD key2 c   
  8. (integer) 1   
  9. redis 127.0.0.1:6379> SADD key2 d   
  10. (integer) 1   
  11. redis 127.0.0.1:6379> SADD key2 e   
  12. (integer) 1   
  13. redis 127.0.0.1:6379> SINTER key1 key2   
  14. 1) "c" 
  15. redis 127.0.0.1:6379> 

可以把集合當成redis list隊列用,需要注意的是set集合的成員模式是不能有重復的值的。如果你的值不重復,你又蛋疼,還真的可以把set集合當成隊列使用。

 
 
  1. redis 127.0.0.1:6379> sadd myset one   
  2. (integer) 1   
  3. redis 127.0.0.1:6379> sadd myset two   
  4. (integer) 1   
  5. redis 127.0.0.1:6379> sadd myset three   
  6. (integer) 1   
  7. redis 127.0.0.1:6379> SPOP myset   
  8. "one" 
  9. redis 127.0.0.1:6379> SMEMBERS myset   
  10. 1) "three" 
  11. 2) "two" 
  12. redis 127.0.0.1:6379>  

前兩天和朋友說,我那監(jiān)控平臺的內存吃的厲害,他一下子蹦出一句,redis吃內存肯定很大了。。。 nima,哥只是用他的大隊列。這里說下,redis做隊列的強度。一把來說100w條的隊列數(shù)據,占用73M 內存左 右。200w條數(shù)據內存在154M內存左右。  

redis的堵塞取任務,最好少用,超過5個線程去brpop的話,會把redis的cpu使用率頂?shù)?0%左右,而且嚴重會影響別的進程的訪問,如果確定任務不是每時每刻都有的情況下,最好在你的程序控制下他的訪問頻次和時間的間隔。

python處理redis的時候,最好要用pool,速度和資源明顯的節(jié)省。 

 
 
  1. >>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)  
  2. >>> r = redis.Redis(connection_pool=pool) 

新版的redis是支持管道的,pipline !   有朋友不太理解,這里的管道有什么好處。 pyhton 雖然連接redis的時候用了連接池,但是這也只是連接方面做了keepalive而已,但是每次的命令推送,他還是一次命令一個交互的。 用了pipline管道堵塞后,他會把所有的命令合成一個管道符推送到redis服務端。這樣的話就省事了很多。  這個特別適用于并發(fā)大的時候。

對于redis的pub sub通信性能的問題,可以用gevent來搞定。直接導入gevent猴子就可以了。

 
 
  1. import gevent.monkey   
  2. gevent.monkey.patch_all()   
  3. #http://rfyiamcool.blog./1030776/1435539    
  4. import os   
  5. import sys   
  6. import fcntl   
  7. import gevent   
  8. from gevent.socket import wait_read   
  9.      
  10. from redis import Redis   
  11.      
  12. PID = os.getpid()   
  13.      
  14. red = Redis('localhost')   
  15.      
  16. def echo_stdin():   
  17.     # make stdin non-blocking   
  18.     fcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)   
  19.     red.publish('echo', "[%i] joined" % (PID,))   
  20.     while True:   
  21.         wait_read(sys.stdin.fileno())   
  22.         l = sys.stdin.readline().strip()   
  23.         s = "[%i] %s" % (PID, l)   
  24.         # save to log   
  25.         red.rpush('echo_log', s)   
  26.         # publish message   
  27.         red.publish('echo', s)   
  28.         if l == 'quit':   
  29.             break 
  30.      
  31. def handler():   
  32.     pubsub = red.pubsub()   
  33.     # first subscribe, then print log (no race condition this way)   
  34.     pubsub.subscribe('echo')   
  35.     # print log   
  36.     for line in red.lrange('echo_log', 0, -1):   
  37.         print '.', line   
  38.     # print channel   
  39.     for msg in pubsub.listen():   
  40.         print '>', msg['data']   
  41.      
  42. gevent.spawn(handler)   
  43. gevent.spawn(echo_stdin).join() 

當然對于普通的set get sadd hset 也是可以配合redis來使用的。但是,沒啥優(yōu)勢,因為redis只啟用了一個進程針對數(shù)據的讀寫,咱們從程序中復用的那幾個連接,最后取數(shù)據,還是需要調用那進程,你還不如讓他老老實實的干活,別搞個多線程,讓他白白折騰。 我這邊做了壓力測試,python2.7用個gevent后,批量的讀寫沒什么突出的增長。

 
 
  1. >>> import geventredis   
  2. >>> redis_client = geventredis.connect('127.0.0.1', 6379)   
  3. >>> redis_client.set('foo', 'bar')   
  4. 'OK' 
  5. >>> for msg in redis_client.monitor():   
  6.        print msg 

博文地址:http://rfyiamcool.blog./1030776/1435539


網頁名稱:Python運維項目中用到的redis經驗及數(shù)據類型
文章路徑:http://www.5511xx.com/article/dhhehgg.html