一、简介

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. J15W-J45W全铜截止阀厂家,J15W-J45W全铜截止阀价格 - 专题栏目 - 无极资讯网

    无极资讯网 首页 最新资讯 最新图集 最新标签   搜索 J15W-J45W全铜截止阀 无极资讯网精心为您挑选了(J15W-J45W全铜截止阀)信息,其中包含了(J15W-J45W全铜截止阀)厂家,( ...

  2. java文件在没有安装jdk的windows下运行。

    1.首先该工程最好是gui的,使用swing或者awt的都行. 2.使用eclipse打包jar文件. 项目名字上面点右键,选择Export,在选择java\JAR file.    选择src文件夹 ...

  3. linux设置别名

    1.查看别名: alias 2.临时设置别名 alias show='ls -al' 3.永久生效 vi 家目录/.bashrc alias mmm='mysql -uroot -p' 4.删除别名 ...

  4. Tomcat配置连接池的java实现

    1.准备 JNDI(Java Naming and Directory Interface),Java命名和目录接口.JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源.我们这 ...

  5. 二、单层感知器和BP神经网络算法

    一.单层感知器 1958年[仅仅60年前]美国心理学家FrankRosenblant剔除一种具有单层计算单元的神经网络,称为Perceptron,即感知器.感知器研究中首次提出了自组织.自学习的思想, ...

  6. Light OJ 1422 - Halloween Costumes(区间DP 最少穿几件)

    http://www.cnblogs.com/kuangbin/archive/2013/04/29/3051392.html http://www.cnblogs.com/ziyi--caolu/a ...

  7. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore (总结)

    下面对上面说的三个辅助类进行一个总结: 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待 ...

  8. apache和tomcat搭建集群

    最近在学习简单的apache服务器和两个tomcat一起搭建集群,这里简单记录一下 1.准备工作 ①搭建一个可以运行的web项目 用maven搭建springmvc项目 ,只要将这里面的web.xml ...

  9. PHP框架中.htaccess文件作用

    1..htaccess文件使用前提 .htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体地怎样接待它,就是此文件的 ...

  10. ajax提交手机号去数据库验证并返回状态值

    <script type="text/javascript"> $(function(){ $('.agree_regi').click(function(){ var ...