文章出處

回到目錄

關于redis連接數過高的解釋

對于node.js開發環境里,使用傳統的redis或者使用ioredis都是不錯的選擇,而在處理大數據請求程中,偶爾出現了連接池( redis服務端的最大可用連接數,默認為1萬)不夠用的情況,一般的提示如下:

It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail

在redis-cli上輸入info命令也可以進行查看

 redis-server.conf里配置了它默認的最大連接數

maxclients 10000

產生它的原因有幾個:

  1. 單個請求使用結果后,沒有釋放,client.end()沒有使用,這主要是redis組件
  2. 而使用了ioredis組件后,需要redis會自動釋放,但時機也是http請求結束之后才執行,所以對于長時間沒有響應的請求,也會出現占用redis線程的問題,解決方法手動使用redis.quit()即可
  3. 單個請求時間過長,導師redis連接一直被一個請求占用,而在請求數過多時,這種現象就會引用連接池不夠用
  4. 多線程環境下(非node.js),使用了實例模塊,而沒有使用單例模式,因為很多redis驅動是支持多路復用的

大叔建議的作法:

減少單次請求的響應時間,建議把redis從一個大請求中拿出來,因為純redis還是很快的

正確使用redis組件,用完就關了

正確理解多線程與socket連接,要知道socket連接直接影響你的服務器CPU性能

ioredis代碼實例

ioredis是個好東西,它完全支持了redis的cluster,sentinal等新技術

new Redis()       // Connect to 127.0.0.1:6379
new Redis(6380)   // 127.0.0.1:6380
new Redis(6379, '192.168.1.1')        // 192.168.1.1:6379
new Redis('/tmp/redis.sock')
new Redis({
  port: 6379,          // Redis port
  host: '127.0.0.1',   // Redis host
  family: 4,           // 4 (IPv4) or 6 (IPv6)
  password: 'auth',
  db: 0
})

同時支持標準的字符連接串

// Connect to 127.0.0.1:6380, db 4, using password "authpassword":
new Redis('redis://:authpassword@127.0.0.1:6380/4')

支持發布與訂閱,它會存儲在進程里,它不會被持久化,所有會有消息丟失的情況

var Redis = require('ioredis');
var redis = new Redis();
var pub = new Redis();
redis.subscribe('news', 'music', function (err, count) {
  // Now we are subscribed to both the 'news' and 'music' channels.
  // `count` represents the number of channels we are currently subscribed to.

  pub.publish('news', 'Hello world!');
  pub.publish('music', 'Hello again!');
});

好了,下次我們有時間去講講ioredis的具體操作!

感謝各位的閱讀!

 回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()