O cache local do Google é muito fácil de usar

No desenvolvimento normal, costumamos usar dicionários. Por exemplo, armazenamos o código do dispositivo em nosso banco de dados e exibimos o nome do dispositivo; o que é armazenado no banco de dados é o id do usuário e o nome do usuário é exibido. Chamaremos esses campos com frequência, depois faremos consultas frequentes ao banco de dados, para garantir a velocidade de acesso, usaremos o cache. Mas se você usar o cache de middleware como Redis, é um pouco exagero. Claro, também podemos armazenar os dados necessários no Mapa por nós mesmos, mas devemos considerar a capacidade estimada do Mapa, o tempo de armazenamento em cache de dados e assim por diante. Portanto, o design do Mapa é mais problemático.

Aqui eu recomendo o cache local no Guava, o framework da biblioteca do Google.

Antes de usar, primeiro citamos a dependência Maven do Guava:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

Vamos primeiro escrever uma classe de entidade para a capital provincial Province:

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Province {
    //省会名称
    private String name;
    //省会编码 如:PR001
    private String code;
}

Dois campos são definidos aqui, o nome da capital provincial e o código da capital provincial. Geralmente, o código é armazenado no inventário.Ao codeexibir, precisamos consultar e obtê-lo em uma tabela especial name.

Vamos definir um ouvinte para invalidação de cache CustomizeRemovalListener:

public class CustomizeRemovalListener implements RemovalListener<String, Province> {
    @Override
    public void onRemoval(RemovalNotification<String, Province> removalNotification) {
        String reason = String.format("key=%s,value=%s,reason=%s", removalNotification.getKey(), removalNotification.getValue(), removalNotification.getCause());
        System.out.println(reason);
    }
}

Quando invalidamos manualmente o cache ou o tempo de expiração acaba, ele é monitorado. O console será impresso reason. onRemoval()Os métodos podem ser escritos de acordo com as necessidades do negócio.

Vamos usar o cache:

Como no código acima, quando chamarmos o loadingCache.get()método , primeiro o procuraremos no cache. Se não estiver no cache, executaremos este código:

// 如果找不到元素,会调用这里
@Override
public Province load(String s) {
    //实际情况这里就是查库
    System.out.println("查了数据库哦");
    return getDataFromDb();
}

Vamos verificar a biblioteca neste código. No código ilustrado, primeiro criamos um cache inicial:

LoadingCache<String, Province> loadingCache = CacheBuilder.newBuilder()
        .maximumSize(1000) // 容量
        .expireAfterWrite(3, TimeUnit.SECONDS) // 过期时间
        .removalListener(new CustomizeRemovalListener()) // 失效监听器
        .build(cacheLoader);

A capacidade inicial do cache, o tempo de expiração e a função de monitoramento após a expiração do cache são criados aqui.

Armazenamos os dados no cache:

loadingCache.put("PR001", getDataFromDb());

As três primeiras buscas loadingCachebuscam valores do cache . Quando o encadeamento dorme por 4 segundos e o tempo de expiração é excedido, o cache será invalidado e o listener será acionado. 4º começo de load(String s)entrar.

Os resultados da impressão do console são os seguintes:

第一次获取:Province(name=北京, code=PR001)
第二次获取:Province(name=北京, code=PR001)
第三次获取:Province(name=北京, code=PR001)
key=PR001,value=Province(name=北京, code=PR001),reason=EXPIRED
查了数据库哦
第四次获取:Province(name=北京, code=PR001)

Este código

key=PR001,value=Province(name=北京, code=PR001),reason=EXPIRED

O cache de exibição expirou devido ao tempo limite.

Claro, Goiaba ainda tem muitas funções. Se você se interessa por calçados infantis, leia este artigo que escrevi:

[Programmer's Gospel-Goiaba] ( Programmer's Gospel-Goiaba (qq.com) )

Claro, existem muitos frameworks de cache locais no mundo, como Caffeine (uma versão atualizada do cache Guava), Ehcache, etc. Sapatos infantis interessados ​​podem ir e aprender sobre isso.

Recomendado no passado

Leia o código QR para ficar mais emocionante. Ou pesquise Lvshen_9 no WeChat , você pode responder para obter informações em segundo plano

  1. 回复"java" 获取java电子书;

  2. 回复"python"获取python电子书;

  3. 回复"算法"获取算法电子书;

  4. 回复"大数据"获取大数据电子书;

  5. 回复"spring"获取SpringBoot的学习视频。

  6. 回复"面试"获取一线大厂面试资料

  7. 回复"进阶之路"获取Java进阶之路的思维导图

  8. 回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

  9. 回复"总结"获取Java后端面试经验总结PDF版

  10. 回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

  11. 回复"并发导图"获取Java并发编程思维导图(xmind终极版)

Outro: Clique em [ Meus benefícios ] para ter mais surpresas.

Acho que você gosta

Origin blog.csdn.net/wujialv/article/details/111038267
Recomendado
Clasificación