聊聊从web session的共享到可扩展缓存设计
先从web session的共享说起
cookies
session池化
做一个可扩展的缓存策略设计
- public class RoleMenuCache implements IClearCache {
- private static Map<String, RoleMenu> roleMenuCache = new HashMap<String, RoleMenu>();
- ...业务代码省略
- }
这里主要是替换这个HashMap所以改动就比较小。


Cachemanager
- public class CacheManager {
- private final static Logger logger = LoggerFactory.getLogger(CacheManager.class);
- private static Map<String, ICache> caches = new ConcurrentHashMap<>();
- private static ICacheStrategy cacheStrategy = new DefaultCacheStategy();
- private static String cacheStrategyClass;
- @SuppressWarnings("unchecked")
- public static synchronized <T extends ICache> T getOrCreateCache(String cacheName, Class<?> keyClass, Class<?> valueCalss) {
- T cache = (T) caches.get(cacheName);
- if (cache != null) {
- return cache;
- }
- cache = (T) cacheStrategy.createCache(cacheName, keyClass, valueCalss);
- caches.put(cacheName, cache);
- return cache;
- }
- @SuppressWarnings("rawtypes")
- public static synchronized void destroyCache(String cacheName) {
- ICache cache = caches.remove(cacheName);
- if (cache != null) {
- cache.clear();
- }
- }
- }
ICache<K,V>
ICacheStrategy
- public interface ICacheStrategy {
- ICache createCache(String name, Class<?> keyClass, Class<?> valueCalss);
- void destroyCache(ICache cache);
- }
- public class DefaultCache<K, V> implements ICache<K, V> {
- protected Map<K, V> map;
- private String name;
- private long maxCacheSize;
- private long maxLifetime;
- private int cacheSize = 0;
- public DefaultCache(String name, long maxSize, long maxLifetime) {
- this.name = name;
- this.maxCacheSize = maxSize;
- this.maxLifetime = maxLifetime;
- map = new ConcurrentHashMap<K, V>(103);
- }
- @Override
- public V get(Object key) {
- return map.get(key);
- }
- @Override
- public V put(K key, V value) {
- return map.put(key, value);
- }
- @Override
- public V remove(Object key) {
- return map.remove(key);
- }
- @Override
- public void putAll(Map<? extends K, ? extends V> m) {
- map.putAll(m);
- }
- @Override
- public void clear() {
- if (map != null) {
- map.clear();
- }
- }
- }
对于调用方来说其实就很简单,只需要调用CacheManager即可,还是前面举的RoleMenuCache
- public class RoleMenuCache implements IClearCache {
- private static Map<String, RoleMenu> roleMenuCache;
- static {
- roleMenuCache = CacheManager.getOrCreateCache("permissionCache", String.class, RoleMenu.class);
- }
- ...业务代码省略
- }
对于老代码的改造还是比较小的,而且这样的好处是以后想换成redis的也很简单,对于业务代码就不需要再修改了。
- /**
- * 根据key设置map的值
- */
- @Override
- public V put(K key, V value) {
- jedisTemp.hset(name, JSON.toJSONString(key), JSON.toJSONString(value));
- return value;
- }
这并没啥问题,因为对象转换成json串是正常的。问题是get的时候,我们使用的
- CacheManager.getOrCreateCache("permissionCache", String.class, RoleMenu.class);
最终get方法的实现就是这样:
- @Override
- public V get(Object key) {
- String json = jedisTemp.hget(name, JSON.toJSONString(key));
- return (V) JSON.parseObject(json, valueClass);
- }
问题虽然是解决了,只不过总觉得怪怪的。
聊聊从web session的共享到可扩展缓存设计的更多相关文章
- session和cookie区别,多台WEB服务器如何共享session,禁用COOKIE后SESSION是否可用,为什么?
答:session的运行机制: 用户A访问站点Y,如果站点Y指定了session_start();(以下假设session_start()总是存在)那么会产生一个session_id,这个sessio ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- ASP.NET Session的共享
注: 在ashx文件中使用Session 首先添加引用 using System.Web.SessionState; 实现接口 public class XXXX: IHttpHandler ==&g ...
- 通过memcached来实现对tomcat集群中Session的共享策略
近期在做一套集群的实现,实现的方案是在Linux下完成对Apache + Tomcat 负载均衡的功能. 上述功能已经实现,有需要了解的朋友可以看我另外一篇博文. Linux下Apache与Tomca ...
- Session分布式共享 = Session + Redis + Nginx
一.Session 1.Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下. Session:在计算机中,尤其是在网络应用中,称为"会话控制 ...
- 详解Session分布式共享(.NET CORE版)
一.前言&回顾 在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的S ...
- spring-session实现分布式集群session的共享
前言 HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的.但是我们把应用搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户 ...
- Tomcat通过自带的Cluster方式实现Session会话共享环境操作记录
一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败.要 ...
- redis缓存web session
redis缓存web session 首先说下架构图.使用Redis作为会话服务器,统一管理Session.如图,集群里的WEB服务器共享存放在REDIS里面全部的客户端SESSION. 当然,反向代 ...
随机推荐
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
- web前端基础知识
#HTML 什么是HTML,和他ML... 网页可以比作一个装修好了的,可以娶媳妇的房子. 房子分为:毛坯房,精装修 毛坯房的修建: 砖,瓦,水泥,石头,石子.... 精 ...
- Shell碎碎念
1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
- css3更改input单选和多选的样式
在项目开发中我们经常会遇到需要更改input单选和多选样式的情况,今天就给大家介绍一种简单改变input单选和多选样式的办法. 在这之前先简单介绍一下:before伪类 :before 选择器向选定的 ...
- 解决Ubuntu Kylin 1610安装ANSYS17.2的NVIDIA显卡驱动问题
Ubuntu Kylin 1610在安装完毕后,会自动安装显卡驱动,对于一般的图形图像使用来说自然不会有太大的问题,但是对于ANSYS17.2的一些模块,还是会出现问题.一个比较常见的问题就是Open ...
- Xamarin.Android之Fragment Walkthrough
利用Fragment设计能够兼容不同屏幕的应用 这里我们先围观下最后的成果图,给读者打打气: 普通手机上显示的结果: 在平板上显示的结果: 笔者要郑重声明下,虽然看似是两种不同的显示效果,但是同一个应 ...
- NodeJs 开发微信公众号(三)微信事件交互
微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...
- ABP源码分析二十八:ABP.MemoryDB
这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...
- ABP源码分析四十三:ZERO的本地化
ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库管理本地化的功能.其通过数据库保存本地化语言及其资源. ApplicationLanguage:代表本地化语言的实体类.一种语言 ...