成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python運維項目中用到的redis經驗及數據類型

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

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

下面先簡單講講Redis集合的數據類型。

 

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

sadd,創建一個集合,并添加數據。

  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>  

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

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

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

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

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

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

  1. import gevent.monkey   
  2. gevent.monkey.patch_all()   
  3. #http://rfyiamcool.blog.51cto.com/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來使用的。但是,沒啥優勢,因為redis只啟用了一個進程針對數據的讀寫,咱們從程序中復用的那幾個連接,最后取數據,還是需要調用那進程,你還不如讓他老老實實的干活,別搞個多線程,讓他白白折騰。 我這邊做了壓力測試,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.51cto.com/1030776/1435539

責任編輯:林師授 來源: 51CTO
相關推薦

2020-12-17 09:25:46

運維Prometheus監控

2012-05-30 15:57:49

ERP項目運維

2021-05-06 09:06:12

Vue Router組件視圖

2020-03-03 14:35:34

LinuxRedis命令

2013-04-12 13:30:47

2009-06-24 17:34:58

使用JSF的經驗

2023-11-14 09:18:00

Python代碼

2022-08-24 09:50:40

系統運維

2016-12-02 15:42:03

數據中心運維管理

2023-07-04 08:41:08

Redis數據類型

2024-05-28 07:01:29

2023-10-17 07:57:56

Python數據類型

2010-08-16 15:06:15

DB2數據類型轉換

2019-08-12 11:40:48

數據庫SQLite3數據類型

2010-03-11 15:56:15

Python列表

2018-10-15 14:26:23

運維IT技術架構

2011-06-30 13:41:52

系統運維

2015-12-14 13:54:51

百度運維大數據

2010-08-17 13:23:49

2014-04-02 10:56:21

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美韩一区二区 | 午夜精品一区二区三区在线 | 欧洲高清转码区一二区 | 亚洲精色| 日本午夜一区二区三区 | 欧美精品乱码久久久久久按摩 | 一区二区高清不卡 | 少妇特黄a一区二区三区88av | www国产精品 | 日韩免费一级 | 九九一级片| 成人在线免费网站 | 搞黄网站在线观看 | 麻豆一区二区三区精品视频 | 日本一二三区电影 | 亚洲精品二区 | 国产乱性 | 免费成人av网站 | 亚洲91视频 | 国产精产国品一二三产区视频 | 久久久福利 | 久久国产一区 | 久草新视频| 免费能直接在线观看黄的视频 | 99精彩视频 | 国产日韩av一区二区 | 国产一区二区三区在线 | 男女午夜免费视频 | 成人免费网站 | 国产福利视频网站 | 日韩中文字幕 | 福利视频网站 | 9191成人精品久久 | 精品av天堂毛片久久久借种 | 日韩视频在线一区 | 午夜影院视频在线观看 | 日韩视频区 | 俺去俺来也www色官网cms | 正在播放国产精品 | 国产一区免费 | 成人av网站在线观看 |