Caffeine实现类似redis的动态过期时间设置示例

 更新时间:2023年08月29日 10:37:33   作者:TinyThing  
这篇文章主要为大家介绍了Caffeine实现类似redis的动态过期时间示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

使用Caffeine实现缓存功能

为了替换原有的redis接口,发现存在一个问题:

原本的redis支持set(key, value, expire)这样的功能,而原始的caffeine只能全局设置过期策略,不支持类似的功能,因此需要对Caffeine包装一下,做了一个工具类实现类似redis的动态过期时间设置。

工具类实现类似redis

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Expiry;
import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
import static java.util.Objects.isNull;
/**
 * 工具类
 *
 * @author guo
 */
public class CacheUtils {
    /**
     * 不设置过期时长
     */
    public static final long NOT_EXPIRE = Long.MAX_VALUE;
    public static final Cache<String, CacheObject<?>> CAFFEINE = Caffeine.newBuilder()
            .expireAfter(new Expiry<String, CacheObject<?>>() {
                @Override
                public long expireAfterCreate(@NonNull String key, @NonNull CacheObject<?> value, long currentTime) {
                    return value.expire;
                }
                @Override
                public long expireAfterUpdate(@NonNull String key, @NonNull CacheObject<?> value, long currentTime, @NonNegative long currentDuration) {
                    return value.expire;
                }
                @Override
                public long expireAfterRead(@NonNull String key, @NonNull CacheObject<?> value, long currentTime, @NonNegative long currentDuration) {
                    return value.expire;
                }
            })
            .initialCapacity(100)
            .maximumSize(1024)
            .build();
    private static class CacheObject<T> {
        T data;
        long expire;
        public CacheObject(T data, long second) {
            this.data = data;
            this.expire = TimeUnit.SECONDS.toNanos(second);
        }
    }
    public static <T> void set(String key, T value, long expire) {
        CacheObject<T> cacheObject = new CacheObject<>(value, expire);
        CAFFEINE.put(key, cacheObject);
    }
    public static void set(String key, Object value) {
        set(key, value, NOT_EXPIRE);
    }
    @SuppressWarnings("unchecked")
    public static <T> T get(String key) {
        CacheObject<?> cacheObject = CAFFEINE.getIfPresent(key);
        if (isNull(cacheObject)) {
            return null;
        }
        return (T) cacheObject.data;
    }
    public static void delete(String key) {
        CAFFEINE.invalidate(key);
    }
    public static void delete(Collection<String> keys) {
        CAFFEINE.invalidateAll(keys);
    }
    public static void main(String[] args) throws InterruptedException {
        CacheUtils.set("A", 1, 2);
        CacheUtils.set("B", 2, 5);
        CacheUtils.set("C", 3, 8);
        System.out.println(CAFFEINE.asMap());
        Object a = CacheUtils.get("A");
        Object b = CacheUtils.get("B");
        Object c = CacheUtils.get("C");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println("-----------------");
        Thread.sleep(2000);
        a = CacheUtils.get("A");
        b = CacheUtils.get("B");
        c = CacheUtils.get("C");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println("-----------------");
        Thread.sleep(5000);
        a = CacheUtils.get("A");
        b = CacheUtils.get("B");
        c = CacheUtils.get("C");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println("-----------------");
        Thread.sleep(8000);
        a = CacheUtils.get("A");
        b = CacheUtils.get("B");
        c = CacheUtils.get("C");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println("-----------------");
    }
}

以上就是Caffeine实现类似redis的动态过期时间设置示例的详细内容,更多关于Caffeine动态过期时间设置的资料请关注脚本之家其它相关文章!

相关文章

  • Redis5之后版本的高可用集群搭建的实现

    Redis5之后版本的高可用集群搭建的实现

    这篇文章主要介绍了Redis5之后版本的高可用集群搭建的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • k8s部署redis集群实现过程实例详解

    k8s部署redis集群实现过程实例详解

    这篇文章主要为大家介绍了k8s部署redis集群实现过程实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Redis秒杀实现方案讲解

    Redis秒杀实现方案讲解

    这篇文章主要介绍了Redis秒杀实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • 详解Redis 数据类型

    详解Redis 数据类型

    这篇文章主要介绍了Redis 数据类型的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Redis集群节点通信过程/原理流程分析

    Redis集群节点通信过程/原理流程分析

    这篇文章主要介绍了Redis集群节点通信过程/原理,详细介绍了Cluster(集群)的节点通信的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • redis分布式锁解决缓存双写一致性

    redis分布式锁解决缓存双写一致性

    这篇文章主要为大家介绍了redis分布式锁解决缓存双写一致性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • redis zset实现滑动窗口限流的代码

    redis zset实现滑动窗口限流的代码

    这篇文章主要介绍了redis zset实现滑动窗口限流,滑动窗口算法思想就是记录一个滑动的时间窗口内的操作次数,操作次数超过阈值则进行限流,本文通过实例代码给大家详细介绍,需要的朋友参考下吧
    2022-03-03
  • Redis中散列类型的常用命令小结

    Redis中散列类型的常用命令小结

    散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型。下面就来详细介绍下Redis中散列类型的常用命令,有需要的可以参考学习。
    2016-09-09
  • Redis分布式锁防止缓存击穿的实现

    Redis分布式锁防止缓存击穿的实现

    本文主要介绍了Redis分布式锁防止缓存击穿的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Redis+AOP+自定义注解实现限流

    Redis+AOP+自定义注解实现限流

    这篇文章主要为大家详细介绍了如何利用Redis+AOP+自定义注解实现个小功能:自定义拦截器限制访问次数,也就是限流,感兴趣的可以了解一下
    2022-06-06

最新评论