Tag: 缓存

从Guava RemovalListener重新插入条目是否安全?

我有一个Guava Cache (或者更确切地说,我正在从MapMaker迁移到Cache ),这些值代表长时间运行的作业。 我想将expireAfterAccess行为添加到缓存中,因为这是清理它的最佳方法; 但是,即使在一段时间内没有通过缓存访问该作业,该作业仍可能仍在运行,在这种情况下,我需要阻止它从缓存中删除。 我有三个问题: 在RemovalListener回调期间重新插入正在删除的缓存条目是否安全? 如果是这样,它是线程安全的,这样,当RemovalListener回调仍在另一个线程中发生时, CacheLoader没有可能产生该键的第二个值吗? 有没有更好的方法来实现我想要的? 这不是严格/只是一个“缓存” – 每个密钥只使用一个且只有一个值是至关重要的 – 但是我还希望在它表示的作业完成后将条目缓存一段时间。 之前我正在使用MapMaker ,我需要的行为现在已在该类中弃用。 在作业运行时定期ping地图是不优雅的,在我的情况下,不可行。 也许正确的解决方案是拥有两个地图,一个没有驱逐,一个有,并在完成时将它们迁移。 我也会提出一个function请求 – 这可以解决问题:允许锁定单个条目以防止驱逐(然后解锁)。 [编辑以添加一些细节]:此地图中的键指的是数据文件。 这些值可以是正在运行的写入作业,也可以是已完成的写入作业,或者 – 如果没有正在运行的作业 – 是一个只读,生成在查找对象,其中包含从文件中读取的信息。 每个文件正好有零个或一个条目,这一点很重要。 我可以为这两件事使用单独的地图,但必须在每个键的基础上进行协调,以确保一次只存在一个或另一个。 在获得并发性方面,使用单个映射使其更简单。

如何停止Java或Hibernate缓存

我有一个应用程序从数据库中检索数据,我监视我的应用程序检索数据所用的时间。 但是当我使用相同的数据输入集来检索我的应用程序的数据时,我遇到了一个问题,第二次检索将花费更少的时间。 我假设Java或Hibernate有一些缓存或临时文件来保存数据,所以第二次运行会很快,但我不希望它发生。 我需要监视它实际需要的时间,而不是从缓存或临时文件中检索的时间。 我试图在Java控制面板中禁止缓存和临时文件生成,我试图禁用hibernate缓存(第一级或第二级)。 但这些仍然无法解决我的问题。 第二次运行时间仍然比应该花费的时间少。 知道原因导致第二次运行得更快吗? 它只是一个从DB检索数据的简单应用程序

Guava Cache的读锁是免费的

我正在使用Guava的Cache并将concurrencyLevel设置为1因此在驱逐时会利用最大容量。 以下是我的代码: CacheBuilder.newBuilder() .maximumWeight(maxWeight) .concurrencyLevel(1) .expireAfterWrite(expireDuration, TimeUnit.MINUTES) .removalListener(new RemovalListener() { @Override public void onRemoval(RemovalNotification removalNotification) { log.warn(removalMsg + removalNotification.getKey()); } }) .weigher(weigher) .build(); concurrencyLevel的文档说明了这一点: 指导更新操作中允许的并发性。 用作内部尺寸的提示。 该表在内部进行分区,以尝试允许指定数量的并发更新而不会发生争用… 因此我假设concurrencyLevel只对update operations起作用,即使使用concurrencyLevel(1) , READs are Lock Free 。 我的假设是否正确? 编辑:我看了Guava缓存代码,看起来我的假设READs READs are lock free是正确的。 在get(K, Callable)情况下,它最初尝试获取没有锁定的值,并且如果指定键的条目为空或仅已过期,则它将进入锁定的Get或Load。 如果我在这里错了,请纠正我。

infinispan缓存服务器到期失败

我使用infinispan-5.1.6.FINAL作为远程缓存服务器和热棒协议来访问它。 但发现它没有按预期工作,即按照下面的配置,1ms后缓存的值不会被驱逐 我爆炸了战争(infinispan-5.1.6.FINAL/modules/rest/infinispan-server-rest.war),保存了上面的配置,更改了web.xml以使用它并部署在tomcat 6.0.32中 我能够通过此资源放入缓存并从中检索 http://localhost:8080/infinispan-server-rest/rest/my-cache/1 但即使在10分钟后,该条目也不会被驱逐。 顺便说一句,相同的配置工作在嵌入式缓存模式。 我错过了什么? 我怎么能让这个工作?

无法使用Infinispan服务器形成两个节点的集群

我打算使用Infinispan作为远程缓存集群,它将位于我的应用程序和数据库之间。 现在我打算制作一个包含几个节点的集群,比如说2个节点。 我在两台Ubuntu机器上使用bin/clustered.sh脚本启动了Infinispan服务器。 rkost@rj-vm9-14105:~/infinispan/infinispan-server-6.0.0.Alpha1/bin$ uname -a Linux rj-vm9-14105 2.6.35-22-server #33-Ubuntu SMP Sun Sep 19 20:48:58 UTC 2010 x86_64 GNU/Linux 下面是我使用bin/clustered.sh启动infinispan服务器后在我的两台计算机控制台上获得的结果。 现在我如何确保它们形成两个节点的集群? 他们在哪种模式下形成了一个集群,我该如何计算出一个集群? 机器1控制台 – root@rj-raptor-vm1-14938:/home/rkost/infinispan/infinispan-server-6.0.0.Alpha1/bin# sh clustered.sh ========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /home/rkost/infinispan/infinispan-server-6.0.0.Alpha1 JAVA: java JAVA_OPTS: -server -XX:+UseCompressedOops -XX:+TieredCompilation -Xms1303m -Xmx1303m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Djboss.server.default.config=clustered.xml -Dsun.nio.ch.bugLevel=” ========================================================================= 23:16:14,426 INFO [org.jboss.modules] (main) […]

Spring 3.1缓存 – 如何在SpEL中使用返回值

我试图在Spring管理的缓存(Spring 3.1抽象)中驱逐一个条目。 我需要在注释中的“key”属性的SpEL中引用方法的返回值: /* (How to refer to the ‘T’ returned value in the “KEY_ID”?) */ @Caching(evict = { @CacheEvict(value = CACHE_BY_ID, key = KEY_ID) }) public T delete(AppID appID, UserID userID) throws UserNotFoundException { return inner.delete(appID, userID); } 有没有办法做到这一点?

在S3 Client android中制作私有图像的ImageGallery

我想在我的Android应用程序中创建一个我的S3 Bucket的imageGallery。 我的图像是私有的,所以我不会为每个图像提供任何特定的链接。 对于这样的私人图像,亚马逊有一个链接生成器, s3Client.generatePresignedUrl(Constants.S3_BUCKET_NAME, key, expiration); 它生成一个URL,假设我们设置了1小时或2分钟的到期时间。 现在为了简单的内存缓存和东西,我可以使用volley或Picasso或许多其他这样的轻松加载库。 不过有这个问题。 我想将这些图像缓存在内存中。 但我所拥有的只是动态链接。 我如何让Picasso或任何其他库使用动态链接进行缓存? 根据我的信息,库使用Url作为缓存的“密钥”,是不是更正? 如果是这样我怎么能保存这些图像所以我可以稍后使用这些图像,即使我离线,再次,我有动态链接所以url将每时刻都在改变所以也许我需要用Key保存它们我传递给s3Client。 解决办法是什么。

使用Guava Cache将数据保存到硬盘

我是Guava Cache的新手。 如何在缓存中创建以下内容? 正常将数据保存在内存中。 当缓存大小超过给定数量时,它会将缓存中的数据保存在硬盘上的可配置文件中。

使用redis进行Spring启动缓存,密钥有\ xac \ xed \ x00 \ x05t \ x00 \ x06

我想使用Spring缓存@Cacheable来管理缓存。 真正的缓存是redis。 我的代码是这样的: @PostMapping(“/post”) @CachePut(value = “abc”, key = “#key”) public String putInRedis(@RequestParam String key, @RequestParam String value) { saveInDB(key, value); return value; } @GetMapping(“/get”) @Cacheable(value = “abc”, key = “#key”) public String queryRedis(@RequestParam String key) { return findByKey(key); } 我有post请求之后 本地主机:8080 /后键=键和值=价值? redis服务器看起来很奇怪 127.0.0.1:6379> keys * 1) “abc:\xac\xed\x00\x05t\x00\x03key” 127.0.0.1:6379> GET “abc:\xac\xed\x00\x05t\x00\x03key” “\xac\xed\x00\x05t\x00\x05value” Spring缓存 奇怪,Redis的琴键与弹簧-数据jedis […]

JedisPoolConfig不能分配给GenericObjectPoolConfig

我在Heroku上有一个基于Spring的java Web应用程序。 我试图使用Redis实现来利用Spring Caching抽象。 当服务器启动时,我收到一条错误消息: Type ‘redis/clients/jedis/JedisPoolConfig’ (current frame, stack[3]) is not assignable to ‘org/apache/commons/pool2/impl/GenericObjectPoolConfig’ 这是我的配置: @Bean RedisConnectionFactory jedisConnectionFactory() throws Exception { URI redisUri = new URI(System.getenv(“REDISCLOUD_URL”)); JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(); redisConnectionFactory.setHostName(redisUri.getHost()); redisConnectionFactory.setPort(redisUri.getPort()); redisConnectionFactory.setPassword(redisUri.getUserInfo().split(“:”,2)[1]); redisConnectionFactory.setUsePool(true); return redisConnectionFactory; } @Bean RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate(); try { redisTemplate.setConnectionFactory(jedisConnectionFactory()); } catch (Exception e) […]