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 RedisSortedSet : RedisStore { public RedisSortedSet(RedisKey key, RedisConfig redisConfig = RedisConfig.Redis0) : base(key, redisConfig) { } public RedisSortedSet(RedisConfig redisConfig = RedisConfig.Redis0) : base(redisConfig) { } public bool Add(T data, double score) { var value = Settings.ValueConverter.Serialize(data); return Database.SortedSetAdd(Key, value, score); } public async Task AddAsync(T data, double score) { var value = Settings.ValueConverter.Serialize(data); return await Database.SortedSetAddAsync(Key, value, score); } public async Task AddAsync(RedisKey key, T data, double score) { Key = key; var value = Settings.ValueConverter.Serialize(data); return await Database.SortedSetAddAsync(Key, value, score); } public async Task AddAsync(IEnumerable> data) { var redisValues = data.Select(x => { var v = Settings.ValueConverter.Serialize(x); return new SortedSetEntry(v, x.Value); }).ToArray(); return await Database.SortedSetAddAsync(Key, redisValues); } public async Task> RangeByRankAsync(long start = 0, long stop = -1, Order order = Order.Ascending) { var result = await Database.SortedSetRangeByRankAsync(Key, start, stop, order); return result.Select(x => Settings.ValueConverter.Deserialize(x)); } public async Task> RangeByScoreAsync(double start = double.NegativeInfinity, double stop = double.PositiveInfinity, Exclude exclude = Exclude.None, Order order = Order.Ascending, long skip = 0, long take = -1) { var result = await Database.SortedSetRangeByScoreAsync(Key, start, stop, exclude, order, skip, take); return result.Select(x => Settings.ValueConverter.Deserialize(x)); } } }