envers_分代缓存和Envers

envers

Konrad最近在我们公司的技术室中分享了有关如何完成缓存的有趣文章,这是一个大型的波兰社交网络nk.pl。 算法中的核心概念之一是分代缓存 (请参阅此处或此处 )。 基本思想是,对于缓存键,您使用一些特定于实体的字符串+版本号。 每当数据更改时,版本号都会增加,从而使所有旧的缓存条目无效,并防止读取过时的数据。 这假设缓存具有一些垃圾回收,例如它可能只是LRU缓存。

当然,对于每个请求,我们都必须知道版本号–这就是为什么必须将其存储在全局缓存中(但根据我们的一致性要求,它也可以异步分布在整个集群中)。 但是,数据本身可以存储在本地缓存中。 因此,如果我们的系统是只读的,那么每个请求唯一要做的“昂贵”操作就是检索我们感兴趣的实体的版本号。这通常是非常简单的信息,可以完全保留在-记忆。

根据数据类型和使用模式,您可以缓存单个实体(例如,对于Person实体,缓存键可以是person-9128-123是id,版本号123)或全部(例如,对于一个Countries实体,缓存密钥可以是countries-8 ,版本号是8。 此外,在全局缓存中,您可以按ID或按实体保存最新的版本号; 意味着当版本更改时,您会使特定实体或所有实体无效。

编写了大部分Envers之后 ,我自然就可以将实体修订号用作缓存版本 。 随后的Envers修订版是单调递增的数字,对于每个事务,您都会获得下一个。 因此,每当缓存的实体发生更改时,您都必须使用最新的修订版号填充全局缓存。

Envers提供了几种获取修订号的方法。 在事务期间,您可以调用AuditReader .getCurrentRevision()方法,该方法将为您提供修订元数据,包括修订号。 如果您想要更细粒度的控制,则可以实现自己的侦听器( EntityTrackingRevisionListener ),请参阅docs ,并在实体更改时得到通知,并在那里更新全局缓存。 您还可以注册交易完成后的回调,并在事务边界之外更新缓存。 或者,如果您知道实体ID,则可以使用AuditReader.getRevisionsAuditQueryCreator查找最大修订版本号。

由于您可以在事务处理过程中获取当前的修订版本号,因此,如果使用事务性缓存(例如Infinispan) ,甚至可以原子地更新全局缓存中的版本/修订版。

当然,除了审计之外,所有这些仍然是Envers的主要目的:)

参考: Adam Warski博客的Blog中来自JCG合作伙伴 Adam Warski的分代缓存和Envers 。


翻译自: https://www.javacodegeeks.com/2012/07/generational-caching-and-envers.html

envers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql ado.net 实体数据模型_Visual Studio2017中如何让Entity Framework工具【ADO.NET实体数据模型】支持MYSQL数据源...

熟悉Entity Framework应该对以下图片不陌生,他就是ADO.NET实体数据模型向导:可以将数据库的表自动生成模型类,或者创建Code First的模型文件。但是这个模型向导默认只显示微软自己的SQL Server数据源,如果想使用Mysql数据源&#…

ESP8266学习笔记6:ESP8266规范wifi连接操作

一、前言 我整理了从2015年至今关于ESP8266的学习笔记,梳理出来了开发环境、基础功能、进阶学习三大部分。方便自己和他人。可点此查看,欢迎交流。 之前在笔记4《ESP8266的SmartConfig》http://blog.csdn.net/iotisan/article/details/54849410中&#x…

使用Java 8进行分组,转换和归约

1.简介 在上一篇文章中 ,我写了关于如何使用流和分组对对象集合进行分组的文章。 这很有用,但不涵盖特定的用例。 例如,有时我们不仅需要对事物进行分组,还需要将结果转换为更合适的对象。 在这篇文章中,我们将学习如…

rhel6.9 yum安装mysql_在RHEL6.9上安装MySQL5.7

通过YUM方式安装MySQL 5.7Step 1、下载MySQL源wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpmyum localinstall mysql-community-release-el6-5.noarch.rpmStep 2、配额yum源并安装MySQLyum-config-manager --disable mysql55-communityyum-config-manager …

正则表达式的\b与\B总结

\b 单词边界,是指单词与符号之间的边界,是一个位置,不是空格或字符。(这里单词可以是中文字符,英文字符,数字;   符号可以是中文符号,英文符号,空格,制表符&#xff0c…

php mysql 取最小值_php – 根据另一个值更新最小值 – MySql

循环遍历数组并检查num是否低于前一个数字.$data数组的示例:$data array([0] > array(id > 9267399, code > 5D:148, num > 64),[1] > array(id > 9267398, code > 5D:186, num > 71));–$array_to_add array();foreach($data AS $val) {…

关于flex,好像有12个属性非常重要

关于Flex,有12个属性非常重要 这几天在学习Flex布局,发现Flex真的好厉害! Flex是Flexible Box的缩写,意为“弹性布局”,用来为盒模型提供最大的灵活性。 Flex是它能够简单、完整、响应式的实现各种网页布局&#xff0c…

在Hibernate中启用实体和查询缓存

1.简介 在我执行过的与性能相关的任务中,这就是其中之一。 令人担心的是,如果每次为特定实体调用相同的查询,并且表数据在特定的时隙内不易更改,则我们可以使用Hibernate缓存查询结果。 这意味着,如果我们需要ID为1234…

php的内置函数strrpos_php strrpos 字符串查找函数内部源码实现

此函数strrpos从字符串的末尾开始查找所需要查找的字符。其他内部实现和strpos差不多是一样的。/* {{{ proto int strrpos(string haystack, string needle [, int offset]) Finds position of last occurrence of a string within another string */PHP_FUNCTION(strrpos){…

MyBatis缓存与Apache Ignite的陷阱

一周前,MyBatis和Apache ignite 宣布支持apache ignite作为MyBatis缓存(L2缓存)。 从技术上讲,MyBatis支持两个级别的缓存: 本地缓存,默认情况下始终启用 L2缓存,可选 随着Apache Ignite项目…

pptp mysql 认证_CentOS6.5搭建PPTP+Freeradius整合***管理系统

1、搭建PPTP服务php一、安装yum源mysql[rootNode ~]# cd /etc/yum.repos.d[rootNode ~]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo[rootNode ~]# yum -y install epel-relaese或web[rootNode ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_6…

OAuth2.0详解

来源博客:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程,做…

python创建方法draw_Python做图像处理(五)---ImageDraw综合应用实例:自制验证码...

前面几讲讲解了pillow库中两个最重要的模块,Image模块与ImageDraw模块,本讲小编将这两个模块综合应用起来,来制作一个随机自动生成验证码的程序。1.生成验证码程序的算法设计原理验证码通常用于网络,是网站为了防止恶意注册和网络…

java web mvc_构建Java Web应用程序时遵循MVC的三个步骤

java web mvc第1步 做 始终通过servlet / action bean处理URL(POST表单,单击链接等),而不是通过JSP处理 为什么 ActionBeans(无论某些框架调用那些类),而servlet很少是控制器 用于处理用户输入。…

unknown error mysql_mysql执行sql文件报错Error: Unknown storage engine‘InnoDB’的解决方法...

发现问题最近在工作中遇到一个问题,在运行了一个innoDB类型的sql文件,报了Error: Unknown storage engine InnoDB错误,网上查了很多方法,但是都没办法真正解决我的问题,后来解决了,在这里总结一下过程&…

JQuery 对表单进行初始化操作

提供一种如果前台页面标签比较多,如果挨个初始化的话可能会比较繁琐,这时候我们可以将后台传递的数据组装为json串,前台用jquery将代码初始化到表单中。 function loadData(jsonStr) {// alert(jsonStr.toString())var obj eval("(&qu…

Winform控件扩展

1.TextBox 增加水印 新增一个用户控件,将继承UserControl改为TextBox public partial class TextBoxEP : TextBox{public TextBoxEP(){InitializeComponent();}private const uint WT_Mark 0x1501;[DllImport("user32.dll", CharSet CharSet.Auto, SetL…

oracle 中大于等于_针对oracle安装参数调整方法

solaris针对oracle安装的shmmax参数调整方法安装数据库不能拘泥于联机文档,最近看到好几个跑oracle的sun主机上,都把和数据库内存使用相关的操作系统内核参数shmmax设置成4G,因为联机文档中“solaris系统上安装oracle”是这样写的。具体实施时…

带有JAX-WS和Spring的Web服务应用程序

1.简介 这是一个漫长的等待,但是我终于发布了一个关于使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS (用于XML Web服务的Java API)是用于以XML格式创建Web服务的一组API,我们最常将其称为基于SOAP的Web服务 &…

mysql把一个字段加到另一张表中_mysql如何能把一个表中的某一字段下的数据加入另一个表中相同字段下,条件是两表中的某字段相同?...

1、创建表create table a (name varchar(20) not null,sex varchar(10));create table b (name varchar(20) not null,sex varchar(10));2、插入值insert into a values(john,male);insert into b values(john,male);insert into a values(kate,female);insert into b values(k…