ServiceStack.Redis的问题与修正
生活随笔
收集整理的這篇文章主要介紹了
ServiceStack.Redis的问题与修正
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Redis是開源、高性能的Key-value存儲引擎。
最近我們在一個日訪問量約1kw的網站上使用redis替換以前的memcache,成功將CPU從30%下降到15%,效果相當顯著。
ServiceStackRedis是最受歡迎的C#驅動之一。關于如何使用ServiceStackRedis請參見這里——使用ServiceStackRedis鏈接Redis簡介
不過我們在使用ServiceStackRedis的線程池(PooledRedisClientManager)還是碰到了不少問題。
1 鏈接數異常。
一個webserver會占用80個鏈接。當15臺webserver就過千了,這時會出現有些客戶端鏈接不上的情況。
解決方案:
GetInActiveWriteClient方法中
//找下一個目標//從當前讀寫指針的后面開始查找,而不是從0開始
var?nextIndex?=?(WritePoolIndex?+?i)?%?writeClients.Length;
更改為
var?nextIndex?=?i;
同時修改DisposeClient方法中將readClient.Active?==?false將DisposeConnection一下。線程就能很好的回收了。
效果:
在我們這樣一個網站下,單臺webserver大約會占用10個~15個鏈接,比之前的80個少了不少。
分析:
從代碼上來看,作者的初衷是為了更快的找到空閑的線程,但是卻認所有線程都不間斷的使用,沒有一個線程可能空閑。
如果站點較小,webserver不太多,不改問題也不大。不過我認為用長鏈接并不劃算,因為與redis建立一個鏈接還是相對比較“便宜”的。
2 多臺redis存儲相同的內容。
相同的內容會冗余在所有redis中
解決方案
在GetInActiveWriteClient中加入int型參數來標識出使用那臺redis
var?start?=?0;
var?step?=?1;
if?(index?>?-1?&&?index?<?ReadWriteHosts.Count)
{
start?=?index;
step?=?ReadWriteHosts.Count;
}
//遍歷讀寫池
//這個時候池是鎖定的
for?(var?i?=?start;?i?<?writeClients.Length;?i?+=?step)
{
省略
這樣線程池中就會按ReadWriteHosts的個數來順序分配。
效果:
在進行讀寫時只需要使用key.GetHashCode方法獲得一個hash值就能準確分配到其中一臺redis上。保證所有的redis的數據不重復。
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的ServiceStack.Redis的问题与修正的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《当程序员的那些狗日日子》(三十三)昙花
- 下一篇: 修改MySQL字段为首字母大写