单线程缓存

单线程缓存器

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

源码:

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只执行了一次方法

相关推荐
上单带刀不带妹31 分钟前
小程序图片缓存问题:时间戳和版本号解决图片不更新
缓存·小程序·vue·uniapp
她说..1 小时前
Redis项目实战整理
数据库·redis·缓存
蓝速科技3 小时前
蓝速科技丨多网点涉外窗口翻译机批量部署实战指南
服务器·数据库·人工智能·缓存·语音识别
努力努力再努力wz17 小时前
【Redis入门系列】从 KEYS 到 SCAN:渐进式遍历、Cursor 与位反转原理
数据库·redis·缓存
小宋102118 小时前
大模型成本怎么控制:Token统计、缓存与模型路由实战
人工智能·缓存
宿6741 天前
vue3-时间戳防缓存
缓存
三8441 天前
SSRF 从入门到实战(下篇):gopher 打 Redis 实现 RCE
数据库·redis·缓存
名字还没想好☜1 天前
Java 用 LinkedHashMap 三行实现 LRU 缓存:accessOrder、removeEldestEntry 与线程安全
java·后端·安全·spring·缓存
手握风云-1 天前
Redis:不只是缓存那么简单(十六)
缓存
驾驭人生2 天前
Hangfire.Redis.StackExchange 已归档停更!生产任务卡死、重复执行、网络抖动问题解决方案
数据库·redis·缓存