单线程缓存

单线程缓存器

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

源码:

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

相关推荐
快乐非自愿18 分钟前
Redis--SDS字符串与集合的底层实现原理
数据库·redis·缓存
白晨并不是很能熬夜4 小时前
【RPC】第 4 篇:服务发现 — Zookeeper + 缓存容错
java·后端·程序人生·缓存·zookeeper·rpc·服务发现
手握风云-4 小时前
Redis:不只是缓存那么简单(四)
redis·缓存
懂AI的老郑5 小时前
YOLO检测系统性能优化三大核心:并行、队列与缓存
缓存·性能优化
Ares-Wang6 小时前
Flask》》Flask-Caching缓存插件
python·缓存·flask
绿豆人6 小时前
Cache缓存项目学习2
学习·缓存
冷小鱼6 小时前
Valkey 深度剖析:Redis 最佳平替的技术全景
数据库·redis·缓存·valkey
冷小鱼7 小时前
Redis 技术全景解析:从缓存基石到 AI 时代的数据引擎
数据库·redis·缓存
iwS2o90XT7 小时前
仿写一个简化版Redis,理解内存数据库
数据库·redis·缓存
虹科网络安全1 天前
艾体宝新闻|Redis 月度更新速览:2026 年 3 月
数据库·redis·缓存