在将数据保存到redis缓存时,我的性能非常差。
脚本:
1)利用redis缓存服务(微软azure提供)。
2)在azure上创建的虚拟机中运行代码。
3)虚拟机和缓存服务都在同一位置创建
代码段:

    public void MyCustomFunction()
    {
        Stopwatch totalTime = Stopwatch.StartNew();

        RedisEndpoint config = new RedisEndpoint();
        config.Ssl = true;
        config.Host = "redis.redis.cache.windows.net";
        config.Password = Form1.Password;
        config.Port = 6380;
        RedisClient client = new RedisClient(config);

        int j = 0;

        for (int i = 0; i < 500; i++)
        {
            var currentStopWatchTime = Stopwatch.StartNew();
            var msgClient = client.As<Message>();

            List<string> dataToUpload = ClientData.GetRandomData();
            string myCachedItem_1 = dataToUpload[1].ToString();

            Random ran = new Random();
            string newKey = string.Empty;
            newKey = Guid.NewGuid().ToString();

            Message newItem = new Message
            {
                Id = msgClient.GetNextSequence(), // Size : Long variable
                //Id = (long)ran.Next(),
                Key = j.ToString(),             // Size: Int32 variable
                Value = newKey,                 // Size : Guid string variable
                Description = myCachedItem_1    // Size : 5 KB
            };

            string listName = ran.Next(1, 6).ToString();
            msgClient.Lists[listName].Add(newItem);
            //msgClient.Store(newItem);

            Console.WriteLine("Loop Count : " + j++ + " , Total no. of items in List : " + listName + " are : " + msgClient.Lists[listName].Count);

            Console.WriteLine("Current Time: " + currentStopWatchTime.ElapsedMilliseconds + " Total time:" + totalTime.ElapsedMilliseconds);

            Console.WriteLine("Cache saved");
        }
    }

性能(保存时):
注意:(所有时间均以毫秒为单位)
循环计数:0,列表中的项目总数:2为:1
当前时间:310总时间:342
缓存已保存
循环计数:1,列表中的项目总数:3为:1
当前时间:6总时间:349
缓存已保存
循环计数:2,列表中的项目总数:5为:1
当前时间:3总时间:353
缓存已保存
循环计数:3,列表中的项目总数:5为:2
当前时间:3总时间:356
缓存已保存
循环计数:4,列表中的项目总数:5为:3
当前时间:3总时间:360
缓存已保存
.
.
.
.
.
循环计数:330,列表中的项目总数:4为:69
当前时间:2总时间:7057
缓存已保存
循环计数:331,列表中的项目总数:4为:70
当前时间:3总时间:7061
缓存已保存
循环计数:332,列表中的项目总数:4为:71
当前时间:2总时间:7064
缓存已保存
性能(获取时)
列表:1
项目编号:110
时间:57
列表:2
项目数量:90
时间:45
列表:3
项目编号:51
时间:23
列表:4
项目数量:75
时间:32
列表:5
项目编号:63
时间:33

最佳答案

如果是分批处理,则应考虑减少同步网络请求的数量,以减少延迟,这将是与网络服务通信时的主要性能问题。
在本例中,您在调用时读取:

msgClient.GetNextSequence();

当你写下:
msgClient.Lists[listName].Add(newItem);

这是一个线程中总共1000个同步请求/应答网络请求,其中每个操作都是依赖的,必须在发送下一个操作之前完成,这就是为什么网络延迟将成为性能问题的一个主要来源,您应该考虑对其进行优化。
批处理请求
如果要处理批处理请求,可以通过在单个请求中获取所有id并使用AddRange()批处理操作存储它们来减少读写次数,从而大大优化此操作,例如:
var redisMessages = Redis.As<Message>();
const int batchSize = 500;

//fetch next 500 sequence of ids in a single request
var nextIds = redisMessages.GetNextSequence(batchSize);

var msgBatch = batchSize.Times(i =>
    new Message {
        Id = nextIds - (batchSize - i) + 1,
        Key = i.ToString(),
        Value = Guid.NewGuid().ToString(),
        Description = "Description"
    });

//Store all messages in a single multi operation request
redisMessages.Lists[listName].AddRange(msgBatch);

这将把1000个redis操作压缩为2个操作。
如果需要,还可以使用以下命令获取所有邮件:
var allMsgs = redisMessages.Lists[listName].GetAll();

或使用GetRange(startingFrom,endingAt)api的特定范围。

关于caching - 保存到Redis缓存时性能不佳(使用ServiceStack.Redis),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29332958/

10-16 23:49