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 = 12,
Name = "Test",
Permissions = new List<string>{"Home.page"}
};
var token = _sessionHelper.CreateSession(userLoginInfo);
var cookie = new HttpCookie("User")
{
Expires = DateTime.Now.AddMinutes(20),
Value = token
};
Response.AppendCookie(cookie);
return View();
}
当然 结果是成功的图就不贴了,这就是 Cookie+缓存 实现一套最基本的会话管理机制。
部分内容引用自 邹琼俊 ASP.NET Redis 开发
逆心 ServiceStack.Redis之IRedisClient < 第三篇 >