TG.WXCRM.V4/DAL/Redis/RedisSortedSet.cs

58 lines
2.3 KiB
C#

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<T> : 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<bool> AddAsync(T data, double score)
{
var value = Settings.ValueConverter.Serialize(data);
return await Database.SortedSetAddAsync(Key, value, score);
}
public async Task<bool> 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<long> AddAsync(IEnumerable<KeyValuePair<T, double>> 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<IEnumerable<T>> 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<T>(x));
}
public async Task<IEnumerable<T>> 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<T>(x));
}
}
}