缓存服务新思路,创建动态查询的缓存

先看看常用缓存的形式

本地缓存

缓存在当前应用程序内存中,通常以静态变量存储,它可以是任何对象,一个值,一个集合都行

因为是在当前程序中,能很好得到控制,创建,访问都很好办,特别是集合,通过集合查询语法或自已写的算法很好过滤,取出想要的结果

然而这些数据需要多程序共用,那么需要把它集中放在一个地方,供多应用程序调用

分布式缓存

分布式缓存就是为了解决二级缓存不能解决的问题,把数据放在独立的服务器上,提供访问接口,供不同客户端程序调用

一般分为两部份,服务端,客户端接口,通过统一的客户端接口,从服务端获取数据

因为达成了统一访问,没有业务关联,因此,缓存获取方式为KEY值的形式,通过KEY值读写数据,很像一个字典,KEY为唯一,值为object

在获取到这个object后,转换为指定的本地业务对象

然而带来的问题,所有值都为object,在获取到后才能转换为本地业务对象,如果存入的是一个对象集合,要获取其中某个条件的一项

那得每次把整个集合object获取到本地再换为集合再进行查找,这样意味着多了不必要的数据传输,因此一般不会这么做

问题来了,从分布式缓存服务器中,没法按业务要求对这样的数据进行查询,通常这样的需要,替代做法是搜索引擎形式,随之带来的一系列问题...

或还有更简单的方法,对指定业务数据查询写个查询接口,这样也能满足需求,但是每种查询需求都需要写个接口,很是麻烦

能不能直接把查询条件传给缓存服务端,让服务端用条件过滤数据?

理论是可以的,只需要服务端能识别解析就能,要达成这样的条件,服务端必须能识别业务对象

这样意味着,服务端的缓存对象是由业务创建的,需要对服务端进行开发

要实现这样的系统,关键点是在查询条件传输,在本地对集合查询,一般使用Linq扩展方法,使用lambda生成筛选委托

如果能把lambda表达式传过去,服务端再解析成筛选委托就能实现目的了

实现命令解析

由于lambda表达式很复杂,不能直接序列化,是没法直接传输的,需要解析成能传输的对象,那么,要做的过程表示为

客户端:lambda查询=>解析lambda=>转换为命令对象=>序列化发送命令

服务端:接收命令反序列化=>转换为lambda=>创建查询

lambda解析参考 解析lambda实现完整查询

lambda动态创建参考 http://www.cnblogs.com/libbybyron/articles/4134494.html

服务端按业务数据缓存

服务端使用同样的业务模型创建二级缓存,在接收到命令转换为lambda查询后,很轻松就能实现内存查询了

于是整体结构设计为

数据传输层

为了增加查询效率,传输层用长TCP连接,使用连接池的概念,启动后保持指定的连接数,有请求时找其中一个连接与服务器通讯,如果都满了,再创建新的连接

同时自动释放长时间不用的连接,通过这样处理,比HTTP接口,SERVICE/WCF连接效率高很多

分布式方案

因为缓存是服务器主动创建的,做成分布式,需要客户端知道服务端有哪些缓存,因此需要做一个缓存类型和服务器映射

查询缓存时,根据映射去指定的服务器查询

通过这样设计的缓存系统,大大增加了开发效率和使用便捷性,并与业务衔接紧密

整体涉及到的东西比较多也比较复杂,就不在这里写代码实现了,需要框架支持,这里只放上开发完成的测试DEMO

测试DEMO下载:点击下载

调用示例:http://119.10.29.11:8080/page/Cache2.aspx

时间: 2024-11-05 18:11:33

缓存服务新思路,创建动态查询的缓存的相关文章

Laravel框架怎样使用阿里云ACE缓存服务

Laravel框架怎样使用阿里云ACE缓存服务 之前我写了一篇在 Laravel 4 框架中使用阿里云 OCS 缓存的文章.介绍了怎样通过扩展 Laravel 4 来支持须要 SASL 认证的阿里云 OCS 缓存服务.有网友问我.ACE 的缓存怎么在 Laravel 4 中使用.我本来认为应该能够全然用同样的办法,后来自己尝试的时候才发现,ACE 的缓存区别很大.所以再写一篇,介绍一下怎样在 Laravel 框架中使用阿里云 ACE 的缓存服务. 怎样扩展 Laravel 的缓存驱动 在 Lar

Laravel框架如何使用阿里云ACE缓存服务

Laravel框架如何使用阿里云ACE缓存服务 之前我写了一篇在 Laravel 4 框架中使用阿里云 OCS 缓存的文章,介绍了如何通过扩展 Laravel 4 来支持需要 SASL 认证的阿里云 OCS 缓存服务.有网友问我,ACE 的缓存怎么在 Laravel 4 中使用.我本来觉得应该可以完全用相同的办法,后来自己尝试的时候才发现,ACE 的缓存差别非常大.所以再写一篇,介绍一下如何在 Laravel 框架中使用阿里云 ACE 的缓存服务. 如何扩展 Laravel 的缓存驱动 在 La

ArcGIS Server 缓存服务切图范围

ArcGIS Server 缓存服务分为创建服务时同时自动建立缓存和创建服务后手动建立缓存两种. 相关资料: 缓存: 瓦片: 切片: 10.4帮助文档: 10.2帮助文档: http://resources.arcgis.com/zh-cn/help/main/10.2/index.html#//00540000000p000000 官方文档链接:http://resources.arcgis.com/zh-cn/help/main/10.2/index.html#//00540000000p0

如何实现一个缓存服务

场景:我们对于需要大量计算的场景,希望将结果缓存起来,然后我们一起来实现一个缓存服务.即对于一个相同的输入,它的输出是不变的(也可以短时间不变). 实现说明:这里实现采用GuavaCache+装饰器模式. 首先设计一个缓存服务接口. public interface CacheableService<I, O> { /** * 计算服务 * @param i * @return * @throws Exception */ O doService(I i) throws Exception;

为什么要用缓存服务器以及在 Java 中实现一个 redis 缓存服务

缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架构 在这个结构中,用户的请求通过用户层来到业务层,业务层在从数据层获取数据,返回给用户层.在用户量小,数据量不太大的情况下,这个系统运行得很顺畅.但是随着用户量越来越大,数据库中的数据越来越多,系统的用户响应速度就越来越慢.系统的瓶颈一般都在数据库访问上.这个时候可能会将上面的架构改成下面的来缓解数

项目一:第十三天 1、菜单数据管理 2、权限数据管理 3、角色数据管理 4、用户数据管理 5、在realm中动态查询用户权限,角色 6、Shiro中整合ehcache缓存权限数据

1 课程计划 菜单数据管理 权限数据管理 角色数据管理 用户数据管理 在realm中动态查询用户权限,角色 Shiro中整合ehcache缓存权限数据         2 菜单数据添加 2.1 使用combotree父菜单项数据     1. 页面:menu_add.jsp 2. 修改组件样式:easyui-combotree,修改url  树型表格treeGrid跟下来数combotree要求数据格式基本一致. Combotree通过text属性展示文本.   3. 使用treegrid组件的

java动态缓存成长小纪(一)——创建一个简单的缓存

在实际项目中,我们经常会需要使用到缓存.一般来说,缓存介质是内存:而常见的DB将数据存储在硬盘中的:缓存读取是电脉冲,而硬盘读取是机械地读取转动的硬盘,速度差异是上百倍的.所以往往可以通过缓存,对经常用到的数据进行访问,以提高速度. 创建缓存实际上就是针对两个对象,1. Cache对象,即一个缓存对象:2. CacheManager对象,即一个管理不同缓存的对象,其核心实际上就是一个Map,用来保存与获取不同缓存. 最简单的缓存 实现如下: /** * 项目名称: * 文件说明:创建一个缓存管理

varnish缓存服务

缓存的基础知识1.程序本身具有局部性时间局部性 过去访问到的数据,也有可能被两次访问 空间局部性 一个数据被访问到时,离它最近的文件可能马上也会被访问 2.命中率文档命中率 从文档个数进行衡量 字节命中率 从内容大小进行衡量 3.缓存系统的特性缓存对象 有生命周期,且是定期清理的 缓存空间耗尽 使用LRU(最近最少使用算法)或者MRU算法进行缓存项清理 不可缓存项 用户私有数据 4.缓存系统一般处理步骤接收请求解析请求 提取请求的URL及各种首部 查询缓存新鲜度检测创建响应报文发送响应报文记录日

Nginx的Web缓存服务与新浪网的开源NCACHE模块(1)

Nginx的Web缓存服务与新浪网的开源NCACHE模块 什么是web缓存 Web缓存位于内容源web服务器和客户端之间,当用户访问一个 URL时,web缓存服务器回去后端web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,web缓存服务器直接输出内容给客户端,而不是像源服务器再次发送请求.web缓存降低了内容源web服务器.数据库的负载,减轻了网络延迟,提高了用户的响应速度,增强了用户体验. 最著名的还要数Squid Cache,其主要在Unix一类系统运行.