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

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条数据平均时间 

测试效果如下:

获取10000条数据,平均时间大概793.78毫秒.

 

/// <summary>

   /// 存储List

   /// </summary>

   /// <typeparam name="T"></typeparam>

   /// <param name="key"></param>

   /// <param name="value"></param>

   public void ListSet<T>(string key, List<T> value)

   { 

       db.StringSet(key, ConvertJson(value));

   }

   /// <summary>

   /// 获取指定key的List

   /// </summary>

   /// <param name="key"></param>

   /// <returns></returns>

   public List<T> ListGet<T>(string key)

   { 

       return ConvetList<T>(db.StringGet(key));

   }

当然也必须试一下String 方式的类型存储啦,代码如下:

原文地址:http://www.cnblogs.com/Mikor/p/6223931.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java爬虫小测---ElasticSearch

项目搭建 1、启动ES&#xff0c;和head-master&#xff0c;用head-master建立索引 不建立也没事&#xff0c;添加数据的时候会自动创建 2、导入SpringBoot需要的依赖 注意&#xff1a;elasticsearch的版本要和自己本地的版本一致&#xff01;所以还要在pom里面添加自定义版本…

Gradle的安装与配置

https://www.cnblogs.com/NyanKoSenSei/p/11458953.html Gradle的安装与配置 1. Gradle简介 Gradle是源于Apache Ant和Apache Maven概念的项目自动化构建开源工具&#xff0c;它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;抛弃了基于XML的各种繁琐配置面…

使用 Roslyn 编译器服务

.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service"&#xff0c;简单的讲&#xff0c;就是就是将编译器开放为一种可在代码中调用的服务&#xff0c; 通常在工作流引擎 或是规则引擎中都需要一项功能是计算表达式&#xf…

Rest风格---ElasticSearch

Rest风格 5.1 简介 RESTful是一种架构的规范与约束、原则&#xff0c;符合这种规范的架构就是RESTful架构。 操作 methodurl地址描述PUTlocalhost:9100/索引名称/类型名称/文档id创建文档&#xff08;指定id&#xff09;POSTlocalhost:9100/索引名称/类型名称创建文档&…

IntelliJ IDEA如何导入Gradle项目

https://blog.csdn.net/wangdong5678999/article/details/70255451 IntelliJ IDEA如何导入Gradle项目 栋先生 2017-04-20 10:14:03 95942 收藏 分类专栏&#xff1a; 其他 文章标签&#xff1a; idea intellij idea gradle 版权 最近学习Gradle&#xff0c;本文来重点介绍…

加密货币的本质

转载自 加密货币的本质 去年&#xff0c;比特币暴涨&#xff0c;其他币也像雨后春笋一样冒出来&#xff0c;已经有1000多种了。很多人都在问&#xff0c;加密货币&#xff08;cryptocurrency&#xff09;的时代&#xff0c;真的来临了吗&#xff1f;将来会不会人类不再使用美元…

.net core 源码解析-web app是如何启动并接收处理请求

最近.net core 1.1也发布了&#xff0c;蹒跚学步的小孩又长高了一些&#xff0c;园子里大家也都非常积极的在学习&#xff0c;闲来无事&#xff0c;扒拔源码&#xff0c;涨涨见识。 先来见识一下web站点是如何启动的&#xff0c;如何接受请求,.net core web app最简单的例子,大…

关于文档的基本操作---ElasticSearch

关于文档的基本操作&#xff08;重点&#xff09; 基本操作 添加数据 PUT /psz/user/1 {"name": "psz","age": 22,"desc": "偶像派程序员","tags": ["暖","帅"] }获取数据 GEt psz/user/…

IdentityServer4 使用OpenID Connect添加用户身份验证

使用IdentityServer4 实现OpenID Connect服务端&#xff0c;添加用户身份验证。客户端调用&#xff0c;实现授权。 IdentityServer4 目前已更新至1.0 版&#xff0c;在之前的文章中有所介绍。IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API 。 本文环…

深度优先搜索和广度优先搜索

转载自 深度优先搜索和广度优先搜索 图的应用很广泛&#xff0c;也有很多非常有用的算法&#xff0c;当然也有很多待解决的问题&#xff0c;根据性质&#xff0c;图可以分为无向图和有向图。 图 之所以要研究图&#xff0c;是因为图在生活中应用比较广泛&#xff1a; 图是若…

消息队列 Kafka 的基本知识及 .NET Core 客户端

前言 最新项目中要用到消息队列来做消息的传输&#xff0c;之所以选着 Kafka 是因为要配合其他 java 项目中&#xff0c;所以就对 Kafka 了解了一下&#xff0c;也算是做个笔记吧。 本篇不谈论 Kafka 和其他的一些消息队列的区别&#xff0c;包括性能及其使用方式。 简介 Kafka…

深入解读Service Mesh背后的技术细节

转载自 深入解读Service Mesh背后的技术细节 在Kubernetes称为容器编排的标准之后&#xff0c;Service Mesh开始火了起来&#xff0c;但是很多文章讲概念的多&#xff0c;讲技术细节的少&#xff0c;所以专门写一篇文章&#xff0c;来解析Service Mesh背后的技术细节。 一、…

CentOS7查看和关闭防火墙

https://blog.csdn.net/ytangdigl/article/details/79796961 CentOS7查看和关闭防火墙 蔚蓝色天空sky 2018-04-02 23:22:21 708762 收藏 236 分类专栏&#xff1a; linux 文章标签&#xff1a; centos 防火墙 CentOS 7.0默认使用的是firewall作为防火墙 查看防火墙状态 f…

Visual Studio Code 1.8版本添加了Hot Exit、Zen Mode及更多调试选项

最新发布的Visual Studio Code 1.8版本有许多改进和新功能&#xff0c;包括防止丢失任何编辑信息的Hot Exit&#xff0c;方便开发人员把注意力集中在代码上的Zen Mode&#xff0c;新的调试功能以及更方便的设置等。 Hot Exit是一项新功能&#xff0c;目的是在应用程序崩溃或退出…

ElasticSearch(笔记)

简介 本教程基于ElasticSearch7.6.1, 注意ES7的语法与ES6的API调用差别很大, 教程发布时最新版本为ES7.6.2(20200401更新);ES是用于全文搜索的工具: SQL: 使用like %关键词%来进行模糊搜索在大数据情况下是非常慢的, 即便设置索引提升也有限;ElasticSearch: 搜索引擎(baidu, …

漫画:什么是冒泡排序

转载自 漫画&#xff1a;什么是冒泡排序 什么是冒泡排序&#xff1f; 冒泡排序的英文Bubble Sort&#xff0c;是一种最基础的交换排序。 大家一定都喝过汽水&#xff0c;汽水中常常有许多小小的气泡&#xff0c;哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻…

CentOS - 修改主机名教程(将 localhost.localdomain 改成其它名字)

https://www.cnblogs.com/gudi/p/7846978.html 需要关闭防火墙&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Linux修改主机名称 碰到这个问题的时候&#xff0c;是在安装Zookeeper集群的时候&#xff0c;碰到如下问题 java.net.U…

.net core 源码解析-web app是如何启动并接收处理请求(二) kestrel的启动

上篇讲到.net core web app是如何启动并接受请求的&#xff0c;下面接着探索kestrel server是如何完成此任务的。 1.kestrel server的入口KestrelServer.Start (Microsoft.AspNetCore.Hosting.Server.IHttpApplication ) FrameFactory创建的frame实例最终会交给libuv的loop回调…

MySQL中的any_value()函数

https://blog.csdn.net/u014079773/article/details/93722761 https://www.thinbug.com/q/37089347 https://blog.csdn.net/Peacock__/article/details/90608246 https://www.itranslater.com/qa/details/2109775246877262848 4.any_value()会选择被分到同一组的数据里…

MybatisPlus使用

Mybatisplus 导入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…