聊聊从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. 当然,反向代 ...
随机推荐
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- 微信小程序体验(2):驴妈妈景区门票即买即游
驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...
- 运行执行sql文件脚本的例子
sqlcmd -s -d db_test -r -i G:\test.sql 黑色字体为关键命令,其他颜色(从左至右):服务器名称,用户名,密码,数据库,文件路径 通过select @@servern ...
- 【翻译】MongoDB指南/聚合——聚合管道
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
- 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解
工程开发中,往往要使用到集成GIT ,那么下面说说插件安装步骤 PS:以Myeclipse 10 为例,讲解集成安装步骤. ----------------------main------------ ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- Go结构体实现类似成员函数机制
Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...
- 从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
- 【工具使用】mac电脑使用技巧
本文地址 分享提纲: 1. mac命令行和finder的交互 2. 一些mac的插件 3. 一些开发的配置 1.mac命令行和findder交互 1)命令行中打开当前文件夹: o ...
- SAP CRM 将组件整合至导航栏中
到现在,我们已经可以让组件独立地显示.我们只是运行它.让它显示在Web UI中.让我们把组件整合进导航栏,使我们可以在正常登录Web UI时访问它. 步骤一: 为你的UI组件主窗体创建一个内向插件. ...