J2Cache 2.3.19 性能提升 30%,这不是 Bugfix 版本

栏目: 软件资讯 · 发布时间: 7年前

内容简介:这个版本你们没有槽点可喷了吧,因为没有 Bug 了!!! J2Cache 2.3.19 带来了部分性能的提升达 30% ,而且进一步降低对 Redis 请求的压力。 纳尼?你说我吹牛逼?下面说说详情! 假设有 100 个线程同时读取同一...

这个版本你们没有槽点可喷了吧,因为没有 Bug 了!!!

J2Cache 2.3.19 带来了部分性能的提升达 30% ,而且进一步降低对 Redis 请求的压力。

纳尼?你说我吹牛逼?下面说说详情!

假设有 100 个线程同时读取同一个 region 、同一个 key 的数据时,也就是说这 100 个线程同时调用了 get 方法,这个时候的 L1 上的数据为空,L2 上有数据。

那么相当于重复执行 L2 -> L1 -> App 这个操作 100 次,也就是说读了 100 次 Redis 的数据。

这个 get 方法(也是最常用的方法)改造之前的代码如下:

public CacheObject get(String region, String key)  {
	CacheObject obj = new CacheObject(region, key, CacheObject.LEVEL_1);
	obj.setValue(CacheProviderHolder.getLevel1Cache(region).get(key));
	if(obj.rawValue() == null) {
		obj.setLevel(CacheObject.LEVEL_2);
		obj.setValue(CacheProviderHolder.getLevel2Cache(region).get(key));
		if(obj.rawValue() != null)
			CacheProviderHolder.getLevel1Cache(region).put(key, obj.rawValue());
	}
	return obj;
}

改造之后的代码如下:

/**
 * 读取缓存(用户无需判断返回的对象是否为空)
 * @param region Cache region name
 * @param key Cache data key
 * @return cache object
 */
public CacheObject get(String region, String key)  {

	CacheObject obj = new CacheObject(region, key, CacheObject.LEVEL_1);
	obj.setValue(CacheProviderHolder.getLevel1Cache(region).get(key));
	if(obj.rawValue() != null)
		return obj;

	String lock_key = key + '%' + region;
	synchronized (_g_keyLocks.computeIfAbsent(lock_key, v -> new Object())) {
		obj.setValue(CacheProviderHolder.getLevel1Cache(region).get(key));
		if(obj.rawValue() != null)
			return obj;

		try {

			obj.setLevel(CacheObject.LEVEL_2);
			obj.setValue(CacheProviderHolder.getLevel2Cache(region).get(key));
			if (obj.rawValue() != null)
				CacheProviderHolder.getLevel1Cache(region).put(key, obj.rawValue());
		} finally {
			_g_keyLocks.remove(lock_key);
		}
	}

	return obj;
}

相当于是在读取 redis 数据之前对这个key加锁,也就是说只有一个线程会进入同步块,后进的线程直接读取一级缓存的数据。

这个改进有什么用呢?你自己不会想啊?有效缓解缓存雪崩!!!

第二个改进内容是允许在 j2cache.properties 中配置默认是否缓存 null 对象的行为(老的版本默认是启用,如果不想启用需要在 API 中通过参数指定),配置项为:

j2cache.default_cache_null_object = true

Maven:

<dependency>
    <groupId>net.oschina.j2cache</groupId>
    <artifactId>j2cache-core</artifactId>
    <version>2.3.19-release</version>
</dependency>

点赞是参与开源社区的基本礼仪,请前往 https://gitee.com/ld/J2Cache 点赞(Star)

J2Cache 2.3.19 性能提升 30%,这不是 Bugfix 版本

----- 吐槽分割线 -----

  • 有新特性必将引来新 Bug 

  • 坐等下午发布 Bug 修复版

  • 吓屎了,红薯又发版了

  • J2Cache 是我见过的最有创意,最库的缓存框架

  • 红薯太帅了,不愧是开源第一帅

  • 码云 Gitee 好好好!


【声明】文章转载自:开源中国社区 [http://www.oschina.net]


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出Node.js

深入浅出Node.js

朴灵 / 人民邮电出版社 / 2013-12-1 / CNY 69.00

本书从不同的视角介绍了 Node 内在的特点和结构。由首章Node 介绍为索引,涉及Node 的各个方面,主要内容包含模块机制的揭示、异步I/O 实现原理的展现、异步编程的探讨、内存控制的介绍、二进制数据Buffer 的细节、Node 中的网络编程基础、Node 中的Web 开发、进程间的消息传递、Node 测试以及通过Node 构建产品需要的注意事项。最后的附录介绍了Node 的安装、调试、编码......一起来看看 《深入浅出Node.js》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具