CaffeineCacheService.java 1.69 KB
package com.infoloop.tianting.cache;

import com.github.benmanes.caffeine.cache.Cache;
import lombok.extern.slf4j.Slf4j;

/**
 * Caffeine本地缓存服务实现
 */
@Slf4j
public class CaffeineCacheService implements CacheService {

    private final Cache<String, Object> cache;

    public CaffeineCacheService(Cache<String, Object> cache) {
        this.cache = cache;
    }

    @Override
    public Object get(String key) {
        return cache.getIfPresent(key);
    }

    @Override
    public void put(String key, Object value, int ttlSeconds) {
        // Caffeine不支持单个key的TTL,使用全局配置的过期时间
        cache.put(key, value);
    }

    @Override
    public void evict(String key) {
        cache.invalidate(key);
    }

    @Override
    public void evictByPrefix(String prefix) {
        cache.asMap().keySet().removeIf(key -> key.startsWith(prefix));
    }

    @Override
    public void clear() {
        cache.invalidateAll();
    }

    @Override
    public CacheStats getStats() {
        com.github.benmanes.caffeine.cache.stats.CacheStats caffeineStats = cache.stats();
        return CacheStats.builder()
                .localHits(caffeineStats.hitCount())
                .localMisses(caffeineStats.missCount())
                .totalRequests(caffeineStats.requestCount())
                .hitRate(caffeineStats.hitRate())
                .localSize(cache.estimatedSize())
                .build();
    }

    @Override
    public boolean exists(String key) {
        return cache.getIfPresent(key) != null;
    }

    @Override
    public long getExpire(String key) {
        // Caffeine不支持获取单个key的过期时间
        return exists(key) ? -1 : -2;
    }
}