Có, bằng cách sử dụng Ehcache, bạn có thể cấu hình bộ đệm của bạn và lấy kích thước của chúng chỉ bằng mã Java (không có cấu hình XML). Cách chính xác để tích hợp mọi thứ phụ thuộc vào kiến trúc cụ thể của bạn; Tôi sẽ giả sử Jersey làm công cụ API và Guice để tiêm phụ thuộc.
Xác định bộ nhớ cache
Hãy quản lý bộ nhớ cache của bạn có sẵn thông qua dependency injection. Điều này có thể được thực hiện thông qua mô-đun Guice:
@Provides
@Singleton
CacheManager provideCacheManager() {
CacheManager cacheManager = CacheManager.create();
/* very basic cache configuration */
CacheConfiguration config = new CacheConfiguration("mycache", 100)
.timeToLiveSeconds(60)
.timeToIdleSeconds(30)
.statistics(true);
Cache myCache = new Cache(config);
cacheManager.addCacheIfAbsent(myCache);
return cacheManager;
}
Lưu ý rằng số liệu thống kê được bật cho mycache
.
Một lần nữa, việc sử dụng bộ nhớ cache của bạn có thể được thực hiện hoàn toàn bằng mã Java nhưng phụ thuộc vào kiến trúc và thiết kế của bạn. Thông thường tôi làm điều này bằng cách sử dụng phương pháp đánh chặn (thông qua AOP) nhưng đó là một chủ đề khác.
Fetch số liệu thống kê bộ nhớ cache thông qua API REST
Với CacheManager
của bạn có sẵn thông qua dependency injection sau đó bạn có thể dây nó lên đến một endpoint REST và cho phép truy cập số liệu thống kê cache:
@Path("stats")
@Produces("text/plain")
public class StatsResource {
@Inject private CacheManager cacheManager;
@GET
public String stats() {
StringBuffer sb = StringBuffer();
/* get stats for all known caches */
for (String name : cacheManager.getCacheNames()) {
Cache cache = cacheManager.getCache(name);
Statistics stats = cache.getStatistics();
sb.append(String.format("%s: %s objects, %s hits, %s misses\n",
name,
stats.getObjectCount(),
stats.getCacheHits(),
stats.getCacheMisses()
));
}
return sb.toString();
}
}
Bây giờ bạn có thể tìm thông tin về bộ nhớ cache của bạn bằng cách gọi REST:
GET /stats
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
mycache: 8 objects, 59 hits, 12 misses
Còn JMX thì sao?
Ehcache giúp bạn dễ dàng đăng ký bộ đệm ẩn với máy chủ MBean. Nó có thể được thực hiện trong mã Java. Cập nhật mô-đun Guice của bạn, đăng ký của bạn cacheManager
với hệ thống MBeanServer
:
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ManagementService.registerMBeans(cacheManager, mBeanServer, false, false, false, true);
Bây giờ bạn có thể đính kèm JConsole để trình Java của bạn và tìm thống kê bộ nhớ cache trong các MBean net.sf.ehcache.CacheStatistics
.
Làm cách nào để sử dụng bộ nhớ cache? Từ ví dụ trên - có bao nhiêu byte làm 8 đối tượng chiếm trên heap? Chúng tôi có nhiều trường hợp ehcache và tôi đang tìm một giải pháp cho phép sử dụng bộ nhớ đệm. –
Có vẻ như ehcache bắt đầu từ phiên bản 2.6 cung cấp một cách để cấu hình bộ đệm với maxBytesOnLocalHeap(). Sẽ thuận tiện để tính toán việc sử dụng heap - http://ehcache.org/documentation/2.6/configuration/cache-size # local-heap –
Có vẻ như Ehcache không còn cung cấp getObjectCount() nữa. Có cách nào khác không? – markthegrea