Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET的Redis优化,以及如何从散列中存储和获取元素的具体示例_C#_Redis - Fatal编程技术网

C# NET的Redis优化,以及如何从散列中存储和获取元素的具体示例

C# NET的Redis优化,以及如何从散列中存储和获取元素的具体示例,c#,redis,C#,Redis,我在Redis列表中存储了15000多个POCO元素。我正在使用ServiceStack来保存和获取它们。然而,当我将它们放入网格时,我对响应时间感到不满意。正如我所读到的,最好将这些对象存储在哈希中,但不幸的是,我找不到任何适合我的示例:( 这是我使用的方法,以便将它们放入我的网格中 public IEnumerable<BookingRequestGridViewModel> GetAll() { try { var redisManager =

我在Redis列表中存储了15000多个POCO元素。我正在使用ServiceStack来保存和获取它们。然而,当我将它们放入网格时,我对响应时间感到不满意。正如我所读到的,最好将这些对象存储在哈希中,但不幸的是,我找不到任何适合我的示例:(

这是我使用的方法,以便将它们放入我的网格中

public IEnumerable<BookingRequestGridViewModel> GetAll()
{
    try
    {
        var redisManager = new RedisManagerPool(Global.RedisConnector);                
        using (var redis = redisManager.GetClient())
        {
            var redisEntities = redis.As<BookingRequestModel>();
            var result =redisEntities.Lists["BookingRequests"].GetAll().Select(z=> new BookingRequestGridViewModel
            {
                CreatedDate =z.CreatedDate,
                DropOffBranchName =z.DropOffBranch !=null ? z.DropOffBranch.Name : string.Empty,
                DropOffDate =z.DropOffDate,
                DropOffLocationName = z.DropOffLocation != null ? z.DropOffLocation.Name : string.Empty,
                Id =z.Id.Value,
                Number =z.Number,
                PickupBranchName =z.PickUpBranch !=null ? z.PickUpBranch.Name :string.Empty,
                PickUpDate =z.PickUpDate,
                PickupLocationName = z.PickUpLocation != null ? z.PickUpLocation.Name : string.Empty
            }).OrderBy(z=>z.Id);                   
            return result;
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}
public IEnumerable GetAll()
{
尝试
{
var redisManager=new RedisManagerPool(Global.RedisConnector);
使用(var redis=redisManager.GetClient())
{
var redisEntities=redis.As();
var result=redisEntities.list[“BookingRequests”].GetAll().Select(z=>new BookingRequestGridViewModel
{
CreatedDate=z.CreatedDate,
DropOffBranchName=z.DropOffBranch!=null?z.DropOffBranch.Name:string.Empty,
DropOffDate=z.DropOffDate,
DropOffLocationName=z.DropOffLocation!=null?z.DropOffLocation.Name:string.Empty,
Id=z.Id.Value,
Number=z.Number,
PickuBranchName=z.PickuBranch!=null?z.PickuBranch.Name:string.Empty,
PickUpDate=z.PickUpDate,
PickupLocationName=z.PickUpLocation!=null?z.PickUpLocation.Name:string.Empty
}).OrderBy(z=>z.Id);
返回结果;
}
}
捕获(例外情况除外)
{
返回null;
}
}
请注意,我使用的是
redisEntities.Lists[“BookingRequests”].GetAll()
,这会导致性能问题(我只想使用
redisEntities.Lists[“BookingRequests”]
,但我丢失了网格中的最后更新-编辑后)

我想知道将它们保存到列表中是否是一个好方法,因为对我来说,拥有一个快速的网格是非常重要的(我现在有1秒的分页时间,这是非常巨大的)


请给出建议!

首先,您不应该每次都创建一个新的like
RedisManagerPool
实例,您的应用程序中应该只有一个
RedisManagerPool
的单一实例,所有客户端都可以从该实例解析

但如果不是这样,我会重新考虑您的数据访问策略,批量下载15K项不是理想的策略。您可以或您可以将项存储在排序集中,其值可以像递增id一样分页,例如:

var redisEntities = redis.As<BookingRequestModel>();
var bookings = redisEntities.SortedSets["bookings"];

foreach (var item in new BookingRequestModel[0])
{
    redisEntities.AddItemToSortedSet(bookings, item, item.Id);
}

项目的宽度是多少,网络连接有多大?基本上,我会在这里开始寻找三个地方-a)带宽有限吗,即你是否饱和了15k*{width}?如果是的话。。。如果不更改序列化格式,我看不到任何选项;b) 延迟是有限的吗?这只在这是一个“闲聊”API的情况下才起作用-但我猜它使用的是
lrange
,在这种情况下这不重要,或者c)是不是超过15k个元素的序列化性能才是瓶颈?随机问题:为什么列表中需要15k个元素?这对用户来说几乎没有用处。。。并且某种延迟加载是否有用,即“虚拟模式”中的列表,当用户滚动时,在列表的子范围中加载什么?@Mark Gravel-因为我计划用Redis替换我的SQL数据库数据-这是我在将它们导入Redis后得到的-每个元素都是一个JSON,有大约20个属性-其中一些是其他小JSON objectsk;现在,我非常熟悉redis,但我很少使用ServiceStack(如果有的话);如果您在服务器上使用
监视器
,它是否会发出单个
lrange
?可能
lrange BookingRequests 0-1
?(这里的要点是:要确定这是否是我以前列表中的“b”项)“LRANGE”BookingRequests“0”-1”indeed如果我想按自定义字段排序怎么办?我最终使用了并发字典,但仍然有一些数据不一致。我有一个服务,通过检查预订日期和他的上次运行时间,将并发采集的数据不时保存到Redis,但我仍然不确定这是否是解决问题的正确方法。。。
var batch = bookings.GetRangeByLowestScore(fromId, toId, skip, take);