cache2k cachesource使用mysql作为后端

时间:2014-10-31 21:42:33

标签: java caching cache2k

我使用cache2k作为我的java应用程序的缓存。

如果缓存不在in-mermoy缓存中,我会使用CacheSource来获取和查看请求。 但现在我想实现 put 方法。

  1. 如何将内存缓存限制为例如1000件物品(可选:有生存时间)?
  2. 如何将项目放入内存并进入mysql?只需将一个put方法添加到cachesource中? (MySQL是持久缓存)
  3. 希望有人可以帮助我。

    private static Cache<String, Integer> c =
              CacheBuilder.newCache(String.class, Integer.class)
                .source(new CacheSource<String, Integer>() {
                  public Integer get(String o) {
                    System.out.println("ACCESSING SOURCE");
                    return checkCache(o) ? 1: 0; // checkCache checks if the item is in MySQL Cache
                  }
                })
                .name("cache")
                .build();
    

1 个答案:

答案 0 :(得分:2)

对于第一个问题,您需要添加两行:

 private static Cache<String, Integer> c =
   CacheBuilder.newCache(String.class, Integer.class)
     .name("cache")
     .maxSize(1000) // limits in memory cache to 1000 entries
     .expirySecs(60) // sets expiry (time to live) to 60 seconds
     .source(new CacheSource<String, Integer>() {
       public Integer get(String o) {
         System.out.println("ACCESSING SOURCE");
         return checkCache(o) ? 1: 0;
       }
     })
    .build();

expirySecs上的两个提示:默认情况下,cache2k的默认有效期为10分钟。您可以使用expirySecs(-1)关闭到期日期。即将推出的cache2k版本0.20将清除界面:eternal(true)将关闭到期时间。 expiryDuration(long, Timeunit)是设置到期时间的新方法。方法expiryMillisexpirySecs仍然存在并受支持,但会在以后的版本中消失。

第二个问题:要使用附加的mysql持久性将条目放入缓存中,请使用以下模式:

 start database transaction
 update item in the database
 cache.remove(item key)
 commit the transaction

通过get()进行的下一次缓存访问将是未命中,调用缓存源并从数据库中获取更新的元素。如果在get()和数据库提交之间发生remove(),它将停止,直到提交事务(这实际上取决于您的mysql设置和事务隔离级别)。如果要将cache2k用作数据库持久层的缓存,则此模式也有效。

使用cache.put然后将元素插入数据库会导致并发问题,因为这两个操作不是原子的。上面的模式更安全,但速度更慢,因为每次缓存更新都需要数据库存储和提取。

另一个提示:&#34;最佳方式&#34;这样做将在未来发生变化。我现在正在为cache2k添加一般持久性支持。因此,将来只需添加数据库属性即可。