单线程缓存

单线程缓存器

用户本地单线程缓存,可以防止重复查询数据。注意:由于缓存了,所以中间不能进行更新和删除,主要用于防止多次查询相同的数据。

源码:

java 复制代码
package io.gitee.chearnee.fw.common.utils.cache;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
import java.util.stream.IntStream;

/**
 * 线程缓存器,只缓存当前线程的数据
 */
public class ThreadLocalCacheUtil implements AutoCloseable {
    private final ThreadLocal<Map<?, ?>> resultCache = new ThreadLocal<>();


    public static ThreadLocalCacheUtil getInstance() {
        return new ThreadLocalCacheUtil();
    }


    /**
     * 线程缓存,值可以存入null,来作为缓存
     *
     * @param key
     * @param supplier
     * @param <K>
     * @param <V>
     * @return
     */
    @SuppressWarnings("unchecked")
    public <K, V> V get(K key, Supplier<V> supplier) {
        Map<K, V> functionResultMap = (Map<K, V>) resultCache.get();
        if (functionResultMap == null) {
            Map<K, V> reusltMap = new HashMap<>();
            V v = supplier.get();
            reusltMap.put(key, v);
            resultCache.set(reusltMap);
            return v;
        }
        if (functionResultMap.containsKey(key)) {
            return functionResultMap.get(key);
        }
        V v = supplier.get();
        functionResultMap.put(key, v);
        return v;
    }

    public void removeResultCache() {
        resultCache.remove();
    }

    @Override
    public void close() {
        removeResultCache();
    }
}

食用方式:

java 复制代码
    public static void main(String[] args) {
        try (ThreadLocalCacheUtil instance = ThreadLocalCacheUtil.getInstance()) {
            IntStream.range(0, 10)
                    .forEach(e -> {
                        String s = instance.get("666", () -> {
                            System.out.println("我只获取一次");
                            //....
                            // 要缓存的值xxx
                            return "缓存了";
                        });
                        System.out.println(s);
                    });

        }
    }

例子:一个线程中只执行了一次相同的key只执行了一次方法

相关推荐
小bo波9 天前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
小七-七牛开发者9 天前
TokenPilot:让 LLM Agent 长会话成本降 60%+ 的上下文管理
缓存·agent·token·context·上下文·推理成本
ofoxcoding16 天前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai
NeilYuen16 天前
gRPC结合FAISS构建AI助手语义缓存模块(一):设计
人工智能·缓存·faiss
taocarts_bidfans16 天前
反向海淘跨境缓存架构优化:taocarts Redis分层缓存实战技术
redis·缓存·架构·反向海淘·taocarts
退休倒计时16 天前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
炘爚16 天前
Linux——Redis
数据库·redis·缓存
小挪号底迪滴16 天前
Redis 和 MySQL 数据不一致怎么办?缓存更新策略实战
redis·mysql·缓存
闪电悠米16 天前
黑马点评-Redis ZSet-实现关注 Feed 流
服务器·网络·数据库·redis·缓存·junit·lua