qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Redis和Ssdb讀取性能對比

          最近關注了一下ssdb,它的特點是基于文件存儲系統所以它支撐量大的數據而不因為內存的限制受取約束.從官網的測試報告來看其性能也非常出色和redis相當,因此可以使用它來代替redis來進行k-v數據業務的處理.想法總是美好的,不過現實中就可能帶點骨感.
            幸好ssdb是兼容redis的部份協議,所以直接用redis client庫就可以進行一個壓力測試.以于針對Redis和ssdb的幾個讀操進行一個簡單的性能測試對比,這個測試不是直接在本機調用Redis和ssdb. 而是通過一個程序在別的服務器上調用.測試指令(get,hget,lregion)以下是測試結果截圖
          class Test
          {
          long mCount = 0;
          long mIndex = 0;
          private bool mRuning = true;
          public long Count
          {
          get
          {
          return mCount;
          }
          }
          public void Execute()
          {
          Console.WriteLine("* -----------------------------------------------");
          Console.WriteLine("* redis get");
          ConsoleWait.Start();
          string result = OnTest(Config.RedisClient,GetHandler);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* ssdb get");
          ConsoleWait.Start();
          result = OnTest(Config.SSDBClient, GetHandler);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* -----------------------------------------------");
          //
          Console.WriteLine("* redis lregion[1-2]");
          ConsoleWait.Start();
          result = OnTest(Config.RedisClient, LRegionHandler1TO2);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* ssdb lregion[1-2]");
          ConsoleWait.Start();
          result = OnTest(Config.SSDBClient, LRegionHandler1TO2);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* -----------------------------------------------");
          //
          Console.WriteLine("* redis lregion[50-60]");
          ConsoleWait.Start();
          result = OnTest(Config.RedisClient, LRegionHandler1TO2);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* ssdb lregion[50-60]");
          ConsoleWait.Start();
          result = OnTest(Config.SSDBClient, LRegionHandler1TO2);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* -----------------------------------------------");
          //
          Console.WriteLine("* redis lregion[100-110]");
          ConsoleWait.Start();
          result = OnTest(Config.RedisClient, LRegionHandler1TO2);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* ssdb lregion[100-110]");
          ConsoleWait.Start();
          result = OnTest(Config.SSDBClient, LRegionHandler1TO2);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* -----------------------------------------------");
          //
          Console.WriteLine("* redis hget");
          ConsoleWait.Start();
          result = OnTest(Config.RedisClient, HGetHandler);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* ssdb hget");
          ConsoleWait.Start();
          result = OnTest(Config.SSDBClient, HGetHandler);
          ConsoleWait.End();
          Console.WriteLine(result);
          Console.WriteLine("* -----------------------------------------------");
          }
          private void HGetHandler(RedisClient e)
          {
          while (mRuning)
          {
          long index = System.Threading.Interlocked.Increment(ref mIndex);
          ProtobufKey key = "user_" + Data.Import.Users[(int)(index % Data.Import.Users.Count)].Name;
          key.Get<Model.Order, Model.Employee, Model.Customer>(e);
          System.Threading.Interlocked.Increment(ref mCount);
          }
          }
          private void LRegionHandler1TO2(RedisClient e)
          {
          while (mRuning)
          {
          ProtobufList<Model.Order> list = "Orders";
          list.Range(1, 2, e);
          System.Threading.Interlocked.Increment(ref mCount);
          }
          }
          private void LRegionHandler50TO60(RedisClient e)
          {
          while (mRuning)
          {
          ProtobufList<Model.Order> list = "Orders";
          list.Range(50, 60, e);
          System.Threading.Interlocked.Increment(ref mCount);
          }
          }
          private void LRegionHandler100TO110(RedisClient e)
          {
          while (mRuning)
          {
          ProtobufList<Model.Order> list = "Orders";
          list.Range(100, 110, e);
          System.Threading.Interlocked.Increment(ref mCount);
          }
          }
          private  void GetHandler(RedisClient e)
          {
          while (mRuning)
          {
          long index = System.Threading.Interlocked.Increment(ref mIndex);
          ProtobufKey key = "user_" + Data.Import.Users[(int)(index % Data.Import.Users.Count)].Name;
          key.Get<Model.User>(e);
          System.Threading.Interlocked.Increment(ref mCount);
          }
          }
          private string OnTest(RedisClient client,Action<RedisClient> handler)
          {
          mCount = 0;
          mRuning = true;
          for (int i = 0; i < 20; i++)
          {
          System.Threading.ThreadPool.QueueUserWorkItem((o) =>
          {
          GetHandler((RedisClient)o);
          }, client);
          }
          int s = 20;
          while (s > 0)
          {
          System.Threading.Thread.Sleep(1000);
          s--;
          }
          mRuning = false;
          System.Threading.Thread.Sleep(1000);
          return string.Format("* [seconds:{1}/total:{0}]", mCount, mCount / 20);
          }
          }
            從測試結果看來差距還是非常明顯,并不象官網那樣說得這么理想.雖然SSDB效率上不如REDIS,但其基于磁盤存儲有著其最大的優勢,畢竟很多業務數據遠超過服務器內存的容量.
            SSDB的測試結果不理想也許是硬件環境受限,如果有個SSD硬盤的測試環境估計也得到一個更好的結果,但在測試過程中發現一個問題就是SSDB占用的CPU資源也是非常大的,在以上測試過程SSDB的并發效率比不上REDIS,同時CPU損耗上基本要比REDIS高出一倍的樣子.
            以上測試結果緊緊是是一些情況下的性能測試對比,不能完全表述出兩者在應用的差距的結果,如果需要用到這些產品的同學不防在實施前進行一些測試為實施選擇提供一個更可靠的結果.
           

          posted on 2014-08-27 10:19 順其自然EVO 閱讀(352) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 余江县| 库伦旗| 防城港市| 洪雅县| 迭部县| 洛阳市| 拉孜县| 宜阳县| 武乡县| 安丘市| 安塞县| 万全县| 安宁市| 陇南市| 南康市| 玉林市| 新野县| 恩平市| 泸定县| 察隅县| 肥西县| 莱阳市| 连云港市| 汕尾市| 郧西县| 兴国县| 绥阳县| 镇雄县| 舟山市| 佛坪县| 乌什县| 随州市| 米易县| 凭祥市| 饶阳县| 三亚市| 蒙山县| 金昌市| 金川县| 武平县| 巴里|