Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
晶之木
advanced-java
提交
ba58ad44
A
advanced-java
项目概览
晶之木
/
advanced-java
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
advanced-java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ba58ad44
编写于
11月 29, 2018
作者:
Y
yanglbme
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(docs): fix typo
上级
6b82ceec
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
12 addition
and
11 deletion
+12
-11
docs/distributed-system/distributed-session.md
docs/distributed-system/distributed-session.md
+12
-11
未找到文件。
docs/distributed-system/distributed-session.md
浏览文件 @
ba58ad44
...
...
@@ -7,20 +7,20 @@
当然了,分布式系统中的问题何止这么一点,非常之多,复杂度很高,但是这里就是说下常见的几个,也是面试的时候常问的几个。
## 面试题剖析
session 是啥?浏览器有个 cookie,在一段时间内这个 cookie 都存在,然后每次发请求过来都带上一个特殊的
jsessionid cookie
,就根据这个东西,在服务端可以维护一个对应的 session 域,里面可以放点数据。
session 是啥?浏览器有个 cookie,在一段时间内这个 cookie 都存在,然后每次发请求过来都带上一个特殊的
`jsessionid cookie`
,就根据这个东西,在服务端可以维护一个对应的 session 域,里面可以放点数据。
一般只要你没关掉浏览器,cookie 还在,那么对应的那个 session 就在,但是
cookie 没了,session
就没了。常见于什么购物车之类的东西,还有登录状态保存之类的。
一般只要你没关掉浏览器,cookie 还在,那么对应的那个 session 就在,但是
如果 cookie 没了,session 也
就没了。常见于什么购物车之类的东西,还有登录状态保存之类的。
这个不多说了,懂 Java 的都该知道这个。
但是你单块系统的时候这么玩儿 session 没问题啊,但是你要是分布式系统了
呢,那么多的服务,session 状态在哪儿维护啊?
单块系统的时候这么玩儿 session 没问题,但是你要是分布式系统
呢,那么多的服务,session 状态在哪儿维护啊?
其实方法很多,但是常见常用的是两种:
### tomcat + redis
这个其实还挺方便的,就是使用 session 的代码跟以前一样,还是基于 tomcat 原生的 session 支持即可,然后就是用一个叫做
Tomcat RedisSessionManager 的东西,让所有我们部署的
tomcat 都将 session 数据存储到 redis 即可。
这个其实还挺方便的,就是使用 session 的代码跟以前一样,还是基于 tomcat 原生的 session 支持即可,然后就是用一个叫做
`Tomcat RedisSessionManager`
的东西,让所有我们部署得
tomcat 都将 session 数据存储到 redis 即可。
在 tomcat 的配置文件中
,配置一下
:
在 tomcat 的配置文件中
配置
:
```
xml
<Valve
className=
"com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"
/>
...
...
@@ -32,7 +32,8 @@ session 是啥?浏览器有个 cookie,在一段时间内这个 cookie 都存
maxInactiveInterval=
"60"
/>
```
搞一个类似上面的配置即可,你看是不是就是用了 RedisSessionManager,然后指定了 redis 的 host 和 port 就 ok 了。
然后指定 redis 的 host 和 port 就 ok 了。
```
xml
<Valve
className=
"com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"
/>
<Manager
className=
"com.orangefunction.tomcat.redissessions.RedisSessionManager"
...
...
@@ -45,11 +46,11 @@ session 是啥?浏览器有个 cookie,在一段时间内这个 cookie 都存
### spring session + redis
分布式会话的这个东西重耦合在 tomcat 中
,如果我要将 web 容器迁移成 jetty,难道还要重新把 jetty 都配置一遍?
第一种方式会与 tomcat 容器重耦合
,如果我要将 web 容器迁移成 jetty,难道还要重新把 jetty 都配置一遍?
因为上面那种 tomcat + redis 的方式好用,但是会
**严重依赖于web容器**
,不好将代码移植到其他 web 容器上去,尤其是你要是换了技术栈咋整?比如换成了 spring cloud 或者是 spring boot 之类的
。还得好好思忖思忖。
因为上面那种 tomcat + redis 的方式好用,但是会
**严重依赖于web容器**
,不好将代码移植到其他 web 容器上去,尤其是你要是换了技术栈咋整?比如换成了 spring cloud 或者是 spring boot 之类的
呢?
所以现在比较好的还是基于
java 一站式解决方案,spring 了。人家 spring 基本上包掉了大部分我们需要使用的框架了,spirng cloud 做微服务了,spring boot 做脚手架了
,所以用 sping session 是一个很好的选择。
所以现在比较好的还是基于
Java 一站式解决方案,也就是 spring。人家 spring 基本上包掉了大部分我们需要使用的框架,spirng cloud 做微服务,spring boot 做脚手架
,所以用 sping session 是一个很好的选择。
在 pom.xml 中配置:
```
xml
...
...
@@ -65,7 +66,7 @@ session 是啥?浏览器有个 cookie,在一段时间内这个 cookie 都存
</dependency>
```
spring 配置文件
:
在 spring 配置文件中配置
:
```
xml
<bean
id=
"redisHttpSessionConfiguration"
class=
"org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"
>
...
...
@@ -126,4 +127,4 @@ public class TestController {
上面的代码就是 ok 的,给 sping session 配置基于 redis 来存储 session 数据,然后配置了一个 spring session 的过滤器,这样的话,session 相关操作都会交给 spring session 来管了。接着在代码中,就用原生的 session 操作,就是直接基于 spring sesion 从 redis 中获取数据了。
实现分布式的会话,有很多种很多种方式,我说的只不过比较常见的两种方式,tomcat + redis 早期比较常用,但是会重耦合到 tomcat 重;近些年,通过 spring session 来实现。
\ No newline at end of file
实现分布式的会话,有很多种很多种方式,我说的只不过比较常见的两种方式,tomcat + redis 早期比较常用,但是会重耦合到 tomcat 中;近些年,通过 spring session 来实现。
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录