• 如何手撸一个java缓存框架


    创建一个简单的Java缓存框架涉及到多个方面,包括数据结构的选择、缓存策略的实现、线程安全的保证等。下面是一个简单的Java缓存框架的核心代码案例,它将展示如何实现一个基本的缓存机制。
    首先,我们定义一个Cache接口,它包含缓存的基本操作:

    public interface Cache<K, V> {
        void put(K key, V value);
        V get(K key);
        void remove(K key);
        int size();
        void clear();
    }
    

    接下来,我们实现这个接口,创建一个基于ConcurrentHashMap的简单缓存:

    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.TimeUnit;
    public class SimpleCache<K, V> implements Cache<K, V> {
        private final ConcurrentHashMap<K, CacheValue<V>> cache;
        private final long expirationTime;
        private final TimeUnit timeUnit;
        public SimpleCache(long expirationTime, TimeUnit timeUnit) {
            this.cache = new ConcurrentHashMap<>();
            this.expirationTime = expirationTime;
            this.timeUnit = timeUnit;
        }
        @Override
        public void put(K key, V value) {
            long expirationTimestamp = System.currentTimeMillis() + timeUnit.toMillis(expirationTime);
            CacheValue<V> cacheValue = new CacheValue<>(value, expirationTimestamp);
            cache.put(key, cacheValue);
        }
        @Override
        public V get(K key) {
            CacheValue<V> cacheValue = cache.get(key);
            if (cacheValue == null || isExpired(cacheValue)) {
                return null;
            }
            return cacheValue.getValue();
        }
        @Override
        public void remove(K key) {
            cache.remove(key);
        }
        @Override
        public int size() {
            return cache.size();
        }
        @Override
        public void clear() {
            cache.clear();
        }
        private boolean isExpired(CacheValue<V> cacheValue) {
            return System.currentTimeMillis() > cacheValue.getExpirationTimestamp();
        }
        private static class CacheValue<V> {
            private final V value;
            private final long expirationTimestamp;
            public CacheValue(V value, long expirationTimestamp) {
                this.value = value;
                this.expirationTimestamp = expirationTimestamp;
            }
            public V getValue() {
                return value;
            }
            public long getExpirationTimestamp() {
                return expirationTimestamp;
            }
        }
    }
    

    在这个简单的实现中,我们使用ConcurrentHashMap来存储键值对,并且每个值都有一个过期时间。当获取一个值时,我们会检查它是否已经过期,如果过期则返回null
    这个缓存框架非常基础,它没有实现复杂的缓存策略(如LRU)或者分布式缓存功能。在实际应用中,你可能需要添加更多的功能和配置选项,例如缓存加载器、缓存写回策略、缓存事件监听器等。
    要使用这个缓存框架,你可以像这样创建一个缓存实例并使用它:

    public class CacheExample {
        public static void main(String[] args) {
            Cache<String, String> cache = new SimpleCache<>(10, TimeUnit.SECONDS);
            cache.put("key", "value");
            String value = cache.get("key");
            System.out.println(value); // 输出: value
            // 等待超过过期时间
            try {
                Thread.sleep(11000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            value = cache.get("key");
            System.out.println(value); // 输出: null,因为值已经过期
        }
    }
    

    这个例子展示了如何创建一个简单的Java缓存框架,并使用它来存储和获取值。在实际项目中,你可能需要根据具体需求来扩展和优化这个框架。

  • 相关阅读:
    Linux(二)
    C++ struct结构体内存对齐
    老电脑不能装纯净版windows
    对输入信号的抽样值求解码输出和量化误差
    excel公式怎么完全复制到另一列?
    牛客NC233 加起来和为目标值的组合(四)【中等 DFS C++、Java、Go、PHP】
    btree,hash,fulltext,Rtree索引类型区别及使用场景
    288页18万字智能化校园总体设计 目录
    【SpringBoot】Spring常用注解总结
    腾讯云的ubuntu系统,远程登录不上,解决方案
  • 原文地址:https://blog.csdn.net/qq_36083245/article/details/139544059