[REDIS] 레디 스 캐시에있는 목록 요소를 저장하는 방법
REDIS레디 스 캐시에있는 목록 요소를 저장하는 방법
전 C # 레디 스 캐시 StackExchange.Redis을 사용했다.
cache.StringSet("Key1", CustomerObject);
하지만 같은 데이터를 저장할
cache.StringSet("Key1", ListOfCustomer);
답변 ServiceStack.Redis 또는 StackExchange.Redis을 사용하실 수 있습니다
해결법
-
==============================
1.당신은 풍부한 POCO 유형을 관리하기위한 ServiceStack.Redis의 높은 수준의 IRedisTypedClient 형식화 된 API를 사용할 수 있습니다.
당신은 풍부한 POCO 유형을 관리하기위한 ServiceStack.Redis의 높은 수준의 IRedisTypedClient 형식화 된 API를 사용할 수 있습니다.
첫째로 고객을위한 입력 레디 스 클라이언트를 얻을 :
var redisCustomers = redis.As<Customer>();
고객 POCO의 다음 하나의 고객과 함께 지속 할 수 있음을 관리하기위한 높은 수준의 입력 API를 해결할 수있는 :
redisCustomers.SetEntry("Customer1", CustomerObject);
또는 사용하는 고객의 목록 :
redisCustomers.Lists["Customers"].AddRange(ListOfCustomer);
-
==============================
2.당신이 Stackexchange.Redis를 사용하는 경우, 당신은 API의 목록 방법을 사용할 수 있습니다. 여기에 항목을 저장하는 레디 스 목록을 사용하여 IList의의 순진 구현입니다.
당신이 Stackexchange.Redis를 사용하는 경우, 당신은 API의 목록 방법을 사용할 수 있습니다. 여기에 항목을 저장하는 레디 스 목록을 사용하여 IList의의 순진 구현입니다.
희망이 목록 API의 몇 가지 방법을 이해하는 데 도움이 될 수 있습니다 :
public class RedisList<T> : IList<T> { private static ConnectionMultiplexer _cnn; private string key; public RedisList(string key) { this.key = key; _cnn = ConnectionMultiplexer.Connect("localhost"); } private IDatabase GetRedisDb() { return _cnn.GetDatabase(); } private string Serialize(object obj) { return JsonConvert.SerializeObject(obj); } private T Deserialize<T>(string serialized) { return JsonConvert.DeserializeObject<T>(serialized); } public void Insert(int index, T item) { var db = GetRedisDb(); var before = db.ListGetByIndex(key, index); db.ListInsertBefore(key, before, Serialize(item)); } public void RemoveAt(int index) { var db = GetRedisDb(); var value = db.ListGetByIndex(key, index); if (!value.IsNull) { db.ListRemove(key, value); } } public T this[int index] { get { var value = GetRedisDb().ListGetByIndex(key, index); return Deserialize<T>(value.ToString()); } set { Insert(index, value); } } public void Add(T item) { GetRedisDb().ListRightPush(key, Serialize(item)); } public void Clear() { GetRedisDb().KeyDelete(key); } public bool Contains(T item) { for (int i = 0; i < Count; i++) { if (GetRedisDb().ListGetByIndex(key, i).ToString().Equals(Serialize(item))) { return true; } } return false; } public void CopyTo(T[] array, int arrayIndex) { GetRedisDb().ListRange(key).CopyTo(array, arrayIndex); } public int IndexOf(T item) { for (int i = 0; i < Count; i++) { if (GetRedisDb().ListGetByIndex(key, i).ToString().Equals(Serialize(item))) { return i; } } return -1; } public int Count { get { return (int)GetRedisDb().ListLength(key); } } public bool IsReadOnly { get { return false; } } public bool Remove(T item) { return GetRedisDb().ListRemove(key, Serialize(item)) > 0; } public IEnumerator<T> GetEnumerator() { for (int i = 0; i < this.Count; i++) { yield return Deserialize<T>(GetRedisDb().ListGetByIndex(key, i).ToString()); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { for (int i = 0; i < this.Count; i++) { yield return Deserialize<T>(GetRedisDb().ListGetByIndex(key, i).ToString()); } } }
직렬화에 대한 Newtonsoft.Json의 사용을합니다. 다음 뉴-GET 패키지가 필요합니다 :
Install-Package Newtonsoft.Json Install-Package StackExchange.Redis
당신이 키에 의해 액세스 요소를 원하기 때문에 당신의 질문과 의견을 읽은 후, 나는 당신이 값과 관련된 필드로 구성지도입니다 레디 스 해시, 찾고 생각합니다.
당신은 모든 고객을 포함하는 해시에 대한 레디 스 키를 가질 수 있도록하는 가치 하나 하나는 필드에 관련. 당신이 다음 O (1)에서 ID로 고객을 얻을 수 있도록, 필드와 고객 ID를 선택할 수 있습니다.
나는 IDictionary를 구현하는 작업을 볼 수있는 좋은 방법이라고 생각합니다. RedisList하지만 될 수있는 레디 스 해시를 사용하여 비슷한 RedisDictionary 클래스 그래서 :
public class RedisDictionary<TKey, TValue> : IDictionary<TKey, TValue> { private static ConnectionMultiplexer _cnn; private string _redisKey; public RedisDictionary(string redisKey) { _redisKey = redisKey; _cnn = ConnectionMultiplexer.Connect("localhost"); } private IDatabase GetRedisDb() { return _cnn.GetDatabase(); } private string Serialize(object obj) { return JsonConvert.SerializeObject(obj); } private T Deserialize<T>(string serialized) { return JsonConvert.DeserializeObject<T>(serialized); } public void Add(TKey key, TValue value) { GetRedisDb().HashSet(_redisKey, Serialize(key), Serialize(value)); } public bool ContainsKey(TKey key) { return GetRedisDb().HashExists(_redisKey, Serialize(key)); } public bool Remove(TKey key) { return GetRedisDb().HashDelete(_redisKey, Serialize(key)); } public bool TryGetValue(TKey key, out TValue value) { var redisValue = GetRedisDb().HashGet(_redisKey, Serialize(key)); if (redisValue.IsNull) { value = default(TValue); return false; } value = Deserialize<TValue>(redisValue.ToString()); return true; } public ICollection<TValue> Values { get { return new Collection<TValue>(GetRedisDb().HashValues(_redisKey).Select(h => Deserialize<TValue>(h.ToString())).ToList()); } } public ICollection<TKey> Keys { get { return new Collection<TKey>(GetRedisDb().HashKeys(_redisKey).Select(h => Deserialize<TKey>(h.ToString())).ToList()); } } public TValue this[TKey key] { get { var redisValue = GetRedisDb().HashGet(_redisKey, Serialize(key)); return redisValue.IsNull ? default(TValue) : Deserialize<TValue>(redisValue.ToString()); } set { Add(key, value); } } public void Add(KeyValuePair<TKey, TValue> item) { Add(item.Key, item.Value); } public void Clear() { GetRedisDb().KeyDelete(_redisKey); } public bool Contains(KeyValuePair<TKey, TValue> item) { return GetRedisDb().HashExists(_redisKey, Serialize(item.Key)); } public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) { GetRedisDb().HashGetAll(_redisKey).CopyTo(array, arrayIndex); } public int Count { get { return (int)GetRedisDb().HashLength(_redisKey); } } public bool IsReadOnly { get { return false; } } public bool Remove(KeyValuePair<TKey, TValue> item) { return Remove(item.Key); } public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() { var db = GetRedisDb(); foreach (var hashKey in db.HashKeys(_redisKey)) { var redisValue = db.HashGet(_redisKey, hashKey); yield return new KeyValuePair<TKey, TValue>(Deserialize<TKey>(hashKey.ToString()), Deserialize<TValue>(redisValue.ToString())); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { yield return GetEnumerator(); } public void AddMultiple(IEnumerable<KeyValuePair<TKey, TValue>> items) { GetRedisDb() .HashSet(_redisKey, items.Select(i => new HashEntry(Serialize(i.Key), Serialize(i.Value))).ToArray()); } }
그리고 여기에 그것을 사용하는 몇 가지 예입니다 :
// Insert customers to the cache var customers = new RedisDictionary<int, Customer>("customers"); customers.Add(100, new Customer() { Id = 100, Name = "John" }); customers.Add(200, new Customer() { Id = 200, Name = "Peter" }); // Or if you have a list of customers retrieved from DB: IList<Customer> customerListFromDb; customers.AddMultiple(customerListFromDb.ToDictionary(k => k.Id)); // Query a customer by its id var customers = new RedisDictionary<int, Customer>("customers"); Customer customer100 = customers[100];
이러한 컬렉션의 더 나은 구현은 CachingFramework.Redis 라이브러리에서 찾을 수 있습니다.
여기에 코드입니다.
-
==============================
3.StackExchange.Redis 이미 목록 처리하는 기능을 미리 정의하고 값으로 설정하고있다.
StackExchange.Redis 이미 목록 처리하는 기능을 미리 정의하고 값으로 설정하고있다.
IDatabase 개체를 가져옵니다 :
문자열 cacheConnection = Utils.Sections.Storage.RedisCache.ConnectionString;
IDatabase 캐시 = ConnectionMultiplexer.Connect (cacheConnection) .GetDatabase ();
목록의 방법 :
cache.ListLeftPushAsync (키 값) -> 요소들의리스트의 한 푸시
cache.ListRangeAsync (키에서 startIndex, endIndex에이) -> 값의 목록을
만료 cache.Key (키, 시간 범위)
이상의 방법에 대한 StackExchange.Redis 패키지하시기 바랍니다. 당신은 여분의 nuget 패키지를 포함 할 필요가 없습니다.
from https://stackoverflow.com/questions/31955977/how-to-store-list-element-in-redis-cache by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] make 명령을 실행할 때 레디 스 설치가 실패 (0) | 2020.01.05 |
---|---|
[REDIS] 레디 스에 대한 MySQL의에 phpMyAdmin을 동등한? (0) | 2020.01.05 |
[REDIS] 레디 스 펍 서브 또는 Socket.IO의 방송 (0) | 2020.01.05 |
[REDIS] Heroku가에 레디 스를 배포하는 것은없는 연결 (0) | 2020.01.05 |
[REDIS] 키 이벤트가 만료 (0) | 2020.01.05 |