单线程缓存

单线程缓存器

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

源码:

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

相关推荐
Albert Edison10 小时前
【Redis】Centos7.9 安装 Redis 5 教程
数据库·redis·缓存
Steadfast_GG11 小时前
Redis中的通用命令
redis·缓存
颜笑晏晏15 小时前
长输入短输出场景下的 SGLang 推理性能实测前缀缓存、PD 分离配比与参数调优
缓存·推理优化·sglang·ai infra·pd分离
真实的菜16 小时前
Redis 从入门到精通(十四):Redis 7.x 新特性全解 —— 系列收官之作
数据库·redis·缓存
小小工匠17 小时前
Redis - 缓存与数据库一致性:问题分析与解决方案
redis·缓存·性能优化·消息队列·并发
闪电悠米17 小时前
黑马点评-Redis 消息队列-02_list_pubsub_limits
java·数据库·ide·redis·缓存·list·intellij-idea
折哥的程序人生 · 物流技术专研17 小时前
《Java 100 天进阶之路》第93篇:Redis实战应用:缓存策略与分布式锁(2026版)
java·redis·缓存·面试·架构·求职招聘
填满你的记忆18 小时前
10万QPS下,Redis缓存如何避免雪崩?
数据库·redis·缓存
10WTW0118 小时前
QQ本地缓存机制初步探寻
缓存·视频·md5
2601_9611940219 小时前
考研专业课在哪里参加考试|考点|流程|资料已整理
linux·考研·ubuntu·缓存·centos·负载均衡