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

最近由于项目需要,在系统缓存服务部分上了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阻塞的问题,测试了一下好像不行啊,哪位大神知道真相的还请指点一二~

相关文章:

  • Redis到底该如何利用(一)?

  • Redis到底该如何利用(二)?

  • Redis 3.0.0正式版发布,高性能 K/V 服务

  • 用Docker构建分布式Redis集群

  • 推荐–个通用缓存接口抽象类库:CacheManager

  • asp.net core 使用 Redis 和 Protobuf 进行 Session 缓存

  • C#使用Redis集群缓存

  • Azure Redis 缓存的 ASP.NET 会话状态提供程序

  • 搜狐视频Redis私有云cachecloud开源了


原文地址:http://www.cnblogs.com/hohoa/p/5771255.html


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

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

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

相关文章

中国的程序员培训是不是有问题?

内容来源于&#xff0c;看最下面的出处&#xff0c;侵删 中国技术开放日的出海团对日本进行了为期一周的访问。笔者随行了头两天&#xff0c;参加Slush Asia大会&#xff0c;并访问了Gungho和Deloitte两家企业。虽然已经在日本生活了四年&#xff0c;但这样的体验却甚少&#x…

后台回调支付宝

https://blog.csdn.net/u012552275/article/details/78320051 网上找了一个可以起吊支付宝的appdemo &#xff0c;它集成了服务器端&#xff0c;我先将其分离为app和服务器端&#xff0c;保证app在接收参数后可以启调支付宝 &#xff08;保证app这边是正确的 不然出错都不知道…

解决高版本SpringBoot整合swagger时启动报错:Failed to start bean ‘documentationPluginsBootstrapper‘ 问题

一、控制台的报错信息 2021-12-29 15:15:04 [main] ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is j…

java图片格式转化(例如jpg格式转化png)

转载自 java图片格式转化&#xff08;例如jpg格式转化png&#xff09; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Scanner;import javax.imageio.*; public class FormatConversion {public static final Str…

微软开源PowerShell并支持Linux

建议在Wifi 环境下观看视频 class"video_iframe" data-vidtype"1" style" z-index:1; " height"375" width"500" frameborder"0" data-src"https://v.qq.com/iframe/preview.html?vidv0322g7kd3f&width…

招银网络科技笔试

记录一下 招银网络笔试 2017年09月11日 14:32:53 阅读数&#xff1a;2450 Part1. 30道单选 涉及Java&#xff0c;C&#xff0c;多线程&#xff0c;算法&#xff0c;数据结构&#xff0c;CPU&#xff0c;NP问题&#xff0c;SQL语句&#xff0c;IP地址转换&#xff0c;行测。…

mybatisGenerator逆向工程

一、在pom文件中导入依赖和generator插件 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency&…

2016最佳温情小说:雨还在下....

作者 | 李德霞 来源 | 小小说选刊 哗&#xff0c;一道闪电&#xff1b;轰&#xff0c;一个响雷。 暴雨倾盆&#xff0c;天地间浑沌一片…… 老大扑腾腾坐起来&#xff0c;心也跟着扑腾腾地跳。老大拉亮灯&#xff0c;推推身边的媳妇。媳妇一骨碌爬起来&#xff0c;咋&#xf…

java 中 image 和 byte[] 相互转换

转载自 java 中 image 和 byte[] 相互转换只需要一个存储了图片信息的二进制串&#xff08;byte[]&#xff09; 然后&#xff0c;这样&#xff1a; InputStream buffin new ByteArrayInputStream(/*二进制串*/, /*起始位置*/,/*二进制串长度*/)); BufferedImage img ImageIO…

招银网络

记录一下 招银网络笔试 2017年09月11日 14:32:53 阅读数&#xff1a;2451 Part1. 30道单选 涉及Java&#xff0c;C&#xff0c;多线程&#xff0c;算法&#xff0c;数据结构&#xff0c;CPU&#xff0c;NP问题&#xff0c;SQL语句&#xff0c;IP地址转换&#xff0c;行测。…

Java 文件和byte数组转换

转载自 Java 文件和byte数组转换 /** * 获得指定文件的byte数组 */ private byte[] getBytes(String filePath){ byte[] buffer null; try { File file new File(filePath); FileInputStream fis new FileInputStream(file); ByteArrayOutputStream bos new ByteAr…

json大文件导入数据库

json文件导入数据库 使用Navicat的客户端工具也可以实现json文件导入数据库&#xff0c;但是数据量大了之后&#xff0c;字段的值过于冗长可能会导致数据的截取&#xff0c;是的数据导入不是完整的。 所以另辟蹊径使用其他方法 创建一个新的工程用原始的jdbc实现数据的导入 一…

Docker for Windows使用简介

在上一篇文章中&#xff0c;通过演练指导的方式&#xff0c;介绍了在Docker中运行ASP.NET Core Web API应用程序的过程。本文将介绍Docker for Windows的使用。 先决条件 前两周时间&#xff0c;Docker发布了Docker for Windows的正式版&#xff0c;于是就可以在Windows下运行D…

pagehelper 不分页的解决方法

pagehelper 不分页的解 pagehelper PageHelper.startPage(1, 10);只对该语句以后的第一个查询语句得到的数据进行分页, 就算你在PageInfo pa new PageInfo("",对象);语句里面的对象是写的最终得到的数据,该插件还是只会对第一个查询所查询出来的数据进行分页 第一…

最近流行的12个笑话,好笑又有道理

来源 | 悦读文摘&#xff08;ID&#xff1a;yueduwz&#xff09; 01 一个盲人到亲戚家做客&#xff0c;天黑后&#xff0c;他的亲戚好心为他点了个灯笼&#xff0c;说&#xff1a;“天晚了&#xff0c;路黑&#xff0c;你打个灯笼回家吧&#xff01;” 盲人火冒三丈地说&#x…

java 从jar包中读取资源文件

转载自 java 从jar包中读取资源文件 在代码中读取一些资源文件(比如图片&#xff0c;音乐&#xff0c;文本等等)&#xff0c;在集成环境(Eclipse)中运行的时候没有问题。但当打包成一个可执行的jar包&#xff08;将资源文件一并打包&#xff09;以后&#xff0c;这些资源文件找…

json常用的转换

一、json字符串与map的相互转换 首先要导入依赖&#xff0c;用的是fastjson依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.45</version> </dependency>json转map //第一…

JWT【JSON Web Token】 简述

JWT全称JSON Web Token[http://www.jwt.io/]&#xff0c;用于发送可通过数字签名和认证的东西&#xff0c;它包含一个紧凑的&#xff0c;URL安全的JSON对象&#xff0c;服务端可通过解析该值来验证是否有操作权限&#xff0c;是否过期等安全性检查。由于其紧凑的特点&#xff0…

Android增加自定义监听事件

适配器中 public interface ShippingDelOnClickListener {public void onClickListenerShippingDel(int position); }private ShippingDelOnClickListener mShippingDelOnClickListener;public void setShippingDelOnClickListener(ShippingDelOnClickListener shippingDelO…

BufferedInputStream与ImageInputStream

转载自 BufferedInputStream与ImageInputStreamBufferedInputStream读取图片文件&#xff08;jpg格式&#xff09;,但是图片大小在1M到200M之间都有&#xff0c;由于图片太大&#xff0c;不知道怎么处理好&#xff0c;谢谢各位大哥大姐教教小弟&#xff0c;现在只能读取1M以下读…