【发布时间】:2021-01-26 19:56:01
【问题描述】:
我正在处理 webjob 中的列表排序。 当我使用 c# List 时它工作正常。但为了提高性能,我将数据以列表的形式保存到 Redis 缓存中。
我的最终目标是只取出最近 5 分钟的数据。
工作 c# 代码 -
public class MyObject
{
public uint InstrumentID { get; set; }
public decimal Close { get; set; }
public decimal High { get; set; }
public decimal Low { get; set; }
public decimal Open { get; set; }
public DateTime TimeStamp { get; set; }
public uint Volume { get; set; }
public DateTime Created { get; } = DateTime.Now;
public DateTime Ttl { get; } = DateTime.Now.AddMinutes(5);
public DateTime? Persisted { get; set; }
public bool IsDead => DateTime.Now > Ttl;
public bool IsPersisted => Persisted.HasValue;
public bool TimeToPersist => IsPersisted == false && DateTime.Now > Created.AddMinutes(5);
public DateTime GetStartOfPeriodByMins(int numMinutes)
{
int oldMinutes = TimeStamp.Minute;
int newMinutes = (oldMinutes / numMinutes) * numMinutes;
DateTime startOfPeriod = new DateTime(TimeStamp.Year, TimeStamp.Month, TimeStamp.Day, TimeStamp.Hour, newMinutes, 0);
return startOfPeriod;
}
}
var inputList = new SortedSet<MyObject>(new MyObjectComparer());
inputList.Add(new MyObject() { TimeStamp = DateTime.Now, Open = 9, High = 12, Low = 8, Close = 11, InstrumentID = 2526 });
Thread.Sleep(10000);
inputList.Add(new MyObject() { TimeStamp = DateTime.Now, Open = 9, High = 12, Low = 8, Close = 11, InstrumentID = 2526 });
Thread.Sleep(10000);
inputList.Add(new MyObject() { TimeStamp = DateTime.Now, Open = 9, High = 12, Low = 8, Close = 11, InstrumentID = 2526 });
Thread.Sleep(50000);
inputList.Add(new MyObject() { TimeStamp = DateTime.Now, Open = 9, High = 12, Low = 8, Close = 11, InstrumentID = 2526 });
var resultSet = inputList
.GroupBy(i => i.GetStartOfPeriodByMins(5))
.Select(gr =>
new
{
StartOfPeriod = gr.Key,
Min = gr.Min(item => item.Open),
Max = gr.Max(item => item.Open),
Open = gr.OrderBy(item => item.TimeStamp).First().Open,
Close = gr.OrderBy(item => item.TimeStamp).Last().Open
});
现在我不断地将相同的记录插入到 redis 缓存中。在尝试获取最后 5 分钟的数据时,我想使用相同的 GetStartOfPeriodByMins 概念,但它需要 MyObject 类的列表,并且 redis 返回 RedisValue[]。
Redis 代码 - 使用 StackExchange.Redis 包
var cache = RedisConnectorHelper.Connection.GetDatabase();
//int i = 0;
for (int i = 0; i < 10000; i++)
{
var tickDataHis = new MyObject()
{
InstrumentID = 2526,
Close = 14 + i,
High = 16 + i,
Low = 11 + i,
Open = 12 + i,
TimeStamp = DateTime.Now,
Volume = 11111
};
// insert into redis
cache.ListRightPush("tickData", JsonConvert.SerializeObject(tickDataHis));
Thread.Sleep(3000);
}
var inputList = cache.ListRange("tickData");
或者有没有其他方法可以从 redis 获取最新的 5 分钟数据 缓存?
【问题讨论】:
-
我有一段时间没有使用 StackExchange.Redis,但据我所知。它没有内置解串器。因此,您可以为您的代码逐个实现,也可以只使用 JSON 反序列化器。
-
我尝试使用 json 反序列化器,但如果您发现任何代码 sn-p,则很难从 Redis Value [] 转换数据,请分享谢谢
-
我过去使用过(我认为)这个 nuget 包。 nuget.org/packages/StackExchange.Redis.Extensions.Newtonsoft
标签: c# c#-4.0 redis stackexchange.redis