基于 Redis 的 Session 共享示例

本贴最后更新于 2844 天前,其中的信息可能已经天翻地覆


在单机情况下,Session可由部署在服务器上的Web容器来管理 (如Tomcat、JBoss)。

在负载均衡的集群环境下,负载均衡可能将请求分发到不同的服务器上去,在这种情况,需要将有状态的session统一管理起来。

本文将给出一个简单的示例,将session存放到Redis统一管理。因为只是一个示例,所以Nginx只用1台,Tomcat使用2台,Redis一个或者简单的主从。

环境准备

准备Redis

下载redis-3.2.3.tar.gz (Redis.io下载)

解压缩redis

tar -zvxf redis-3.2.3.tar.gz


 

将解压缩后的redis文件名改成好记点的6379 (可以不重命名)。

然后使用make && make install 完成安装。

[root@dev18 redis]# mv redis-3.2.3 6379 [root@dev18 redis]# cd 6379 [root@dev18 6379]# make && make install 

安装成功之后,出现如下显示:

因为本版本使用的Redis版本是3.2.3, 在这个版本中,有protected mode的属性(默认是yes),进入6379目录,修改redis.conf配置文件。从而,其它网段的程序可以去访问,否则可能会出现如下的错误。

Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside. at redis.clients.jedis.Protocol.processError(Protocol.java:117) at redis.clients.jedis.Protocol.process(Protocol.java:151) at redis.clients.jedis.Protocol.read(Protocol.java:205) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297) at redis.clients.jedis.Connection.getIntegerReply(Connection.java:222) at redis.clients.jedis.Jedis.sadd(Jedis.java:1057) at jedis.example.Main.main(Main.java:36) 

修改后保存。

进入src目录,启动Redis服务

[root@dev18 6379]# cd src [root@dev18 src]# ./redis-server 

成功启动显示如下:

[root@dev18 src]# ./redis-server 10051:C 22 Dec 09:50:59.653 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf _._ _.-``__ ''-._ _.-`` `.  `_. ''-._ Redis 3.2.3 (00000000/0) 64 bit
  .-`` .-```.  ```\/ _.,_ ''-._ ( '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._ `._    /     _.-' |     PID: 10051
  `-._ `-._  `-./ _.-'    _.-' |`-._`-._ `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._ `-._`-.__.-'_.-' _.-' |`-._`-._    `-.__.-' _.-'_.-'|                                  
 | `-._`-._ _.-'_.-' | `-._    `-._`-.__.-'_.-'    _.-' `-._ `-.__.-'    _.-' `-._ _.-'                                           
              `-.__.-' 10051:M 22 Dec 09:50:59.656 # Server started, Redis version 3.2.3 10051:M 22 Dec 09:50:59.656 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 10051:M 22 Dec 09:50:59.656 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 10051:M 22 Dec 09:50:59.656 * The server is now ready to accept connections on port 6379 

准备Tomcat

下载tomcat,并解压缩为两个tomcat,并修改各自server.xml中的端口,保证两者不冲突。

本示例中,tomcat_1的端口为8082

<Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

tomcat_2的端口为8083

<Connector port="8083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

准备Session-Manager

大家可以通过如下路径获取Session-Manager的jar包和相关的依赖包,包括common-pool2和Jedis。

https://pan.baidu.com/s/1geZVozx

下载好之后,我们首先将这三个jar包,放到Tomcat目录下的lib文件夹中。

配置Context.xml,添加如下内容,具体的host和port由自己的环境决定。

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="xxx.xx.xx.xxx" port="6379" database="0" maxInactiveInterval="60" /> 

然后准备一个项目,为了方便,我直接将测试的war中的文件替换了Tomcat_Home/webapps中的ROOT的内容。也可以通过tomcat自带的examples示例来测试session。

如:http://localhost:8082/examples/servlets/servlet/SessionExample

至此,两个测试的tomat就准备好了,并且已经配置了session管理,由redis来存储。接下来,我们就需要一个Nginx用于负载,配置两个tomcat的信息即可。

准备Nginx

下载Nginx,解压,然后进入Nginx的conf目录,修改nginx.conf文件内容,找到http的部分,添加upstream,就是我们上述提到的两个tomcat。

http { upstream tomcat  { server localhost:8082; server localhost:8083;  
	}

本文Nginx的端口为8899, 自己设定了一个。

server { listen 8899;

至此Nginx, Tomcat, Session-Manager, Redis相关的环境就全部准备好了。

接下来,要做的就是启动Nginx, Tomcat, Redis,来看看 session是否存入到Redis中,自己的Web工程能不能正常运行等。

启动Nginx和Tomcat

进入NGINX_HOME/使用 nginx命令启动Nginx服务器。

进入两个tomcat_1和tomcat_2,分别启动tomcat。登录自己在ROOT中放置的WEB工程,可以看到session在Redis中存储下来了。

通过Redis-Desktop Manager查看Redis中session的信息。

配置一个Redis从服务器

通过Redis-Desktop Manager查看Redis中session的信息。

为上面的6379主服务器配置一个从服务器6380。

在6380的redis.conf中指定 是6379的slave,如:

slaveof 127.0.0.1 6379

启动从服务器:

[root@dev18 src]# ./redis-server ../redis.conf  _._ _.-``__ ''-._ _.-``    `.  `_. ''-._ Redis 3.2.3 (00000000/0) 64 bit
  .-`` .-```.  ```\/ _.,_ ''-._ ( '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6380
 |    `-._   `._    /     _.-' | PID: 14302 `-._ `-._ `-./ _.-'    _.-' |`-._`-._ `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-' |`-._`-._ `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-' `-._ `-.__.-'    _.-' `-._ _.-'                                           
              `-.__.-' 14302:S 22 Dec 12:02:55.810 # Server started, Redis version 3.2.3 14302:S 22 Dec 12:02:55.810 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 14302:S 22 Dec 12:02:55.810 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 14302:S 22 Dec 12:02:55.810 * The server is now ready to accept connections on port 6380 14302:S 22 Dec 12:02:55.810 * Connecting to MASTER 127.0.0.1:6379 14302:S 22 Dec 12:02:55.810 * MASTER <-> SLAVE sync started 14302:S 22 Dec 12:02:55.810 * Non blocking connect for SYNC fired the event. 14302:S 22 Dec 12:02:55.811 * Master replied to PING, replication can continue... 14302:S 22 Dec 12:02:55.811 * Partial resynchronization not possible (no cached master) 14302:S 22 Dec 12:02:55.815 * Full resync from master: c5038d1cbe197bbd8c8fee0e719370eac42bd6bc:1 14302:S 22 Dec 12:02:55.865 * MASTER <-> SLAVE sync: receiving 2741 bytes from master 14302:S 22 Dec 12:02:55.865 * MASTER <-> SLAVE sync: Flushing old data 14302:S 22 Dec 12:02:55.865 * MASTER <-> SLAVE sync: Loading DB in memory 14302:S 22 Dec 12:02:55.866 * MASTER <-> SLAVE sync: Finished with success

使用Redis-Desktop Manager

可以看到,主服务6379和从服务6380都包含session的相关信息。

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 44 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1273 回帖 • 1 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 667 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 140 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 1 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    288 引用 • 734 回帖 • 2 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 2 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    107 引用 • 295 回帖
  • 导航

    各种网址链接、内容导航。

    42 引用 • 175 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖 • 1 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2036 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 335 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 3 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 559 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 635 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 172 关注
  • 自由行
    4 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1520 回帖
  • gRpc
    11 引用 • 9 回帖 • 69 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注