自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python運(yùn)維項(xiàng)目中用到的redis經(jīng)驗(yàn)及數(shù)據(jù)類型

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

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

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

 

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

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

  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集合是不能寫重復(fù)的內(nèi)容的

  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

兩個(gè)集合的交集之處

  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

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

  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)控平臺(tái)的內(nèi)存吃的厲害,他一下子蹦出一句,redis吃內(nèi)存肯定很大了。。。 nima,哥只是用他的大隊(duì)列。這里說下,redis做隊(duì)列的強(qiáng)度。一把來說100w條的隊(duì)列數(shù)據(jù),占用73M 內(nèi)存左 右。200w條數(shù)據(jù)內(nèi)存在154M內(nèi)存左右。  
 

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

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

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

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

對(duì)于redis的pub sub通信性能的問題,可以用gevent來搞定。直接導(dǎo)入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() 

當(dāng)然對(duì)于普通的set get sadd hset 也是可以配合redis來使用的。但是,沒啥優(yōu)勢(shì),因?yàn)閞edis只啟用了一個(gè)進(jìn)程針對(duì)數(shù)據(jù)的讀寫,咱們從程序中復(fù)用的那幾個(gè)連接,最后取數(shù)據(jù),還是需要調(diào)用那進(jìn)程,你還不如讓他老老實(shí)實(shí)的干活,別搞個(gè)多線程,讓他白白折騰。 我這邊做了壓力測(cè)試,python2.7用個(gè)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

責(zé)任編輯:林師授 來源: 51CTO
相關(guān)推薦

2020-12-17 09:25:46

運(yùn)維Prometheus監(jiān)控

2012-05-30 15:57:49

ERP項(xiàng)目運(yùn)維

2021-05-06 09:06:12

Vue Router組件視圖

2020-03-03 14:35:34

LinuxRedis命令

2013-04-12 13:30:47

2023-11-14 09:18:00

Python代碼

2009-06-24 17:34:58

使用JSF的經(jīng)驗(yàn)

2023-07-04 08:41:08

Redis數(shù)據(jù)類型

2022-08-24 09:50:40

系統(tǒng)運(yùn)維

2016-12-02 15:42:03

數(shù)據(jù)中心運(yùn)維管理

2023-10-17 07:57:56

Python數(shù)據(jù)類型

2010-03-11 15:56:15

Python列表

2010-08-16 15:06:15

DB2數(shù)據(jù)類型轉(zhuǎn)換

2024-05-28 07:01:29

2019-08-12 11:40:48

數(shù)據(jù)庫SQLite3數(shù)據(jù)類型

2015-12-14 13:54:51

百度運(yùn)維大數(shù)據(jù)

2011-06-30 13:41:52

系統(tǒng)運(yùn)維

2025-03-14 10:34:22

2023-11-13 08:31:25

SpringRedis存儲(chǔ)

2018-10-15 14:26:23

運(yùn)維IT技術(shù)架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)