dryu999 发表于 2017-12-21 12:16:18

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>{  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>{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 < 第三篇 >

页: [1]
查看完整版本: Redis实战与 Session缓存