最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写,很零碎也没沉淀下来什么,这次算是一个系统学习和实践过程的总结。

和Redis有关的基础知识

Redis是一个开源的分布式NoSql数据库,可以用来做缓存服务、消息队列、数据存储等等,数据类型之丰富,效率之高,简直逆天!没有了解过的可以移步去问度娘~客户端之丰富,足可见它的社区有多强大:

其中C#的客户端就有这么多:

没错,我们的项目里也选择了最热门的StackExchange.Redis作为底层服务。

Redis虽然也可以部署在window上,但效率会大打折扣,所以通常都是部署在linux上跑,刚好我在上次部署.net core 项目时创建了一个centos虚拟机,可以直接拿来用,不会配虚拟机的同学可以点这里。Redis服务部署网上有很多教程,在此就略过了。

在这里向大家推荐一款redis图形化操作的客户端Redis Studio,比Redis Desktop Manager好用太多,谁用谁知道!可以查看运行情况、查看数据和类型、查看剩余有效时间、刷新数据、删除数据,甚至可以直接在图形界面配置redis,再也不用去配置文件里懵逼了。

当然,以上操作都可以在redis服务开启后用redis-cli工具实现。

基础操作封装

缓存的基础操作无非就是get、set这些,所以统一定义了一个接口:

里面用StackExchange.Redis提供的API来实现这些操作,代码太多就不贴出来了。其中对redis的连接做了连接池处理,连接对象ConnectionMultiplexer封装在一个阻塞队列里面,每次读写操作的时候去队列里面取,用完再放回,在应用启动的时候会初始化这个连接池。

创建连接的时候有两种方式,第一种是使用连接字符串的形式,把需要的参数写在一个字符串中:

第二种是使用ConfigurationOptions对象:

其中EndPoints是redis服务器的地址,做集群的时候可以写多个。为了搞清楚里面参数的含义,从github上clone了一份StackExchange.Redis的源码来看,非常清晰。在看源码的过程中发现底层都有记录redis的详细运行情况,但都是写在Stream里,于是自己基于系统的log4net日志然后根据它的实现重写了一套TextWriter来实现日志持久化,用于日后来分析错误:

在做泛型操作封装的时候遇到一个问题:我想把一个复杂对象整存整取。第一个想到的办法是序列化,但总觉得这样干会拖累redis的性能,觉得不爽不想用。然后是用redis的hash类型,但是操作起来非常不方便,而且没办法存集合,也pass了,其他的类型翻了源码看只支持int、string、bool这些,也不行。没办法还是序列化吧,然后想起来张善友老师推荐的protobuf,说是性能超级棒,于是就用了,发现它是用Stream来转化的,莫非这就是它性能高的原因?哪位大神指点下~

用redis自定义session存储

缓存服务搭起来后就打算把session搬到里面去,便于做分布式和统一状态管理。很简单,重写一套SessionStateStoreProviderBase就行了,然后跟着园子里焰尾迭的博客《分布式中Redis实现Session终结篇》做了一套,但是发现跑不起来,应该和我的封装有关,由于时间问题就先放下了,直接上nuget找了一个现成的,看中了Microsoft.Web.RedisSessionStateProvider,想着既然是我软官方出的应该没什么大问题,另外这个SessionStateProvider也是依赖于StackExchange.Redis,与项目中的一致于是果断下载安装了。接下来不得不夸一下微软的细节处理啊,下载完立马蹦出个readme告诉我安装结果:

要不然还要研究这个东西怎么用,按照里面的提示打开web.config,发现在<system.web>节点下帮我们自动加了一个节点sessionState,里面定义了和session有关的配置,最重要的是配置模板都给出来了,连数据类型都标记的清清楚楚:

众所周知微软一直向他的开发者推崇傻瓜式操作,但这些细节真的是太贴心了,根据自己的redis服务器信息配置一下关键信息就ok了。写个session测试一下,页面跑起来了redis里面也查到session值了(被编码了),太TM爽啊~100个大写的赞。。。

最后,把系统中临时用的HttpContext.Cache和静态Dictionary全部用redis替换掉,然后build、run、ok。

总结

经过这几天的实践算是打开了redis的大门走出了第一步,今后系统开发和运行中肯定还会遇到很多问题,也不是说在程序用redis实现get、set就是学会了,现在接触到的只是最基础的东西,后面还要学习一下redis的高级用法,例如pub/sub、master/slave、集群等。

问题

1、序列化那里心里还是有梗,有没有更好的解决方案?而且用protobuf的话要在类名和属性上打标签,这个有点忧桑啊~

2、有人说把session放到redis后可以解决session阻塞的问题,测试了一下好像不行啊,哪位大神知道真相的还请指点一二~

备注:  文章发布后很多朋友想要代码,前面留下邮箱的已经都发送给大家了,现分享到百度云,大家可以去下载http://yun.baidu.com/s/1hrVIHyG

【新手总结】在.Net项目中使用Redis作为缓存服务的更多相关文章

  1. 在.Net项目中使用Redis作为缓存服务

    转自:http://www.cnblogs.com/hohoa/p/5771255.html 最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写 ...

  2. Spring-Boot项目中配置redis注解缓存

    Spring-Boot项目中配置redis注解缓存 在pom中添加redis缓存支持依赖 <dependency> <groupId>org.springframework.b ...

  3. Redis学习笔记之二 :在Java项目中使用Redis

    成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...

  4. Redis的安装以及在项目中使用Redis的一些总结和体会

    第一部分:为什么我的项目中要使用Redis 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis 发送邮件时使用Redis的消息队列,减轻网站压力 ...

  5. Django项目中使用Redis

    Django项目中使用Redis DjangoRedis 1 redis Redis 是一个 key-value 存储系统,常用于缓存的存储.django-redis 基于 BSD 许可, 是一个使 ...

  6. 在express项目中使用redis

    在express项目中使用redis 准备工作 安装redis 安装redis桌面管理工具:Redis Desktop Manager 项目中安装redis:npm install redis 开始使 ...

  7. 在项目中部署redis的读写分离架构(包含节点间认证口令)

    #### 在项目中部署redis的读写分离架构(包含节点间认证口令) ##### 1.配置过程 ---  1.此前就是已经将redis在系统中已经安装好了,redis utils目录下,有个redis ...

  8. SpringBoot项目中,Redis的初次使用

    1.引入Redis依赖包,在application.yml中配置redis <dependency> <groupId>org.springframework.boot< ...

  9. java中对Redis的缓存进行操作

    Redis 是一个NoSQL数据库,也是一个高性能的key-value数据库.一般我们在做Java项目的时候,通常会了加快查询效率,减少和数据库的连接次数,我们都会在代码中加入缓存功能.Redis的高 ...

随机推荐

  1. 分分钟带你玩转 Web Services

    当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来. 毕竟是多家不同的公司的产品,研发开发语言.采用技术框架基本上是百花齐放. 怎样让自家系统提供的服务具有跨平台.跨语言.跨各种防 ...

  2. 2016BUAA校赛决赛

    A. 题意:有n个点,n-1条边,1-2-3-4-5-...-n,每条边都有权值,代表走这条边的时间,时刻0一个人在点1,问从时刻1~m,有哪些时刻这个人可能走到n点 分析:将每条边当作物品,可以选1 ...

  3. docker 启动安装等命令

    确认是否安装url whereis curl 启动docker服务: sudo service docker start sudo service docker stop 安装curl sudo ap ...

  4. 打包SpringBoot工程并部署

    使用工具:Eclipse Linux下JDK版本:jdk-7u79-linux-x64.tar.gz 一.打包成jar并部署 步骤如下: 首先上pom.xml: <project xmlns=& ...

  5. 用vue.js学习es6(一):基本工具及配置

    一.工具: sublime,node.js,npm 1.安装sublime 的es6插件: (1).在sublime中按Ctrl+`调出console (2).粘贴以下代码到底部命令行并回车(subl ...

  6. mybatis generator maven插件自动生成代码

    如果你正为无聊Dao代码的编写感到苦恼,如果你正为怕一个单词拼错导致Dao操作失败而感到苦恼,那么就可以考虑一些Mybatis generator这个差价,它会帮我们自动生成代码,类似于Hiberna ...

  7. Redis设计与实现读书笔记(二) 链表

    链表作为最基础的数据结构,在许多高级语言上已经有了很好的实现.由于redis采用C语言编写,需要自己实现链表,于是redis在adlist.h定义了链表类型.作者对于这部分没什么好说,源码比较简单,如 ...

  8. 千万级高并发负载均衡软件HAproxy

    1负载均衡产品介绍 基于硬件的负载均衡设备例如F5,Big-IP,基于软件的负载均衡产品HAproxy,LVS,nginx在这些软件产品中,又分为基于操作系统的软负载实现和基于第三方应用的软负载实现. ...

  9. html你可能还不知道的一些知识点

    一.标签语义化 html标签语义化是让大家直观的认识标签和属性的用途和作用,好处最主要的是对搜索引擎友好. Eg: 1.如果你想在页面中突出"奥巴马"这三个字,让搜索引擎重视它,如 ...

  10. MySQL/MariaDB/PerconaDB-提权条件竞争漏洞

    背景 2016年11月01日,国外安全研究员Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/ ...