我的编程空间,编程开发者的网络收藏夹
学习永远不晚

redis能否代替session

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

redis能否代替session

今天就跟大家聊聊有关redis能否代替session,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

                                                           什么是Redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API.

redis能否代替session

1.与其他用户状态保存方案比较

一般开发中用户状态使用session或者cookie,两种方式各种利弊。

Session:在InProc模式下容易丢失,并且引起并发问题。如果使用SQLServer或者SQLServer模式又消耗了性能

Cookie则容易将一些用户信息暴露,加解密同样也消耗了性能。

Redis采用这样的方案解决了几个问题,

1.Redis存取速度快。

2.用户数据不容易丢失。

3.用户多的情况下容易支持集群。

4.能够查看在线用户。

5.能够实现用户一处登录。

6.支持持久化。

2.实现思路

1.我们知道session其实是在cookie中保存了一个sessionid,用户每次访问都将sessionid发给服务器,服务器通过ID查找用户对应的状态数据。

在这里我的处理方式也是在cookie中定义一个sessionid,程序需要取得用户状态时将sessionid做为key在Redis中查找。

2.同时session支持用户在一定时间不访问将session回收。

借用Redis中Keys支持过期时间的特性支持这个功能,但是在续期方面需要程序自行拦截请求调用这个方法(demo有例子)

下面开始代码说明

3.Redis调用接口

首先引用ServiceStack相关DLL。

在web.config添加配置,这个配置用来设置Redis调用地址每台服务用【,】隔开。主机写在第一位

 <appSettings>
     <!--每台Redis之间用,分割.第一个必须为主机-->
    <add key="SessionRedis" value="127.0.0.1:6384,127.0.0.1:6384"/>
 </appSettings>

初始化配置

static Managers()
        {
            string sessionRedis= ConfigurationManager.AppSettings["SessionRedis"];
            string timeOut = ConfigurationManager.AppSettings["SessionRedisTimeOut"];
            if (string.IsNullOrEmpty(sessionRedis))
            {
                throw new Exception("web.config 缺少配置SessionRedis,每台Redis之间用,分割.第一个必须为主机");
            }
            if (string.IsNullOrEmpty(timeOut)==false)
            {
                TimeOut = Convert.ToInt32(timeOut);
            }
            var host = sessionRedis.Split(char.Parse(","));
            var writeHost = new string[] { host[0] };
            var readHosts = host.Skip(1).ToArray();
            ClientManagers = new PooledRedisClientManager(writeHost, readHosts, new RedisClientManagerConfig
            {
                MaxWritePoolSize = writeReadCount,//“写”链接池链接数
                MaxReadPoolSize = writeReadCount,//“读”链接池链接数
                AutoStart = true
            });
        }

为了控制方便写了一个委托

 /// <summary>
        /// 写入
        /// </summary>
        /// <typeparam name="F"></typeparam>
        /// <param name="doWrite"></param>
        /// <returns></returns>
        public F TryRedisWrite<F>(Func<IRedisClient, F> doWrite)
        {
            PooledRedisClientManager prcm = new Managers().GetClientManagers();
            IRedisClient client = null;
            try
            {
                using (client = prcm.GetClient())
                {
                    return doWrite(client);
                }
            }
            catch (RedisException)
            {
                throw new Exception("Redis写入异常.Host:" + client.Host + ",Port:" + client.Port);
            }
            finally
            {
                if (client != null)
                {
                    client.Dispose();
                }
            }
        }

一个调用的例子其他的具体看源码

        /// <summary>
        /// 以Key/Value的形式存储对象到缓存中
        /// </summary>
        /// <typeparam name="T">对象类别</typeparam>
        /// <param name="value">要写入的集合</param>
        public void KSet(Dictionary<string, T> value)
        {
            Func<IRedisClient, bool> fun = (IRedisClient client) =>
            {
                client.SetAll<T>(value);
                return true;
            };
            TryRedisWrite(fun);
        }

4.实现Session

按上面说的给cookie写一个sessionid

    /// <summary>
    /// 用户状态管理
    /// </summary>
    public class Session
    {
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="_context"></param>
        public Session(HttpContextBase _context)
        {
            var context = _context;
            var cookie = context.Request.Cookies.Get(SessionName);
            if (cookie == null || string.IsNullOrEmpty(cookie.Value))
            {
                SessionId = NewGuid();
                context.Response.Cookies.Add(new HttpCookie(SessionName, SessionId));
                context.Request.Cookies.Add(new HttpCookie(SessionName, SessionId));
            }
            else
            {
                SessionId = cookie.Value;
            }
        }
    }

去存取用户的方法

        /// <summary>
        /// 获取当前用户信息
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public object Get<T>() where T:class,new()
        {
            return new RedisClient<T>().KGet(SessionId);
        }
        /// <summary>
        /// 用户是否在线
        /// </summary>
        /// <returns></returns>
        public bool IsLogin()
        {
            return new RedisClient<object>().KIsExist(SessionId);
        }
        /// <summary>
        /// 登录
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        public void Login<T>(T obj) where T : class,new()
        {
            new RedisClient<T>().KSet(SessionId, obj, new TimeSpan(0, Managers.TimeOut, 0));
        }

6.续期

默认用户没访问超过30分钟注销用户的登录状态,所以用户每次访问都要将用户的注销时间推迟30分钟

这需要调用Redis的续期方法

      /// <summary>
        /// 延期
        /// </summary>
        /// <param name="key"></param>
        /// <param name="expiresTime"></param>
        public void KSetEntryIn(string key, TimeSpan expiresTime)
        {
            Func<IRedisClient, bool> fun = (IRedisClient client) =>
            {
                client.ExpireEntryIn(key, expiresTime);
                return false;
            };
            TryRedisWrite(fun);
        }

封装以后

/// <summary>
/// 续期
/// </summary>
public void Postpone()
{
new RedisClient<object>().KSetEntryIn(SessionId, new TimeSpan(0, Managers.TimeOut, 0));
}

这里我利用了MVC3中的ActionFilter,拦截用户的所有请求

namespace Test
{
    public class SessionFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 每次请求都续期
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            new Session(filterContext.HttpContext).Postpone();
        }
    }
}

在Global.asax中要注册一下

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new SessionFilterAttribute());
        }
        protected void Application_Start()
        {
            RegisterGlobalFilters(GlobalFilters.Filters);
        }

5.调用方式

为了方便调用借用4.0中的新特性,把Controller添加一个扩展属性

public static class ExtSessions
{public static Session SessionExt(this Controller controller)
    {
        return new Session(controller.HttpContext);
    }
}

调用方法

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            this.SessionExt().IsLogin();
            return View();
        }

看完上述内容,你们对redis能否代替session有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

redis能否代替session

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis 替代php文件存储session的实例

redis 替代php文件存储session的实例 查看实例之前请先了解 PHP session_set_save_handler函数的用法定义个SessionManager 类class SessionManager {privat
2022-06-04

Rocky Linux 是否能替代CentOS

本篇文章为大家展示了Rocky Linux 是否能替代CentOS,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。近日,CentO 官方发文称CentOS Stream才是CentOS项目的未来,在接
2023-06-15

浅析jQuery能否代替JavaScript

jQuery 能否代替 JavaScript随着 Web 技术的发展,前端开发变得越来越复杂。在这个过程中,JavaScript 是最基础也是最重要的语言之一。随着 JavaScript 兴起,有了一些优秀的框架和库,例如 AngularJS、ReactJS、Vue.js、jQuery 等。jQuery 是一个非常流行的 JavaScript 库,已经成为了 Web 开发的重要
2023-05-14

Rocky Linux 发布是否能替代CentOS

Rocky Linux 发布是否能替代CentOS,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。近日,CentO 官方发文称CentOS Stream才是CentOS项目的
2023-06-15

阿里云能否替代服务器?

随着云计算的不断发展,许多企业和个人都在寻找更高效、更便捷的服务器解决方案。而此时,阿里云作为一种全新的云计算服务提供商,正逐渐被广大用户所接受。那么,阿里云是否能替代服务器?这成为了许多人关心的问题。本文将从阿里云的特点、优势和使用场景等方面,为大家详细解答这个问题。阿里云的特点:阿里云是阿里巴巴集团旗下的云计
阿里云能否替代服务器?
2023-10-30

Golang是否会替代C语言?

标题:Golang是否会替代C语言?随着软件开发领域的快速发展和技术的不断进步,人们对于新兴编程语言的讨论也日益频繁。Golang(Go语言)作为一门由Google开发的静态类型、编译型语言,自推出以来备受关注。其简洁、高效和并发特性引发
Golang是否会替代C语言?
2024-03-05

python能不能代替JavaScript

本篇内容介绍了“python能不能代替JavaScript”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!python能代替JavaScrip
2023-07-02

详解用Redis实现Session功能

0.什么是RedisRedis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API 1.与其他用户状态保存方案比较一般开发中用户状态使用session或者cookie
2022-06-04

nodejs能替代python吗

随着计算机技术的不断发展,越来越多的编程语言在开发中得到了广泛的应用,其中包括 JavaScript 和 Python 。尽管这两种语言都有自己的优点和缺点,但是很多人都在争论,node.js 能否替代 Python 。事实上,这种激烈的争论是很有意义的,因为两种语言都对应着不同的编程任务和需求。Node.js 作为一种支持服务器端 JavaScript 的语言,它提供了许多很
2023-05-24

vs能代替golang吗

vs不能代替golang,定位和目标不同,VS更适合用于开发大型项目,对于简单的小型项目来说,可能会显得过于庞大和复杂,而Go具有强大的标准库和工具集,能够简化开发过程,降低代码量,提高开发效率。虽然可以使用VS来编辑和开发Go代码,但Go
2023-07-24

python能代替JavaScript吗

python能代替JavaScript;可以利用Pyjamas实现Python代替JavaScript,Pyjamas是一种Python的ajax开发框架,可以用于代替HTML和JavaScript编写网络程序,可以重复使用和导入类和模块,并且AJAX库还可以解决互用性问题。本教程操作环境:windows10系统、Python3&&javascript1.8.5版、Dell G3电脑。python能
2022-06-29

编程热搜

目录