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 code
exibir, 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 loadingCache
buscam 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
回复"java" 获取java电子书;
回复"python"获取python电子书;
回复"算法"获取算法电子书;
回复"大数据"获取大数据电子书;
回复"spring"获取SpringBoot的学习视频。
回复"面试"获取一线大厂面试资料
回复"进阶之路"获取Java进阶之路的思维导图
回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)
回复"总结"获取Java后端面试经验总结PDF版
回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)
回复"并发导图"获取Java并发编程思维导图(xmind终极版)
Outro: Clique em [ Meus benefícios ] para ter mais surpresas.