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.Sortedset

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

优质内容筛选与推荐>>
1、git使用系列 3.4 git上传忽略规则 gitignore文件不生效解决办法
2、Go语言学习笔记(2)——零散的话题(反射)
3、周报告
4、实现当前目录下开启CMD
5、centos7下python3.6安装uwsgi失败的解决方法


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn