问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样在Redis通过StackExchange.Redis 存储集合类型List

发布网友 发布时间:2022-04-08 02:03

我来回答

1个回答

热心网友 时间:2022-04-08 03:33

StackExchange 是由StackOverFlow出品, 是对Redis的.NET封装,被越来越多的.NET开发者使用在项目中。
绝大部分原先使用ServiceStack的开发者逐渐都转了过来,由于SS在其新版中不再开源,并对免费版本有所*。

实际问题

那么用.NET的开发者会发现,其根本没有对List类型的存储封装,那么要实现一个类似如下需求:
假如我有一个Customer的模型。

   public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address1 { get; set; }
        public string City { get; set; }
        public string State { get; set; }
    }

var customers = new List<Customer>();

怎样将List<customer> customers 存入Redis中呢?

来龙去脉

是由于StackExchange.Redis是一个纯客户端的代理,他仅仅实现了Redis自由的功能,并不额外封装其它功能。 也不具备像ORM那样的自动类型匹配。

他仅仅存储键值对 像string 或者
byte[]。所以你明白了吧,必须序列化存储,用类似Json格式一样。像用第三方NewtonSoft或者是Google公司流行的Protocol Buffers
序列化格式的Protobuf-Net 也是不错的选择。 

Redis支持存储的类型有五种String ,Hash ,List ,Set ,和 Sorted Set, 正如上面说的,这些存储类型全部由字符串构成。

其中Set类型是没有顺序的,并且值必须唯一, List类型有顺序且允许重复。

解决方案

如果你仅仅为了缓存存一批量的 List<Customer> 数据, 那么自己封装一个ListGet() 和 ListSet()方法吧。

我对比过使用 List 和 String 两种类型存储。

Redis 的List类型和 .NET领域还有所不同,实际上,它是一个双向队列,可以左右插入值。

所以如果是批量数据插入 那么必须一个个插入, 代码比较简单如下:

//封装的ListSet
public void ListSet<T>(string key, List<T> value)
{
        .....
       //下面的database 是redis的数据库对象.
        foreach (var single in value)
        {
                var s = ConvertJson(single); //序列化
                database.ListRightPush(key, s); //要一个个的插入
        }
}

//封装的ListGet
public void ListGet<T>(string key)
{
       ...
       //ListRange返回的是一组字符串对象
       //需要逐个反序列化成实体
       var vList = database.ListRange(key) ;  
       List<T> result = new List<T>();
       foreach (var item in vList)
       {
           var model = ConvertObj<T>(item); //反序列化
           result.Add(model);
       }
       return result;
}

当然测试了一下性能,取20W条数据平均时间

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我家300多k的网速为什么玩cf总是很迟钝,连切枪都很慢 CF切换枪的速度很慢 ...东西需要输入apple ID密码 我不知道怎么办?更新微信需要appleID_百... ...一遍id苹果手机的每次更新软件都需要输入id和密码请问怎么解决_百度... ...ID 我不知道密码是什么,也不懂怎么申请,想下个软件都下不了... 微信直播王者荣耀有收益吗 王者荣耀新手主播能挣多少 华为是如何进入手机市场的? ...用的那种安在船边上承鱼竿的那个座子中文叫什么?就是下图中的那个... 放在哪里不动钓鱼的叫什么? 格力电器真的那么好吗 格力空调的质量怎么样,质量很烂是真的吗 格力空调怎么样? 请问格力空调怎么样,有什么选购建议吗? 大康人寿保险交不起明年交要多少 格力空调的质量怎么样? 最原始的计算工具讲的是什么? 中国最早的计算工具是算筹吗? 世界上最早的计算工具 原始的计算工具是什么? 最原始的计算工具是什么呢? 算盘是世界上最早的计算器吗? 世界上最早的计算器是什么? 我国最早的计算工具是算筹吗? 最早的计算工具是什么? 什么是最早的计算工具? 我国最早计算工具是什么? 属牛85年,男孩,命运如何,婚姻如何, 一九八五年属牛农历十二月二十五日八点半算命 1982年属狗和1985年属牛的女生婚姻怎么样 win10c盘无法压缩卷,磁盘碎片整理进度始终为零 win10C盘压缩卷只能压一半怎么办,系统保护已经禁用,虚拟内存已关闭,都还是不行? win10磁盘管理中无法进行压缩卷,大家帮看看? win10关闭系统保护后可压缩空间还是0啊,怎么回事? 还是跪求英文翻译啊。。很急还是。。谢谢大家 急求 英译汉!!!哪位高手帮我翻译一下 EPS应急电源的EPS应急电源消防联动设计的三种方式 360优化大师里粉碎隐私在哪 360隐私粉碎机文件夹在哪?用软件恢复,找不到文件夹啊 我想办理400电话,请问在江西有没有400电话申请中心啊??? 煮面条的时候是先放面条还是先放鸡蛋 鸡蛋面是先放鸡蛋还是先放面 、煮面顺便加个蛋,到底是先放蛋还是先放面 荷包鸡蛋面条,是先放鸡蛋还是先放面条? 煮方便面先放鸡蛋还是面啊???鸡蛋想打碎 大人发烧可以吃小孩子吃的布洛芬悬液吗 成人什么药退烧效果好 大人发烧吃什么药 大人发烧吃什么药退烧快 大人吃的退烧药 有哪些