一、简介

Redis是著名的NOSQL数据库,本质就是存储键值对结构的数据,为存储键值对数据做了优化,在大型网站中应用很多。Redis提供了数据的自动过期处理,因此适合存储临时数据。

和Redis类似的还有Memcached, Redis可以把数据持久化到硬盘中,而Memcached是放到内存中,重启后就消失,一般用Memcached做缓存。


二、Redis服务器的部署(Windows)

Redis服务器有Linux、Windows版,Linux版性能好适合生产环境。这里只说明Windows里配置Redis服务器,用于开发。

1.安装Redis服务

文件下载:redisbin_x32

安装路径不要包含中文或其他特殊符号,解压后服务相关文件如下:

redis-server.exe单击该文件虽然可以开启服务,但是要一直保证这个文件不能关闭,双击点开如图:

2.把Redis服务配置到Windows服务里

说明:配置此项后,不必去通过找到“redis-server.exe”文件单击打开一直挂着,才能使用服务。

文件下载:RedisWatcher1

解压安装后相关文件如下:

修改“watcher.conf”文件里,打开文件,进行图片说明的操作

修改后去Windows服务里开启Redis服务,如图:


三、在.net中操作Redis

1.在项目中导入相关的.dll文件的引用

文件下载:Redis.Net驱动

相关.dll如图:

2.创建一个RedisManage类

写入以下关键代码:

 using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Redis_Test
{
class RedisManage
{ public static PooledRedisClientManager ClientManager { get; private set; }
static RedisManage()
{
RedisClientManagerConfig redisConfig = new RedisClientManagerConfig();
redisConfig.MaxWritePoolSize = ;
redisConfig.MaxReadPoolSize = ; //可以读写分离,指定一台服务器读,一台写。
// new PooledRedisClientManage(读写的服务器地址,只读的服务器地址
ClientManager = new PooledRedisClientManager(new string[] { "127.0.0.1" },
new string[] {"127.0.0.1"}, redisConfig);
} }
}

RedisManage

3.存储信息的方法

             using (IRedisClient con = RedisManage.ClientManager.GetClient())
{
//存数据
con.Set<int>("age", );
Dictionary<string, string> dic = new Dictionary<string, string>();
dic["yzk"] = "test";
con.Set<Dictionary<string, string>>("dic", dic); }

 4.读取数据

  using (IRedisClient con = RedisManage.ClientManager.GetClient())
{
//取数据
int age = con.Get<int>("age");
Console.WriteLine(age);
Dictionary<string, string> dic = con.Get<Dictionary<string, string>>("dic");
Console.WriteLine(dic["yzk"]); }

5. 支持写入数据设置超时:

bool Set<T>(string key, T value, DateTime expiresAt);

第三个参数DateTime,可以指定数据到期时间,到期数据将不存在服务器里


四、在项目解决的一些问题

1.同一个用户名只能在一台电脑或者一个浏览器中登陆,严格来说是一个Session,Web中很难区别是否是同一台电脑,

 这里的本质是使用用户名与SessionID进行键值对关联,存储到Redis中。

技术思路:在编写用户登陆代码处,将用户名(唯一)做为键,当前的SessionId作为值,存储到Redis数据库中。然后在每次请求页面时,

就把当前SessionID取出,在把对应的Redis中的SessionId取出,两者进行比较,假如这时用户已经换了浏览器登陆,那么Redis中对应的SessionID将覆盖了,

两者不对等,那么就证明该用户在其他地方进行了登陆。

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

俗语:但凡登陆就要用当前SessionID覆盖Redis中的SessionID,只要每当请求,发现当前SessionID与Redis中的不同,该页面就要清除登陆,清除Session,说明这个用户去了其他位置登陆了。

代码参考,登录成功某处:

   context.Session["user"] = model;
//用户名与SessionId键值对关系存储到Redis中
using (var con = RedisManage.ClientManager.GetClient())
{
//存数据
con.Set<string>(model.username,context.Session.SessionID); }

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

由于,用户每次请求页面都要检查,我将此操作配置到Global文件中:

参考代码:

 using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using Model;
namespace rupeng
{
public class Global : System.Web.HttpApplication
{ public override void Init()
{
base.Init();
//必须到Init()中监听
//每个需要Seesion页面启动都会执行AcquireRequestState事件
//AcquireRequestState事件执行的时候Session已经准备好了
this.AcquireRequestState += Global_AcquireRequestState;
} void Global_AcquireRequestState(object sender, EventArgs e)
{
if (HttpContext.Current.Session==null)
{
return;
} if (Context.Session["user"]==null) //排除用户没有登录
{
return;
}
user_guest model= Context.Session["user"] as user_guest;
using (var con = RedisManage.ClientManager.GetClient())
{
string redis_sId = con.Get<string>(model.username); //发现不对等,用户在其他位置登陆了,销毁当前Seesion
if (redis_sId!=Context.Session.SessionID)
{
Context.Session.Clear();
Context.Session.Abandon();
} } } protected void Application_Start(object sender, EventArgs e)
{ } protected void Session_Start(object sender, EventArgs e)
{ } protected void Application_BeginRequest(object sender, EventArgs e)
{ } protected void Application_AuthenticateRequest(object sender, EventArgs e)
{ } protected void Application_Error(object sender, EventArgs e)
{ } protected void Session_End(object sender, EventArgs e)
{ } protected void Application_End(object sender, EventArgs e)
{ }
}
}

Global

.Net中初探Redis的更多相关文章

  1. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...

  2. .NET中使用Redis

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...

  3. 转:.NET中使用Redis (一)

    原文来自于:http://blog.jobbole.com/83821/ 原文出处: 寒江独钓   欢迎分享原创到伯乐头条 Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Gi ...

  4. .NET中使用Redis 转发

    .NET中使用Redis   Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http: ...

  5. .NET中使用Redis:http://www.cnblogs.com/yangecnu/p/Introduct-Redis-in-DotNET.html

    .NET中使用Redis   Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http: ...

  6. 【转载】.NET中使用Redis

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...

  7. .NET中使用Redis (二)

    很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务端,以及如何在.NET中调用Redis读取数据.本文简单介绍如何设计NoSQL数据库,以及如何使用Redis来存储对象. 和 ...

  8. 如何在ASP.NET Core中使用Redis

    注:本文提到的代码示例下载地址> https://code.msdn.microsoft.com/How-to-use-Redis-in-ASPNET-0d826418 Redis是一个开源的内 ...

  9. ABP中使用Redis Cache(1)

    本文将讲解如何在ABP中使用Redis Cache以及使用过程中遇到的各种问题.下面就直接讲解使用步骤,Redis环境的搭建请直接网上搜索. 使用步骤: 一.ABP环境搭建 到http://www.a ...

随机推荐

  1. C# 获取类名

    1.获取C#类中类名 System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name; 2.获取C#类中类名(包含命名空间) Sy ...

  2. ionic3 引入第三方库(jquery)

    安装 npm install jquery npm install @types/jquery 在需要的ts文件中引入,一定要在最顶端 import * as $ from '../../../nod ...

  3. 如何使一个div能够铺满整个页面? && 模态框的制作 && outerHTML

    说明: 使用 ele.outerHTML = '' 这样的方法可以很容易的清除一个元素. 当然也可以使用parent.removeChild() ,但是相较而言,还是使用 outerHTML = '' ...

  4. Rails 中 mattr_accessor 一处文档错误

    http://xiewenwei.github.io/blog/2015/01/11/mattr-accessor-in-ruby-on-rails-activesupport/ module Hai ...

  5. 带双反斜杠的Json数据至单反斜杠的Json数据处理

    假如你光看标题,你只能哦呵呵了!我也看不懂.还是先描述下问题吧.这里是使用微信接口返回了一些数据.因为该串数据包含html标签所以TX是对该串数据进行了编码的.所有的数据是通过Unicode编码的,然 ...

  6. spring异常被吞的一种情形

    你是否遇到过下面的情况,控制台无限的输出下面的日志: Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImp ...

  7. SpringMVC的参数绑定

    一.@RequestMapping注解说明   通过@RequestMapping注解可以定义不同的处理器映射规则. URL路径映射 @RequestMapping(value="/item ...

  8. vue+cordova项目

    教你用Cordova打包Vue项目   现在国内越来越多的开发者使用Vue开发混合app,但是当大家开发完成过后才发现不知道该怎么将Vue项目打包成app.据我现在的了解打包Vue项目目前流行的就是使 ...

  9. EPPlus导入导出不占用进程

    导入: using (ExcelPackage package = new ExcelPackage(new FileStream(openFile.FileName, FileMode.Open, ...

  10. vue中echarts引入中国地图

    <div id="myChartChina" :style="{width: '100%', height: '500px'}"></div& ...