在将数据保存到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/