using Newtonsoft.Json; using StackExchange.Redis; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WX.CRM.Model.Redis; namespace WX.CRM.DAL.Redis { public sealed class RedisList : RedisStore { public RedisList(RedisConfig redisConfig = RedisConfig.Redis0) : base(redisConfig) { } public RedisList(RedisKey key, RedisConfig redisConfig = RedisConfig.Redis0) : base(key, redisConfig) { } public long LeftPush(T data) { var value = JsonConvert.SerializeObject(data); return Database.ListLeftPush(Key, value); } public async Task LeftPushAsync(T data) { var value = JsonConvert.SerializeObject(data); return await Database.ListLeftPushAsync(Key, value); } public long LeftPush(RedisKey key, T data) { var value = JsonConvert.SerializeObject(data); return Database.ListLeftPush(key, value); } public async Task LeftPushAsync(RedisKey key, T data) { var value = JsonConvert.SerializeObject(data); return await Database.ListLeftPushAsync(key, value); } public async Task LeftPushAsync(T[] data) { var redisValues = data.Select(x => { var rv = Settings.ValueConverter.Serialize(x); return rv; }).ToArray(); return await Database.ListLeftPushAsync(Key, redisValues); } public long RightPush(T data) { var value = JsonConvert.SerializeObject(data); return Database.ListRightPush(Key, value); } public async Task RightPushAsync(T data) { var value = JsonConvert.SerializeObject(data); return await Database.ListRightPushAsync(Key, value); } public async Task RightPushAsync(T[] data) { var redisValues = data.Select(x => { var rv = Settings.ValueConverter.Serialize(x); return rv; }).ToArray(); return await Database.ListRightPushAsync(Key, redisValues); } public async Task LeftPopAsync() { var value = await Database.ListLeftPopAsync(Key); return Settings.ValueConverter.Deserialize(value); } public async Task RightPopAsync() { var value = await Database.ListRightPopAsync(Key); return Settings.ValueConverter.Deserialize(value); } public async Task RightPopAsync(RedisKey key) { var value = await Database.ListRightPopAsync(key); return Settings.ValueConverter.Deserialize(value); } public async Task RightPopLeftPushAsync(RedisKey destination) { return await RightPopLeftPushAsync(Key, destination); } public async Task RightPopLeftPushAsync(RedisKey key, RedisKey destination) { var value = await Database.ListRightPopLeftPushAsync(key, destination); return Settings.ValueConverter.Deserialize(value); } public IEnumerable Range(long start = 0, long stop = -1) { var results = Database.ListRange(Key, start, stop); var resultArray = results.Select(x => Settings.ValueConverter.Deserialize(x)); return resultArray; } public async Task> RangeAsync(long start = 0, long stop = -1) { var results = await Database.ListRangeAsync(Key, start, stop); var resultArray = results.Select(x => Settings.ValueConverter.Deserialize(x)); return resultArray; } public long Remove(T data) { var value = Settings.ValueConverter.Serialize(data); return Database.ListRemove(Key, value); } public async Task RemoveAsync(T data) { var value = Settings.ValueConverter.Serialize(data); return await Database.ListRemoveAsync(Key, value); } public async Task RemoveAsync(RedisKey key, T data) { Key = key; var value = Settings.ValueConverter.Serialize(data); return await Database.ListRemoveAsync(Key, value); } public long Llen() { return Llen(Key); } public async Task LlenAsync() { return await LlenAsync(Key); } public long Llen(RedisKey key) { return Database.ListLength(key); } public async Task LlenAsync(RedisKey key) { return await Database.ListLengthAsync(key); } /// /// LINDEX http://redis.io/commands/lindex /// public T GetByIndex(long index) { return GetByIndex(Key, index); } public T GetByIndex(RedisKey key, long index) { var value = Database.ListGetByIndex(key, index); return Settings.ValueConverter.Deserialize(value); } public async Task GetByIndexAsync(long index) { return await GetByIndexAsync(Key, index); } /// /// LINDEX http://redis.io/commands/lindex /// public async Task GetByIndexAsync(RedisKey key, long index) { var value = await Database.ListGetByIndexAsync(key, index); return Settings.ValueConverter.Deserialize(value); } } }