Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Redis缓存的Session共享(附源码)

基于Redis缓存的Session共享(附源码)

作者头像
写代码的猿
发布于 2019-04-11 06:49:47
发布于 2019-04-11 06:49:47
1K00
代码可运行
举报
文章被收录于专栏:平凡少年平凡少年
运行总次数:0
代码可运行

    在上一篇文章中我们研究了Redis的安装及一些基本的缓存操作,今天我们就利用Redis缓存实现一个Session共享,基于.NET平台的Seesion共享用的最多的应该是SQLServer数据库实现,我之前参与的一个项目么么亲子社区就是用的SQLSERVER实现不同子域名之间的Session共享。先打个广告嘿嘿,么么亲子网:enmuo.comi.enmuo.com就是通过SQLSERVER实现Session共享 欢迎大家访问。

该片文章主要介绍主域名跟不同子域名之间的Session信息共享。

纠正上一篇文章中关于RredisHelper类中的一个错误,就是要把设置缓存过期时间的代码放在设置完缓存值的后面,要不当第一次给该缓存键赋值的时候设置的缓存时间不管用,这个我也不知道为真么,具体修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>

        /// 添加单个实体到链表中

        /// </summary>

        /// <typeparam name="T"></typeparam>

        /// <param name="listId"></param>

        /// <param name="Item"></param>

        /// <param name="timeout"></param>

        public void AddEntityToList<T>(string listId, T Item, int timeout = 0)

        {

            IRedisTypedClient<T> iredisClient = Redis.As<T>();

          

            var redisList = iredisClient.Lists[listId];

            redisList.Add(Item);

            iredisClient.Save();

            if (timeout >= 0)

            {

                if (timeout > 0)

                {

                    secondsTimeOut = timeout;

                }

                Redis.Expire(listId, secondsTimeOut);

            }

下面我们开始进入正题,首先介绍一下Cookie与Session的关系

    我们都知道Session是存在Server端,Cookie是存在用户浏览器本地或内存中,用户在发起一个HTTP请求时,在请求的Header中会有Cookie信息,而Cookie中有一个ASP.NET_Sessionid的值,我们就是通过这个值获取到服务器端对应的Session信息。如下图所示:

说明:图片中的token值是我的另一篇博文中用到的,本篇文章中不涉及该值。

下面介绍一下我的思路

  1.  用户在给Session赋值的操作的时候我们可以为用户生成一个唯一的cookie值作为sessionID存储在用户的客户端,该cookie的key值可以自己命名,将该cookie值作为缓存的键和Session值一起存入到Redis缓存中。当然我们也可以直接用cookie中ASP.NET_Sessionid的值。
  2.  用户使用Session值得时候就可以根据cookie中的sessionId值在缓存中取出数据即可。

程序实现逻辑:

1、  我们新建一个如下项目,只用关注红线圈住的,其他没有用

  •  CookieHelper.cs Cookie操作,主要获取或生成SessionID值
  •  RredisHelper.cs 缓存操作,详见上一篇博文
  •  SessionHelper.cs 封装的Session操作

2、  CookieHelper.cs文件

在该文件中我们首先定义一个常量const string RedisSessionCookiesId = "RedisSessionCookiesId";作为cookie中存储SessionId的健。我们用Guid.NewGuid()

生成一个唯一的值存储在cookie中作为SessionId的值,我们给cookie的Domain属性复制 "session.com",作为共享cookie的顶级域名。

具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace LONG.Common
{
   public  class CookieHelper
    {
       //sessionId 的Key
        const string RedisSessionCookiesId = "RedisSessionCookiesId";
       /// <summary>
       /// 获取设置SessionID值
       /// </summary>
       /// <returns></returns>
        public static string CreatSessionCookie()
        {
            if (HttpContext.Current.Request.Cookies[RedisSessionCookiesId] != null)
            {
                return HttpContext.Current.Request.Cookies[RedisSessionCookiesId].Value.ToString();
            }
            else
            {
                Guid guid = Guid.NewGuid();
                HttpCookie cokie = new HttpCookie(RedisSessionCookiesId);
                cokie.Value = guid.ToString();
                cokie.Expires = System.DateTime.Now.AddDays(1);
                cokie.Domain = "session.com";
                //cokie.Path = "/";
                cokie.HttpOnly = true;
                HttpContext.Current.Response.Cookies.Add(cokie);
                return guid.ToString();
            }
        }
    }
}

3、  RredisHelper.cs文件不做介绍,详见:http://www.cnblogs.com/lc-chenlong/archive/2013/07/26/3218157.html

4、 SessionHelper.cs 文件

通过索引器实现Session[“XX”]的取值赋值操作。对索引器不了解的童鞋可以百度一下。

因为在一个项目中我们可以定义很多Session,比如Session[“name”]、Session[“url”]等,然而SessionID却只有一个值,那么我们怎么区分这些Session值呢,我们可以用SessionID+”_”+Session索引值实现,如:SessionID+”_name”、 SessionID+”_url”。

  代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;


namespace LONG.Common
{
    public class SessionHelper
    {
        
       public   RedisHelper Redis = new RedisHelper(true);
        public object this[string key]
        {
            get 
            {
                key = CookieHelper.CreatSessionCookie() + "_" + key;
                
                //距离过期时间还有多少秒
                long l = Redis.TTL(key);
                return Redis.Get<object>(key); 
            }
            set 
            {
                SetSession(key,value);
            }
        }
        public   void SetSession(string key,object value)
        {
            if (string.IsNullOrWhiteSpace(key))
            {
                throw new Exception("Key is Null or Epmty");
            }
            key = CookieHelper.CreatSessionCookie() + "_"+key;
            Redis.Set<object>(key, value,60*3);
        }
        public string SessionId
        {
            get { return  CookieHelper.CreatSessionCookie();}
        }
    }
}

对Session共享测试

1、新建两个web项目

2、我们在WebForm1.aspx.cs中添加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 protected void Page_Load(object sender, EventArgs e)
        {
            test();
        }
        public void test()
        {
            SessionHelper Session = new SessionHelper();
            if (Session["user"] == null)
            {
                Session["user"] = "eric";
            }
            //为了展示两个session的过期时间不一样,让线程休眠2s
            System.Threading.Thread.Sleep(2000);
            if(Session["url"]==null)
            {
                Session["url"] = "http://baidu.com";
            }
            //Session["user"] = "qwewrwe";
            string text = string.Format("session['user']的值为:{0},距离过期时间:{1}秒", Session["user"].ToString(), Session.Redis.TTL(Session.SessionId + "_user"));
            text += "<br />";
            text += string.Format("session['url']的值为:{0},距离过期时间:{1}秒", Session["url"].ToString(), Session.Redis.TTL(Session.SessionId + "_url"));
            Response.Write(text);

        }

3、在Default.aspx中添加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public partial class _Default : System.Web.UI.Page
    {
        SessionHelper Session = new SessionHelper();
        
        protected void Page_Load(object sender, EventArgs e)
        {
               Label1.Text= Session["user"].ToString()+"___"+Session["url"].ToString();
            
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            //改变Session["user"]的值
            Session["user"] = TextBox1.Text;
            Label1.Text = Session["user"].ToString()+"___"+Session["url"].ToString();
        }
    }

4、我在IIS想新建了两个项目:session.com(对应WebForm1.aspx项目)和b.session.com(对应Default.aspx项目)

5、运行session.com下过如下:

6、运行 b.session.com,我们发现我们获取到session.com站点的session值

7、b.session.com在文本框中输入”陈龙”并点击【改变Session[user] 值】按钮。如下图:

8、刷新session.com发现session[‘user’]的值已经改变,而且过期时间也被刷新。

9、等到session.com 页面session[‘url’]的过期时间为0时刷新b.session.com

说明Session值已过期。

整个例子已经写完,如果文中有说的不对的地方欢迎指正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-07-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis缓存服务搭建及实现数据读写
发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如Memcached、Redis、mongodb等,今天得空抽时间把Redis缓存研究了一下,写下来总结一下,跟大家一起分享 一下。由于小弟水平有限又是第一次接触Redis,有些的不对的地方欢迎指出纠正。
写代码的猿
2019/04/11
6790
Redis缓存服务搭建及实现数据读写
集群间如何实现session共享【面试+工作】
集群间如何实现session共享【面试+工作】 一、引言 针对企业,为了应对庞大的用户访问压力,目前大多数大型网站服务器都采用集群部署的方式;针对个人,仅一台服务器而言,也会安装多个tomcat进行错时更新,保证更新后台业务时服务不断开,即模拟了集群的运行方式。在此集群中,我们就不得不考虑一个用户鉴权的问题,即在不同服务上如何保证用户均已登录,并能获取相同的用户登录信息。 二、Java Web推荐的(公认的)用户鉴权机制 说此部分之前先了解几个概念: 1.请求,即Request,指客户端向服务器发送的信
Java帮帮
2018/06/05
8.3K1
springboot(14)redis实现session共享
Redis介绍 Redis 是一个高性能的key-value数据库。我们平时在项目中设计数据访问的时候往往都是采用直接访问数据库,采用数据库连接池来实现,但是如果项目访问量过大或者访问过于频繁,将会对
IT架构圈
2018/06/01
3.6K0
分布式中Redis实现Session终结篇
用户1168362
2018/01/05
1.1K0
分布式中Redis实现Session终结篇
Redis实现共享Session
Session共享,一般有一个这样的场景。以往单机的项目,数据请求都是在一个服务器上,session保存在这个服务器上自然是没有问题的。但是如果项目需要部署在多台服务器上的时候,session就会存在共享的问题
benym
2022/07/14
1.9K0
.Net Core Web Api实践(三).net core+Redis+docker实现Session共享
前言:上篇文章介绍了.net core+Redis+IIS+nginx实现Session共享,本来打算直接说明后续填坑过程,但毕竟好多坑是用docker部署后出现的,原计划简单提一下.net core+Redis+docker实现Session共享,但是发现篇幅也不小,所以还是单独起草一篇,除了k8s部署docker,其它部分都有基本介绍。
李明成
2020/02/20
1.9K0
MVC4+WebApi+Redis Session共享练习(下)
上一篇文章我们主要讲解了一些webApi和redis缓存操作,这篇文章我们主要说一些MVC相关的知识(过滤器和错误处理),及采用ajax调用webApi服务。
写代码的猿
2019/04/11
7290
MVC4+WebApi+Redis Session共享练习(下)
Redis实战之session共享
我们在session中存放的是:session.setAttribute("code", code); 因为session的特点,每次访问都是一个新的sessionId.我们可以直接使用code作为key.思考:那么如果换成了Redis,还能使用code作为可以吗?
凯哥Java
2023/02/06
6990
Redis实战之session共享
高性能开发(2) Redis缓存实现分布式session共享(一)
高性能开发(2) Redis缓存实现分布式session共享(一)
Java架构师必看
2021/06/11
5280
高性能开发(2) Redis缓存实现分布式session共享(一)
分布式中使用Redis实现Session共享(一)
用户1168362
2018/01/05
2.3K0
分布式中使用Redis实现Session共享(一)
面试官:分布式环境下,如何实现session共享
随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题:
架构师修炼
2021/08/13
6030
分布式中使用Redis实现Session共享(二)
该文章讲述了如何利用Redis的配置文件实现接口的限流,并通过实例对两种方案进行了详细的对比,最后总结出了方案的优缺点。
用户1168362
2018/01/05
1.8K0
分布式中使用Redis实现Session共享(二)
Springboot +redis 实现session共享
用一个容器保存 session,就能共享了。容器可以是数据库,缓存,文件等。当然这里性能最高的还是
斯文的程序
2019/11/07
6040
Spring Boot(十一)Redis集成从Docker安装到分布式Session共享
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,Redis也是技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」首字母缩写,也就是「远程字典服务」。
磊哥
2018/12/06
5550
MVC4+WebApi+Redis Session共享练习(上)
这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西总结一下。本文也会接触一点webApi的东东,自己最近也一直在看,算是入门了吧。本文用到的知识点有MVC4、knockout.js、EntityFramework、WebApi、Redis缓存及基于Redis缓存的Session共享,都是很基础的操作,MVC我会介绍过滤器及错误捕捉,EntityFramework增删改数据,WebApi做为数据通信以及Redis的基本缓存操作等。
写代码的猿
2019/04/11
8210
MVC4+WebApi+Redis Session共享练习(上)
springboot中redis的使用和分布式session共享问题
本文旨在解决分布式系统的session如何共享问题,大致思路:session放入redis。其他解决方案:持久化、放cache等都可以,但是自从有了redis,这完全可以变的简简单单。
小尘哥
2018/08/15
3510
springboot中redis的使用和分布式session共享问题
shiro源码篇 - shiro的session共享,你值得拥有
    老师对小明说:"乳就是小的意思,比如乳猪就是小猪,乳名就是小名,请你用乳字造个句"     小明:"我家很穷,只能住在40平米的乳房"     老师:"..., 这个不行,换一个"     小明:"我每天上学都要跳过我家门口的一条乳沟"     老师:"......, 这个也不行,再换一个"     小明:"老师,我想不出来了,把我的乳头都想破了!"
青石路
2018/12/06
2.5K0
基于Cookie+Redis+Filter实现Tomcat集群Session共享
用户登录之后,将Session Id和用户信息存储到Redis中,并添加一个Cookie,将该Session Id带到客户端。当发起其他请求之后,携带该Cookie,应用服务器获取到Session Id之后去Redis中查询是否存在,如果存在则继续进行相关业务,否则提示用户未登录。那种在Cookie中存放用户信息的方式直接Pass掉了。
用户1289394
2021/02/05
4890
基于Cookie+Redis+Filter实现Tomcat集群Session共享
Spring Session工作原理
HTTP协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请求,服务器以SessionID为key来存储会话信息。在单实例应用中,可以考虑应用进程自身存储,随着应用体量的增长,需要横向扩容,多实例session共享问题随之而来。
2020labs小助手
2019/07/30
6370
集群下session共享问题的解决方案.
这一篇博客来讲解下babasport这个项目中使用的Login功能, 当然这里说的只是其中的一些简单的部分, 记录在此 方便以后查阅. 一: 去登录页面 首先我们登录需要注意的事项是, 当用户点击登
一枝花算不算浪漫
2018/05/18
2K0
相关推荐
Redis缓存服务搭建及实现数据读写
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验