zoukankan      html  css  js  c++  java
  • 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 < 第三篇 >

     

  • 相关阅读:
    iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解(转)
    iOS 9 添加白名单
    iOS 中字体的应用(转)
    iOS 后台操作的开发(转)
    iOS 知识点大总结(转)
    在Xcode中找中文字符串(正则表达式)
    block 使用时的注意点(转)
    xcode armv6 armv7 armv7s arm64 (转)
    使用Android studio过程中发现的几个解决R变红的办法
    折腾了一晚上的“equals”和“==”
  • 原文地址:https://www.cnblogs.com/zactor/p/6486679.html
Copyright © 2011-2022 走看看