缓存技术之session缓存管控

一、session是什么

Session是服务器端使用的一种记录客户端状态的机制,一般Session存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中;客户端只保存sessionID到cookie中,而不会保存session,session销毁只能通过invalidate或超时(默认30分钟),关掉浏览器并不会关闭session。

二、session缓存管控

1.Session交互原理

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含一个session标识(即sessionID)。如果已经包含一个sessionID说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用。

如果客户请求不包含sessionID,则为此客户创建一个session并且生成一个与此session相关的sessionID,这个sessionID将在本次响应中返回给客户端保存。
缓存技术之session缓存管控_第1张图片

2.Session缓存优势

Session缓存优势明显,在日常开发过程中,大家基于这个优势,不可避免地存在session过度使用的情况,导致缓存未能正确清理,造成其他业务的误使用,从而引发一些业务问题,严重时可导致业务受理异常或业务数据不一致,比如下面的场景:

1、由于session缓存的生命周期较长,当操作员同时打开多个tab页时,A业务保存的缓存,B业务也能取到,被错误使用。
只对某业务自己使用的信息,直接用同一个key来设值,被其他业务误用:
下图:保存缓存信息示例
保存缓存信息示例
2、缓存使用完后未清理,或者在清理之前业务有异常导致未能正确清理缓存,会有多余的缓存信息残留,被其他业务错误使用。
缓存使用完后应该及时清理,并且需要考虑在异常情况下是否也可以正确清理:
下图:清理缓存信息示例
在这里插入图片描述
从使用session导致的问题看,严重时直接造成业务受理不正确,造成业务受理风险甚至生产故障,影响客户满意度。

基于以上问题,在页面使用session的过程中,建议遵循以下原则:

1、只有页面全局通用的信息,再考虑是否有必要使用session缓存的方式来处理。
2、对于具体的业务菜单尽量不要使用,换其他的方式解决:
a) (推荐)本业务的所有信息都在handler里面处理,涉及到调用外部方法时,最安全的办法是使用Map传递值。
b) (不推荐)如果必须使用session缓存才能实现,缓存key值必须关联号码和菜单ID(建议的key格式XXXX_billId_menuId)。

你可能感兴趣的:(自动化运维,缓存,java,前端)