ServiceStack.Redis的問題與修正

來源:互聯網
上載者:User

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的資料不重複。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.