Tôi đang triển khai lớp lưu trữ Redis bằng cách sử dụng ứng dụng khách Stackexchange Redis và hiệu suất hiện tại là tiếp giáp với không sử dụng được.StackExchange redis client rất chậm so với các bài kiểm tra benchmark
Tôi có môi trường cục bộ nơi ứng dụng web và máy chủ redis đang chạy trên cùng một máy. Tôi chạy thử nghiệm benchmark Redis chống lại máy chủ Redis của tôi và kết quả đã thực sự thực sự tốt (Tôi chỉ bao gồm thiết lập và nhận được hoạt động trong ghi của tôi trở lên):
C:\Program Files\Redis>redis-benchmark -n 100000
====== PING_INLINE ======
100000 requests completed in 0.88 seconds
50 parallel clients
3 bytes payload
keep alive: 1
====== SET ======
100000 requests completed in 0.89 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.70% <= 1 milliseconds
99.90% <= 2 milliseconds
100.00% <= 3 milliseconds
111982.08 requests per second
====== GET ======
100000 requests completed in 0.81 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.87% <= 1 milliseconds
99.98% <= 2 milliseconds
100.00% <= 2 milliseconds
124069.48 requests per second
Vì vậy, theo các tiêu chuẩn tôi đang xem xét trên 100.000 bộ và 100.000 được, mỗi giây. Tôi đã viết một bài kiểm tra đơn vị để làm 300.000 bộ/nhận:
private string redisCacheConn = "localhost:6379,allowAdmin=true,abortConnect=false,ssl=false";
[Fact]
public void PerfTestWriteShortString()
{
CacheManager cm = new CacheManager(redisCacheConn);
string svalue = "t";
string skey = "testtesttest";
for (int i = 0; i < 300000; i++)
{
cm.SaveCache(skey + i, svalue);
string valRead = cm.ObtainItemFromCacheString(skey + i);
}
}
này sử dụng các lớp sau đây để thực hiện các hoạt động Redis qua client Stackexchange:
using StackExchange.Redis;
namespace Caching
{
public class CacheManager:ICacheManager, ICacheManagerReports
{
private static string cs;
private static ConfigurationOptions options;
private int pageSize = 5000;
public ICacheSerializer serializer { get; set; }
public CacheManager(string connectionString)
{
serializer = new SerializeJSON();
cs = connectionString;
options = ConfigurationOptions.Parse(connectionString);
options.SyncTimeout = 60000;
}
private static readonly Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(options));
private static ConnectionMultiplexer Connection => lazyConnection.Value;
private static IDatabase cache => Connection.GetDatabase();
public string ObtainItemFromCacheString(string cacheId)
{
return cache.StringGet(cacheId);
}
public void SaveCache<T>(string cacheId, T cacheEntry, TimeSpan? expiry = null)
{
if (IsValueType<T>())
{
cache.StringSet(cacheId, cacheEntry.ToString(), expiry);
}
else
{
cache.StringSet(cacheId, serializer.SerializeObject(cacheEntry), expiry);
}
}
public bool IsValueType<T>()
{
return typeof(T).IsValueType || typeof(T) == typeof(string);
}
}
}
JSON serializer của tôi là chỉ sử dụng Newtonsoft.JSON :
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Caching
{
public class SerializeJSON:ICacheSerializer
{
public string SerializeObject<T>(T cacheEntry)
{
return JsonConvert.SerializeObject(cacheEntry, Formatting.None,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
}
public T DeserializeObject<T>(string data)
{
return JsonConvert.DeserializeObject<T>(data, new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
}
}
}
Thời gian thử nghiệm của tôi là khoảng 21 giây (cho 300.000 bộ và 300.000 lượt). Điều này mang lại cho tôi khoảng 28.500 hoạt động mỗi giây (ít nhất là 3 lần chậm hơn tôi mong đợi bằng cách sử dụng các tiêu chuẩn). Các ứng dụng tôi đang chuyển đổi để sử dụng Redis là khá chatty và yêu cầu nặng nhất định có thể xấp xỉ 200.000 tổng số hoạt động chống lại Redis. Rõ ràng là tôi đã không mong đợi bất cứ điều gì giống như tôi đã nhận được khi sử dụng bộ nhớ cache thời gian chạy hệ thống, nhưng sự chậm trễ sau khi thay đổi này là đáng kể. Tôi có làm điều gì đó sai với việc thực hiện của tôi và không ai biết tại sao số liệu đo điểm chuẩn của tôi nhanh hơn rất nhiều so với con số kiểm tra Stackechange của tôi?
Cảm ơn, Paul
Tôi tự hỏi tại sao pipelining sản xuất thông lượng thấp hơn so với xử lý đồng bộ? – Kobynet
@Kobynet câu hỏi công bằng; có thể chi phí TPL trong trường hợp cụ thể này; Tôi không có thời gian để kéo nó ra –
Cảm ơn Marc, điều này thực sự đã giúp tôi! Tôi sẽ cần phải tái cấu trúc ứng dụng (kế thừa) này thành đa luồng và không đồng bộ để có được hiệu suất tốt nhất. Tôi xin lỗi rằng nó không phải là tất cả rõ ràng từ mã tôi dán nhưng tôi đã tránh tất cả serialization trong trường hợp thử nghiệm của tôi. Bạn hoàn toàn đúng rằng tôi đã không so sánh như cho (như sử dụng một tải trọng khác nhau và kiểm tra đơn vị của tôi không song song) vì vậy tôi hoàn toàn thấy lý do tại sao các con số rất khác nhau. Cảm ơn một lần nữa! –