Node.js~ioredis處理耗時請求時連線數瀑增
阿新 • • 發佈:2018-12-29
關於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
產生它的原因有幾個:
- 單個請求使用結果後,沒有釋放,client.end()沒有使用,這主要是redis元件
- 而使用了ioredis元件後,需要redis會自動釋放,但時機也是http請求結束之後才執行,所以對於長時間沒有響應的請求,也會出現佔用redis執行緒的問題,解決方法手動使用redis.quit()即可
- 單個請求時間過長,導師redis連線一直被一個請求佔用,而在請求數過多時,這種現象就會引用連線池不夠用
- 多執行緒環境下(非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:6379new 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://:[email protected]: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的具體操作!
感謝各位的閱讀!