Redis实战与 Session缓存
C#操作Redis的库有很多,比如C# Redis Client就很好用,
在NuGet上搜索 ServiceStack.Redis

安装到项目中,将会添加以下引用

ServiceStack.Redis 库为我们提供了RedisClient类,其继承了IDisposable接口,所以可用using块来代替try-catch-finally.
Redis有几种常用的数据类型:
1.String
2.Hash(Hash表)
3.List(双向链表)
4.Set(集合类型)
5.Sorted set
RedisClient中常用的方法
| 方法 | 说明 |
| Add | 根据传入的key-value添加一条记录,当key已存在返回false |
| FlushAll | 使所有缓存失效(清除Redis所有数据库的所有Key) |
| Get | 根据传入的key获取一条记录的值 |
| GetAll | 根据传入的多个key获取多条记录的值 |
| Remove | 根据传入的key移除一条记录 |
| RemoveAll | 根据传入的多个key移除多条记录 |
| Replace | 根据传入的key覆盖一条记录的值,当key不存在不会添加 |
| Set | 根据传入的key修改一条记录的值,当key不存在则添加 |
| SetAll | 根据传入的多个key覆盖多条记录 |
| Increment | |
| Decrement |
针对实体对象的存储,RedisClient提供了:
public bool Set<T>(string key, T value);
public bool Set<T>(string key, T value, TimeSpan expiresIn);
public bool Set<T>(string key, T value, DateTime expiresAt);
public T Get<T>(string key);
泛型方法,可以方便的存储实体对象。
针对某些事务,RedisClient提供了:
| 方法 | 说明 |
| AcquireLock | 申请对一个Key加锁(期间其他对象不能访问) |
| CreateTransaction | 创建一个事务,返回一个IRedisTransaction对象 |
| CreateSubscription | 创建一个订阅事件返回一个IRedisSubscription对象 |
| CreatePipeline | 返回一个IRedisPipeline对象 |
下面我们写一个简单Redis操作的帮助类 命名为RedisHelper,为SessionHelper做准备.
其中_ip = "127.0.0.1"表示本机回传地址,_port = 6379为Redis服务端口.
public class RedisHelper : IRedisHelper
{
private readonly string _ip = "127.0.0.1";
private readonly int _port = 6379;
private readonly string _passWord = string.Empty;
public int Expire { get; set; } public RedisHelper(int expireTime=1200)
{
Expire = expireTime;
} public RedisHelper(string ip, int port, string passWord, int expireTime=1200)
{
_ip = ip;
_port = port;
_passWord = passWord;
Expire = expireTime;
} public T GetValue<T>(string key)
{
using (var redisClient = GetRedisClient())
{
return redisClient.Get<T>(key);
}
} public bool SetValue(string key,string value)
{
using (var redisClient = GetRedisClient())
{
if (!redisClient.Set(key, value)) return false;
SetExpire(redisClient, key);
return true;
}
} public void SetValue<T>(string key,T value)
{
using (var redisClient = GetRedisClient())
{
if (redisClient.Set<T>(key, value))
SetExpire(redisClient, key);
}
} public void Delete(string key)
{
using (var redisClient = GetRedisClient())
{
redisClient.Remove(key);
}
} private RedisClient GetRedisClient()
{
return new RedisClient(_ip, _port, _passWord);
} private void SetExpire(IRedisNativeClient redisClient,string key)
{
redisClient.Expire(key, Expire);
}
}
有了RedisHelper 我们再来写一个管理Session的类:
public class SessionHelper<T>:RedisHelper, ISessionHelper<T>
{
public T GetSession(string token)
{
return !string.IsNullOrEmpty(token) ? GetValue<T>(token) : default(T);
} public string CreateSession(T value)
{
var guid = Guid.NewGuid().ToString("D");
SetValue<T>(guid,value); return guid;
} public void RemoveSession(string token)
{
Delete(token);
}
}
至此 我们在Controller中写一个Login方法来测试一下。
public ActionResult Login()
{
//登录逻辑
var userLoginInfo = new UserSession
{
Id = ,
Name = "Test",
Permissions = new List<string>{"Home.page"}
}; var token = _sessionHelper.CreateSession(userLoginInfo); var cookie = new HttpCookie("User")
{
Expires = DateTime.Now.AddMinutes(),
Value = token
}; Response.AppendCookie(cookie); return View();
}
当然 结果是成功的图就不贴了,这就是 Cookie+缓存 实现一套最基本的会话管理机制。
部分内容引用自 邹琼俊 ASP.NET Redis 开发
逆心 ServiceStack.Redis之IRedisClient < 第三篇 >
Redis实战与 Session缓存的更多相关文章
- ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存
前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资 ...
- go语言实战教程:Redis实战项目应用
项目Redis配置 在实战项目中使用Redis功能,首先需要进行Redis配置.本实战项目中,关与Redis的配置项包含:连接类型.地址.端口.公共前缀.以上配置项被定义包含在Iris框架的redis ...
- redis+cookies实现session机制(解决 手机浏览器不自动回传cookies导致session不可用问题)
昨天在手机端测试自己的项目遇到如下情况. 1.在手机上(苹果qq浏览器),登陆时存在session中的图片验证码结果,一直获取不到,考虑是cookies的问题.但是其他网站有貌似可以正常使用cooki ...
- Redis学习笔记~StackExchange.Redis实现分布式Session
回到目录 对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现 ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- Redis基础知识之—— 缓存应用场景
转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端- ...
- C# Redis实战(二) [转]
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 ...
- (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景
随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...
- C# Redis实战
转自 :http://blog.csdn.net/qiujialongjjj/article/details/16945569 一.初步准备 Redis 是一个开源的使用ANSI C 语言编写.支持 ...
随机推荐
- IOS 子视图获取父视图的控制器
UIResponder* nextResponder = [self.view.superview.superview nextResponder]; if ([nextResponder isKin ...
- hdu 1005解题报告
这道题目n的取值范围很大,1 <= n <= 100,000,000.因此肯定是需要优化才能AC. 首先我考虑到时是有没有通项公式,研究了一下,没发现什么东西,突然看到两个1时就想到会不会 ...
- Android组件生命周期(三)
Android系统试图尽可能长地保持一个应用程序进程,但是当内存低时它最终还是需要移除旧的进程.为了决定保持哪个进程及杀死哪个进程,Android将每个进程放入一个基于运行于其中的组件的重要性等级和这 ...
- 必备的实用jQuery代码段(1)
1. 如何正确地使用toggleClass: //切换(toggle)类允许你根据某个类的 //是否存在来添加或是删除该类. //这种情况下有些开发者使用: a.hasClass('blueButto ...
- Delphi 中的常用事件
OnActive 焦点称到窗体或控件时发生 OnClick 鼠标单击事件 OnDbClick 鼠标双击事件 OnClose和OnCloseQuery 当关闭一个窗体时就会响应OnClose和OnClo ...
- iOS 引导页
1. 目标需求 引导页无限轮播,且轮播到最后一张时没有跳转到头一个的感觉 pageControl的显示为可选项 是否无限轮播为可选项 手动切换图片,并再次启动自动轮转 实现点击事件 2. 实现思路 初 ...
- JSP/Servlet(一)
JSP/Servlet(一) Web应用和web.xml文件: 一.构建Web应用: 1.在任意目录下创建一个文件夹. 2.在第1步所建的文件夹内建一个WEB-INF文件夹(注意大小写). 3.进 ...
- 如何利用jquery 实现表格数据的搜索功能
在表格的操作中,常常会遇到通过关键字来搜索结果,这个功能用jquery的filter实现非常简单. 我以一个小例子说明: <table> <thead> <tr cols ...
- 汇编实现HelloWorl!
hello word~ ASSUME CS:CODE,DS:DATA DATA SEGMENT DB "HELLO WORLD" ;存储要显示的数据 DATA ENDS CODE ...
- JS消化理解
JS执行的时候是必须在网页里面执行,和样式表差不多,也是内嵌的样式表,嵌在网页里面或外部的! 一 嵌在网页里面怎么嵌? 如果你想在网页里面嵌脚本,你需要在网页里面打出一块区域,这块区域来写脚本,在写样 ...