• 『性能』ServiceStack.Redis 和 StackExchange.Redis 性能比较


    背景

    近来,需要用到 Redis 这类缓存技术 —— MongoDB 和 Redis 没有进行过比较。

    我也懒得在这些细节上 纠结那么多 —— 按照网友给出的文章,听从网友建议,选择 Redis。

    Redis 我在 2014年的时候正式用过一次,那时候用的是 ServiceStack.Redis —— 要引用4、5个程序集,挺闹心的。

    正题

    开始比较 客户端调用时, ServiceStack.Redis 与 StackExchange.Reids 的性能。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using ServiceStack.Redis;
    using StackExchange.Redis;
    
    namespace Temp_20180713_Redis
    {
        class Program
        {
            static void Main(string[] args)
            {
                DateTime time0 = DateTime.Now;
                DateTime time1 = DateTime.Now;
    
    
    
    
                #region  StackExchange.Redis
    
                {
                    IConnectionMultiplexer proxy = ConnectionMultiplexer.Connect("127.0.0.1");
                    IDatabase db = proxy.GetDatabase(6379);
    
    
    
                    time0 = DateTime.Now;
                    for (int i = 0; i < 100000; i++)
                    {
                        db.StringSet("AAAA", "AAAAAAA");
                    }
                    time1 = DateTime.Now;
                    Console.WriteLine("StackExchange.Redis 赋值 10,0000 次, 耗时: {0} 秒", (time1 - time0).TotalSeconds);
    
    
    
                    string valueStr = "";
                    time0 = DateTime.Now;
                    for (int i = 0; i < 100000; i++)
                    {
                        RedisValue value = db.StringGet("AAAA");
                        valueStr = value;
                    }
                    time1 = DateTime.Now;
                    Console.WriteLine("StackExchange.Redis 取值 10,0000 次, 耗时: {0} 秒", (time1 - time0).TotalSeconds);
                    Console.WriteLine(valueStr);
                    Console.WriteLine("----------------------------------");
                }
    
                #endregion
    
    
    
    
                #region  ServiceStack.Redis
    
    
                using (RedisClient redisClient = new RedisClient("127.0.0.1", 6379))
                {
                    time0 = DateTime.Now;
                    for (int i = 0; i < 100000; i++)
                    {
                        redisClient.Set("AAAA", "AAAAAAA");
                    }
                    time1 = DateTime.Now;
                    Console.WriteLine("ServiceStack.Redis 赋值 10,0000 次, 耗时: {0} 秒", (time1 - time0).TotalSeconds);
    
    
    
                    string valueStr = "";
                    time0 = DateTime.Now;
                    for (int i = 0; i < 100000; i++)
                    {
                        valueStr = redisClient.Get<string>("AAAA");
                    }
                    time1 = DateTime.Now;
                    Console.WriteLine("ServiceStack.Redis 取值 10,0000 次, 耗时: {0} 秒", (time1 - time0).TotalSeconds);
                    Console.WriteLine(valueStr);
                    Console.WriteLine("----------------------------------");
                }
    
    
    
                #endregion
    
            }
        }
    }
    

    比较结果如图:

    没错: ServiceStack.Redis 居然崩溃了:每小时只能调用 6000次,除非购买商用版。【别说商用了,6000次,我个人使用都不够啊】

    我将 ServiceStack.Redis 降级到 3.9.40 版本,继续测试

    结论

    同样的 10W次 赋值、取值 调用。

    StackExchange.Redis 耗时 18秒

    ServiceStack.Redis 耗时 16秒

    —— ServiceStack.Redis 性能高一点点。

    建议

    但最终:我还是觉得应该选择 StackExchange.Redis

    理由如下:

    1. StackExchange.Redis 和 ServiceStack.Redis 两者性能差距不大,性能差别仅 11%

    2. StackExchange.Redis 没有版权限制,暂时没有出现 不给钱只调用 6000 次。

    3. 我看了一下 两个框架的函数定义: StackExchange.Redis 定义得更友善一些。反例比如:ServiceStack.Redis 有 Hash字段赋值函数,却没有 Hash字段取值函数(除非你把指定的Hash 全部键值对都取出来,然后再筛选指定的字段 —— 那些不需要的也得取出来,感觉挺浪费的)

    4. 而且某些地方的 隐式转换 可以节省不少代码:自动帮你推断你想要的数据类型。

    当然,两者的实现原理 我这边并未深究,也懒得深究。

    其实,我也不知道 StackExchange.Redis 是否支持 .Net 40 —— 否则就真的是一大败笔了。

    其实我想要的很简单

    1. 最低支持 .Net 40。

    2. 没有过分的使用限制(比如每小时6000次)。

    3. 不要引用一堆的程序集,最好一个程序集就行。

    4. 友好的函数封装

     

     

    我特别讨厌,一个三方框架好几个程序集

    如果这个框架,实现的功能比较多,好几个程序集区分功能 我可以理解。

    你特么就只实现一个功能,却稀里糊涂给我一堆程序集 是个什么鬼 ~

    看到太多程序集,我会有一种不安全感:

    如果发布时少了个程序集怎么办?

    程序集少更新了其中一个怎么办?

    这些程序集在偷偷干嘛?

    如果复制程序集时,把部分64位的复制替换了了32位而导致执行时(可能是偶发异常)才报错怎么办?)

    就不能把 附属程序集 嵌入到主程序集中么?要么内存加载子程序集,要么自动释放子程序集。

    我只想无脑的 Ctrl+C Ctrl+V,我不想 复制粘贴时 还要顾忌这、担心那。

  • 相关阅读:
    Python 实践
    Keras实践
    NLP S实践
    Spark java 实践
    Seaborn数据探索可视化
    Linux实践
    Redis
    ML算法选型
    Elasticsearch issue
    牛客练习赛37
  • 原文地址:https://www.cnblogs.com/shuxiaolong/p/ServiceStack_Redis_StackExchange_Redis.html
Copyright © 2020-2023  润新知