.Net中初探Redis

一、简介

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类

写入以下关键代码:

 1 using ServiceStack.Redis;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7
 8 namespace Redis_Test
 9 {
10     class RedisManage
11     {
12
13         public static PooledRedisClientManager ClientManager { get; private set; }
14         static RedisManage()
15         {
16             RedisClientManagerConfig redisConfig = new RedisClientManagerConfig();
17             redisConfig.MaxWritePoolSize = 128;
18             redisConfig.MaxReadPoolSize = 128;
19
20             //可以读写分离,指定一台服务器读,一台写。
21             // new PooledRedisClientManage(读写的服务器地址,只读的服务器地址
22             ClientManager = new PooledRedisClientManager(new string[] { "127.0.0.1" },
23                 new string[] {"127.0.0.1"}, redisConfig);
24         }
25
26
27     }
28 }

RedisManage

3.存储信息的方法

 1
 2             using (IRedisClient con = RedisManage.ClientManager.GetClient())
 3             {
 4                 //存数据
 5                 con.Set<int>("age", 18);
 6                 Dictionary<string, string> dic = new Dictionary<string, string>();
 7                 dic["yzk"] = "test";
 8                 con.Set<Dictionary<string, string>>("dic", dic);
 9
10             }

 4.读取数据

1  using (IRedisClient con = RedisManage.ClientManager.GetClient())
2             {
3                 //取数据
4                 int age = con.Get<int>("age");
5                 Console.WriteLine(age);
6                 Dictionary<string, string> dic = con.Get<Dictionary<string, string>>("dic");
7                 Console.WriteLine(dic["yzk"]);
8
9             }

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,说明这个用户去了其他位置登陆了。

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

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

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文件中:

参考代码:

 1 using Common;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Web;
 6 using System.Web.Security;
 7 using System.Web.SessionState;
 8 using Model;
 9 namespace rupeng
10 {
11     public class Global : System.Web.HttpApplication
12     {
13
14         public override void Init()
15         {
16             base.Init();
17             //必须到Init()中监听
18             //每个需要Seesion页面启动都会执行AcquireRequestState事件
19             //AcquireRequestState事件执行的时候Session已经准备好了
20             this.AcquireRequestState += Global_AcquireRequestState;
21         }
22
23         void Global_AcquireRequestState(object sender, EventArgs e)
24         {
25             if (HttpContext.Current.Session==null)
26             {
27                 return;
28             }
29
30
31             if (Context.Session["user"]==null)   //排除用户没有登录
32             {
33                 return;
34             }
35             user_guest model= Context.Session["user"] as user_guest;
36             using (var con = RedisManage.ClientManager.GetClient())
37             {
38                 string redis_sId = con.Get<string>(model.username);
39
40                 //发现不对等,用户在其他位置登陆了,销毁当前Seesion
41                 if (redis_sId!=Context.Session.SessionID)
42                 {
43                     Context.Session.Clear();
44                     Context.Session.Abandon();
45                 }
46
47             }
48
49
50         }
51
52
53         protected void Application_Start(object sender, EventArgs e)
54         {
55
56         }
57
58         protected void Session_Start(object sender, EventArgs e)
59         {
60
61         }
62
63         protected void Application_BeginRequest(object sender, EventArgs e)
64         {
65
66         }
67
68         protected void Application_AuthenticateRequest(object sender, EventArgs e)
69         {
70
71         }
72
73         protected void Application_Error(object sender, EventArgs e)
74         {
75
76         }
77
78         protected void Session_End(object sender, EventArgs e)
79         {
80
81         }
82
83         protected void Application_End(object sender, EventArgs e)
84         {
85
86         }
87     }
88 }

Global

时间: 2024-10-16 22:05:17

.Net中初探Redis的相关文章

.NET中使用Redis

Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近项目中需要使用Redis,这里简单记录一下Redis的安装,以及如何在.NET中使用Redis. Redis安装与启动 1. 下载Redis Redis本身没有提供Windows版本的,并且在Windows上也不太稳定,一般都将其部署到Linux环境下,Redis可以在其官网上下载, MSOpenT

.Net中使用Redis windows安装 C#

Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近项目中需要使用Redis,这里简单记录一下Redis的安装,以及如何在.NET中使用Redis. Redis安装与启动 1. 下载Redis Redis本身没有提供Windows版本的,并且在Windows上也不太稳定,一般都将其部署到Linux环境下,Redis可以在其官网上下载, MSOpenT

在java中使用redis

在java中使用redis很简单,只需要添加jedist.jar,通过它的api就可以了.而且,api和redis的语法几乎完全相同.以下简单的测试: 参考:http://www.runoob.com/redis/redis-java.html 1 package com.test.redis; 2 3 import org.junit.Test; 4 import redis.clients.jedis.Jedis; 5 6 import java.util.HashMap; 7 import

Docker中的Redis容器如何连接上进行操作?

Docker中的Redis容器如何连接上进行操作? 1.登录putty有如下信息: 公用虚拟 IP (VIP)地址42.159.156.115内部 IP 地址10.205.178.22IP address for eth0:    10.205.178.22IP address for docker0: 172.17.42.1 2. 下载 http://download.redis.io/redis-stable/redis.conf修改如下字段 # requirepass foobared去掉

.NET中使用Redis (二)

很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务端,以及如何在.NET中调用Redis读取数据.本文简单介绍如何设计NoSQL数据库,以及如何使用Redis来存储对象. 和传统的关系型数据库不同,NoSQL大部分都是以键值对存储在内存中的,我们不能直接把RDBMS里面的一些做法直接移植到NoSQL中来,一个最主要的原因是,在NoSQL中缺少RDBMS中的一些诸如join ,union以及一些在关系型数据库中效率很高的执行语句,这些在NoSQL不能很好的支持,或者说效率

整合Spring.net到asp.net网站开发中初探

整合Spring.net到asp.net网站开发中初探 http://www.veryhuo.com 2009-10-21 烈火网 投递稿件 我有话说 Spring提供了一个轻量级的用于构建企业级的应用程序的解决方案.Spring提供一致并清晰的配置并整合AOP(Aspect-Oriented Programming)至你的软件中.Spring.net最耀眼的功能是在中间层提供声明式事务管理用于构建全功能的ASP.NET框架. Spring.net是一个提供综合的基础结构用于支持企业级.Net开

如何在ASP.NET Core中使用Redis

注:本文提到的代码示例下载地址> https://code.msdn.microsoft.com/How-to-use-Redis-in-ASPNET-0d826418 Redis是一个开源的内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.它支持多种类型的数据结构:字符串,哈希表,列表,集合,有序集等等. Redis 官方没有推出Windows版本,倒是由Microsoft Open Tech提供了Windows 64bit 版本支持. 如何在Windows机器上安装Redis=>

centOS 中安装 Redis

之前安装过了 jdk,mysql,tomcat,这次安装 Redis, 1 . 首先得安装 c环境,用来编译 Redis源码, [[email protected] lib64]# clear [[email protected] lib64]# yum install gcc-c++ 接下来大约要下载 22MB 这个样子,很快就能下载完, 2 . 准备 redis 源码文件 利用 SSH 将 redis 拷贝到 centOS 中的 /soft 中,然后我在 /usr/local/ 下新建了一个

Node.js中使用redis数据库的正确姿势

Redis是一个常用的Nosql数据库,一般用来代替Memcached做缓存服务,同时它也支持数据的持久化,有着比较广泛的应用场景.在Java中使用redis我们已经比较熟悉了,那么在node.js和koa.js框架中使用Redis的正确姿势是怎样的呢? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: * Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载