设为首页 收藏本站
查看: 1614|回复: 0

[经验分享] Redis实战与 Session缓存

[复制链接]

尚未签到

发表于 2017-12-21 12:16:18 | 显示全部楼层 |阅读模式
  C#操作Redis的库有很多,比如C# Redis Client就很好用,
  在NuGet上搜索 ServiceStack.Redis
DSC0000.png

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

  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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426417-1-1.html 上篇帖子: 菩提尘 下篇帖子: 聊一聊Redis的数据结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表