首页 > 其他分享 >Caffeine本地缓存

Caffeine本地缓存

时间:2023-09-25 17:33:25浏览次数:48  
标签:缓存 本地 cache Caffeine key println String

简单说,Caffine 是一款高性能的本地缓存组件
由下面三幅图可见:不管在并发读、并发写还是并发读写的场景下,Caffeine 的性能都大幅领先于其他本地开源缓存组件

 

代码如下所示:

package com.example.springbootstudy.test.caffeine;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @Description TODO
 * @Author Jelly
 * @Date 2023/9/25 15:44
 */
@Slf4j
public class CaffeineTest {

    public static void main(String[] args) {
        Cache<String, String> cache = Caffeine.newBuilder()
                .initialCapacity(5)
                // 超出时淘汰
                .maximumSize(10)
                //设置写缓存后n秒钟过期
                .expireAfterWrite(60, TimeUnit.SECONDS)
                //设置读写缓存后n秒钟过期,实际很少用到,类似于expireAfterWrite
                //.expireAfterAccess(17, TimeUnit.SECONDS)
                .build();

        String orderId = String.valueOf(123456789);
        String orderInfo = cache.get(orderId, key -> getInfo(key));
        System.out.println("00000000000---" + orderInfo);
        System.out.println("11111111111---" + cache.getIfPresent(orderId));

        test1();
    }

    private static String getInfo(String orderId) {
        String info = "";
        // 先查询redis缓存
        log.info("get data from redis");

        // 当redis缓存不存在查db
        log.info("get data from mysql");
        info = String.format("{orderId=%s}", orderId);
        return info;
    }


    public static void test1() {
        // 初始化缓存,设置了 1 分钟的写过期,100 的缓存最大个数
        Cache<Integer, Integer> cache = Caffeine.newBuilder()
                .expireAfterWrite(1, TimeUnit.MINUTES)
                .maximumSize(100)
                .build();

        int key = 1;
        // 使用 getIfPresent 方法从缓存中获取值。如果缓存中不存指定的值,则方法将返回 null
        System.out.println("不存在值,返回null:" + cache.getIfPresent(key));

        // 也可以使用 get 方法获取值,该方法将一个参数为 key 的 Function 作为参数传入。
        // 如果缓存中不存在该 key 则该函数将用于提供默认值,该值在计算后插入缓存中:
        System.out.println("返回默认值:" + cache.get(key, a -> 2));

        // 校验 key 对应的 value 是否插入缓存中
        System.out.println("返回key对应的value:" + cache.getIfPresent(key));

        // 手动 put 数据填充缓存中
        int value = 2;
        cache.put(key, value);

        // 使用 getIfPresent 方法从缓存中获取值。如果缓存中不存指定的值,则方法将返回 null
        System.out.println("返回key对应的value:" + cache.getIfPresent(key));

        // 移除数据,让数据失效
        cache.invalidate(key);
        System.out.println("返回key对应的value:" + cache.getIfPresent(key));
    }


}

总结:

通过对guava cache 和caffeine 从性能到算法及使用的对比中,可以发现Caffeine基本是在Guava的基础上进行优化而来的,提供的功能基本一致,但是通过对算法和部分逻辑的优化,完成了对性能极大的提升,而且我们可以发现,两者切换几乎没有成本,毕竟caffeine就是以替换guava cache为目的而来的。

参考博客:

https://blog.csdn.net/chuige2013/article/details/130940330

https://blog.csdn.net/zhangyunfeihhhh/article/details/108105928

 

标签:缓存,本地,cache,Caffeine,key,println,String
From: https://www.cnblogs.com/jelly12345/p/17728409.html

相关文章

  • Intel五代至强缓存暴增至448MB!AMD笑而不语
    Intel已经宣布,将在12月14日正式发布第五代可扩展至强EmeraldRapids,和酷睿Ultra同一天。它虽然只是SapphireRapids四代至强的升级版,不如明年Intel3工艺的GraniteRapids、SierraForest变化那么大(后者288个小核),但升级亮点依然不少。YuuKi_AnS放出了高端型号至强铂金8580的......
  • python 缓存机制如何实现(cacheout)
    Python缓存机制可以使用第三方库cacheout来实现。cacheout提供了一个Cache类,它支持多种缓存策略,包括LRU、FIFO、LFU和TTL。Cache类的基本使用方法如下:1.安装cacheout:pipinstallcacheout2.导入Cache类:fromcacheoutimportCache3.创建Cache对象:cac......
  • LFU缓存
    一.使用两个哈希实现一个哈希进行直接索引,另一个哈希根据访问频率索引双向链表/*定义Node类双链表节点,包含键、值、前驱、后继定义LFUCache类变量min_freq:当前最小频率层次capacity:容量key_to_node:根据键值索引节点的哈希freq_to_dummy:根据频率索引双链表的哈希......
  • 本地电脑打包安卓证书教程
    打包教程进入目录D:\phpstudy_pro\Extensions\jre1.8\bin键入CMD回车keytool-importkeystore-srckeystorehaiwaishifu.keystore-destkeystorehaiwaishifu.keystore-deststoretypepkcs12haiwaishifu.keystore证书名字或者keytool-genkey-aliastestalias-keyalg......
  • 如何在本地搭建微信小程序服务器
    现在开发需要购买服务器,价格还是有点贵的,可以花费小代价就可以搭建一个服务器,可以用来开发小程序,博客等。1.域名(备案过的)2.阿里云注册免费的https证书3.配置本地的nginx4.内网映射(本地安装wampserver服务器)一、域名注册花生壳,开通内网映射需要6元里面可以注册2个免费的域......
  • 本地测试Spark的逻辑回归算法
    本地小数据量测试了一下Spark的LogisticRegressionWithSGD算法,效果不尽如人意。    数据样例如下,竖杠前的0,1代表两种类型,后面逗号隔开的是两个特征,两个特征只要有一个大于等于0.6就会被分为1这一类,否则就是0。1|0.3,0.60|0.2,0.11|0.5,0.61|0.8,0.30|0.4,0.30|0.3,0.......
  • 缓存击穿、缓存穿透、缓存雪崩等并发问题的解决思路
    在微服务应用中,每个细微的问题都可能由于并发被无限放大。在并发场景下,比较常见的有:秒杀活动中的商品超卖问题、数据冷热分离处理、缓存/数据库双写一致性问题、缓存击穿、缓存穿透、缓存雪崩问题等。在Java基础中,解决并发的思路就是锁,而锁的本质就是将并发执行串行化,在微服务应......
  • JS实现电子签名,并将带logo和日期时间水印的电子签名图片保存到本地
    效果如下 实现代码如下<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>电子签名</title><linkrel="icon"href="http://服务器IP/pic/xmj_logo.png"><style>......
  • LRU缓存实现
    一.LRU缓存实现使用双向链表保证O(1)的优先度更改,同时当做优先队列维护插入顺序同时这里要结合哈希表,保证更改想要的节点/*定义Node双向链表节点定义remove进行删除节点(只删除节点在链表中的关系)定义update更新指定节点的优先度定义insert插入新的节点*/classLR......
  • 一、简易搭建本地CAS服务端
    CAS服务端war包下载https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war,速度很快将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\classes\servic......