Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Dữ liệu tập hợp hàng loạt từ Dictionary vào Redis

"just" là một thuật ngữ rất tương đối và không thực sự có ý nghĩa nếu không có thêm ngữ cảnh, cụ thể là:những trọng tải này lớn đến mức nào?

tuy nhiên, để làm rõ một số điểm giúp bạn điều tra:

  • không cần khóa IDatabase trừ khi đó hoàn toàn là vì mục đích của riêng bạn; SE.Redis đề cập đến vấn đề an toàn nội bộ và dự định sẽ được sử dụng bởi các chủ đề cạnh tranh
  • hiện tại, thời gian của bạn về việc này sẽ bao gồm tất cả mã tuần tự hóa (JsonConvert.SerializeObject ); điều này sẽ tăng lên, đặc biệt là nếu đồ vật của bạn lớn; để có được một biện pháp phù hợp, tôi thực sự khuyên bạn nên tính thời gian tuần tự hóa và xác định lại thời gian riêng biệt
  • batch.Execute() phương thức sử dụng API đường ống và không đợi phản hồi giữa các cuộc gọi, vì vậy:thời gian bạn thấy không tác động tích lũy của độ trễ; chỉ để lại CPU cục bộ (để tuần tự hóa), băng thông mạng và CPU máy chủ; các công cụ của thư viện khách hàng không thể ảnh hưởng đến bất kỳ điều nào trong số đó
  • có một StringSet quá tải chấp nhận KeyValuePair<RedisKey, RedisValue>[]; bạn có thể chọn sử dụng cái này thay vì hàng loạt, nhưng sự khác biệt duy nhất ở đây là nó là MSET varadic chứ không phải nhiều đối tượng SET; một trong hai cách, bạn sẽ chặn kết nối cho những người gọi khác trong thời gian (vì mục đích của hàng loạt là làm cho các lệnh liền nhau)
  • bạn không thực sự cần sử dụng CreateBatch ở đây, đặc biệt là vì bạn đang khóa cơ sở dữ liệu (nhưng tôi vẫn khuyên bạn không cần phải làm điều này); mục đích của CreateBatch là tạo một chuỗi lệnh tuần tự , nhưng tôi không thấy rằng bạn cần cái này ở đây; bạn chỉ có thể sử dụng _database.StringSetAsync cho mỗi lệnh lần lượt, điều này sẽ cũng có lợi thế là bạn đang chạy tuần tự hóa song song với lệnh trước đó được gửi - nó sẽ cho phép bạn chồng chéo tuần tự hóa (liên kết CPU) và thực hiện lại (liên kết IO) mà không cần thực hiện bất kỳ công việc nào ngoại trừ xóa CreateBatch gọi điện; điều này cũng có nghĩa là bạn không độc quyền kết nối từ những người gọi khác

Cho nên; đầu tiên điều tôi sẽ làm là loại bỏ một số mã:

private static StackExchange.Redis.IDatabase _database;
static JsonSerializerSettings _redisJsonSettings = new JsonSerializerSettings {
    ContractResolver = new SerializeAllContractResolver(),
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore };

public void SetAll<T>(Dictionary<string, T> data, int cacheTime)
{
    TimeSpan expiration = new TimeSpan(0, cacheTime, 0);
    var list = new List<Task<bool>>();
    foreach (var item in data)
    {
        string serializedObject = JsonConvert.SerializeObject(
            item.Value, Formatting.Indented, _redisJsonSettings);

        list.Add(_database.StringSetAsync(item.Key, serializedObject, expiration));
    }
    Task.WhenAll(list.ToArray());
}

Điều thứ hai tôi sẽ làm là tính thời gian tuần tự hóa riêng biệt cho công việc của redis.

Điều cuối cùng tôi sẽ làm là xem liệu tôi có thể tuần tự hóa thành một MemoryStream hay không thay vào đó, lý tưởng nhất là một cái mà tôi có thể sử dụng lại - để tránh chuỗi string vị trí và mã hóa UTF-8:

using(var ms = new MemoryStream())
{
    foreach (var item in data)
    {
        ms.Position = 0;
        ms.SetLength(0); // erase existing data
        JsonConvert.SerializeObject(ms,
            item.Value, Formatting.Indented, _redisJsonSettings);

        list.Add(_database.StringSetAsync(item.Key, ms.ToArray(), expiration));
    }
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. redis - Sử dụng mã băm

  2. Có cách nào để tự động phát hiện IP của nút cụm mới trong Cụm Redis với Rau diếp không

  3. Lưu trữ các đối tượng javascript lồng nhau trong redis - NodeJS

  4. Redis dưới dạng cơ sở dữ liệu

  5. Yêu cầu lại trên ngăn xếp gỗ tuyết tùng Heroku Số lượng công nhân vẫn tồn tại sau khi công nhân chấm dứt