Java内存缓存-通过Google Guava创建缓存
谷歌Guava缓存
Guava介绍
Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问。
Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果不符合需求,可以选择Memcached、Redis等工具。
小案例
pom.xml添加guava依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>me.xueyao.cache</groupId> <artifactId>java-demo</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>javax.cache</groupId> <artifactId>cache-api</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0.1-jre</version> </dependency> </dependencies> </project>
GuavaCacheDemo.java 代码如下:
package me.xueyao.cache.java.guava; import com.google.common.cache.*; import me.xueyao.cache.java.pojo.User; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; /** * @author simon * https://github.com/google/guava */ public class GuavaCacheDemo { public static void main(String[] args) throws ExecutionException { //缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存 LoadingCache<String, User> userCache //CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例 = CacheBuilder.newBuilder() //设置并发级别为8,并发级别是指可以同时写缓存的线程数 .concurrencyLevel(8) //设置写缓存后8秒钟过期 .expireAfterWrite(8, TimeUnit.SECONDS) //设置写缓存后1秒钟刷新 .refreshAfterWrite(1, TimeUnit.SECONDS) //设置缓存容器的初始容量为5 .initialCapacity(5) //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项 .maximumSize(100) //设置要统计缓存的命中率 .recordStats() //设置缓存的移除通知 .removalListener(new RemovalListener<Object, Object>() { @Override public void onRemoval(RemovalNotification<Object, Object> notification) { System.out.println(notification.getKey() + " 被移除了,原因: " + notification.getCause()); } }) //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 .build( new CacheLoader<String, User>() { @Override public User load(String key) throws Exception { System.out.println("缓存没有时,从数据库加载" + key); return new User("tony" + key, key); } } ); // 第一次读取 for (int i = 0; i < 10; i++) { User user = userCache.get("uid" + i); System.out.println(user); } // 第二次读取 for (int i = 0; i < 10; i++) { User user = userCache.get("uid" + i); System.out.println(user); } System.out.println("cache stats:"); //最后打印缓存的命中率等 情况 System.out.println(userCache.stats().toString()); } }
User.java 代码如下:
package me.xueyao.cache.java.pojo; import java.io.Serializable; /** * @author simon */ public class User implements Serializable { private String userName; private String userId; public User(String userName, String userId) { this.userName = userName; this.userId = userId; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } @Override public String toString() { return userId + " --- " + userName; } }
运行后的结果如下:
第一次循环时缓存中没有数据,构建了缓存,第二次直接命中缓存。如果程序需要单机内存缓存,可以用该方式构建缓存。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
5个 JS 解构有趣的用途
摘要: 玩转ES6解构赋值。 原文:5个 JS 解构有趣的用途 译者:前端小智 1. 交换变量 通常交换两个变量的方法需要一个额外的临时变量,来看看例子: let a = 1; let b = 2; let temp; temp = a; a = b; b = temp; a; // => 2 b; // => 1 temp是一个临时变量,它先保存a的值。然后把b的值赋值给a,接着将temp值赋给 b。 如果使用解构的方式会更简单,不需要什么鬼的 temp 变量。 let a = 1; let b = 2; [a, b] = [b, a]; a; // => 2 b; // => 1 [a,b] = [b,a]是解构赋值,右边,创建了一个数组[b, a],即[2,1]。这个数组2被赋值了给a,1被赋值给了b。 虽然这种方式也创建了临时数组,但这种方式给看起来至少更简洁,使用解构咱们还可以交换2个以上的变量。 let zero = 2; let one = 1; let two = 0; [zero, one, two] = [two, one, zero]; z...
- 下一篇
网站漏洞检测 php变量覆盖漏洞的检测与分析
临近9月底,seacms官方升级海洋cms系统到9.95版本,我们SINE安全在对其源码进行网站漏洞检测的时候发现问题,可导致全局变量被覆盖,后台可以存在越权漏洞并绕过后台安全检测直接登录管理员账号。关于该漏洞的具体详情,我们来详细的分析一下:seacms主要设计开发针对于互联网的站长,以及中小企业的一个建站系统,移动互联网的快速发展,该系统可自动适应电脑端,手机端,平板端,APP端等多个用户的端口进行适配,代码开源免费,可二次开发,PHP+Mysql数据库架构,深受广大网站运营者的青睐。 我们SINE安全工程师对该代码进行了详细的安全审计,在一个变量覆盖上发现了漏洞,一开始以为只有这一个地方可以导致网站漏洞的发生,没成想这套系统可以导致全局性的变量覆盖发生漏洞,影响范围较大,seacms系统的安全过滤与判断方面做的还不错,在其他地方放心可以平行越权,并直接登录后台是管理员权限。默认变量覆盖这里是做了安全效验的功能,在配置代码里common.php的22行里可以看到对get,post,cookies请求方式上进行了变量的安全效验,对代码的安全审计发现在34行里的变量覆盖值判断没有进行K...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装