JFinal 极速集成二级缓存 j2cache

项目集群的时候要用到二级缓存,趁着j2cache更新,极速集成一波!

代码地址:

https://gitee.com/xiaoxustudent/JFinal-vue-element-admin/tree/master/admin/src/main/java/com/sandu/j2cache

1.Maven引用:吐槽一下,真的很多jar,不过下面都是可选的,主要看你用什么,我这里直接从红薯代码https://gitee.com/ld/J2Cache/blob/master/core/pom.xml 里面复制过来了。

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
		
		<dependency>
			<groupId>net.oschina.j2cache</groupId>
			<artifactId>j2cache-core</artifactId>
			<version>2.1.0</version>
		</dependency>
		<dependency>
			<groupId>net.sf.ehcache</groupId>
			<artifactId>ehcache</artifactId>
			<version>2.10.4</version>
		</dependency>

		<dependency>
			<groupId>org.ehcache</groupId>
			<artifactId>ehcache</artifactId>
			<version>3.4.0</version>
		</dependency>

		<dependency>
			<groupId>com.github.ben-manes.caffeine</groupId>
			<artifactId>caffeine</artifactId>
			<version>2.6.1</version>
		</dependency>

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>

		<dependency>
			<groupId>org.jgroups</groupId>
			<artifactId>jgroups</artifactId>
			<version>3.6.13.Final</version>
		</dependency>

		<dependency>
			<groupId>de.ruedigermoeller</groupId>
			<artifactId>fst</artifactId>
			<version>2.53</version>
		</dependency>

		<dependency>
			<groupId>com.esotericsoftware</groupId>
			<artifactId>kryo-shaded</artifactId>
			<version>3.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.xerial.snappy</groupId>
			<artifactId>snappy-java</artifactId>
			<version>1.1.4</version>
		</dependency>

		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.9.3</version>
		</dependency>

2.写个JFinal Plugin

package com.sandu.j2cache;import com.jfinal.plugin.IPlugin;import net.oschina.j2cache.CacheChannel;import net.oschina.j2cache.J2Cache;public class J2CachePlugin implements IPlugin {
    private static CacheChannel cache;    @Override
    public boolean start() {
        System.setProperty("java.net.preferIPv4Stack", "true"); //Disable IPv6 in JVM
        cache = J2Cache.getChannel();
        J2CacheKit.init(cache);        return true;
    }    @Override
    public boolean stop() {
        cache.close();        return true;
    }
}

cache = J2Cache.getChannel() 拿到这个cache就完事了,可以调用各种api,这里我参考JFinal的cacheKit
小小封装了一个J2CacheKit,

3.配置文件

j2cache.properties  //这个必须的,里面有各种配置,我L1用了ehcache,详情看代码

j2cache.L1.provider_class = ehcache
j2cache.L2.provider_class = redis

network.xml //广播用的,不用管

ehcache.xml //ehcache配置文件,如果你用ehcache3,就用ehcache3.xml

4.测试,先开了redis服务

package com.sandu.j2cache;import java.io.IOException;import net.oschina.j2cache.J2Cache;public class J2CacheTest {
	
	public static void main(String[] args) throws IOException {		new J2CachePlugin().start();
		String str1 = "高阁客竟去,小园花乱飞。参差连曲陌,迢递送斜晖。";
		String str2 = "肠断未忍扫,眼穿仍欲归。芳心向春尽,所得是沾衣。";
		String key1 = "ab1"; 
		String key2 = "ab2"; 
		String cacheName = "example";		
		//读写
		System.out.println("写入:" + str1);
		System.out.println("写入:" + str2);
		
		J2CacheKit.put(cacheName, key1, str1);
		J2CacheKit.put(cacheName, key2, str2);
		
		System.out.println("获取key1:" + J2CacheKit.get(cacheName, key1));
		System.out.println("获取key2:" + J2CacheKit.get(cacheName, key2));		
//		//删除
		J2CacheKit.remove(cacheName, key1);
		System.out.println("删除:" + key1);
		System.out.println("删除后输出:"+key1 +  J2CacheKit.get(cacheName, key1));
		System.out.println("删除后输出:"+key2 +  J2CacheKit.get(cacheName, key2));//		
		//删除全部
		J2CacheKit.removeAll(cacheName);
		J2Cache.getChannel().clear(cacheName);
		System.out.println("删除全部数据:");
		System.out.println("删除后输出:"+key1 +  J2CacheKit.get(cacheName, key1));
		System.out.println("删除后输出:"+key2 +  J2CacheKit.get(cacheName, key2));
	}

}

[main] INFO net.oschina.j2cache.J2Cache - Load J2Cache Config File : [/j2cache.properties].
[main] INFO net.oschina.j2cache.CacheProviderHolder - Using L1 CacheProvider : net.oschina.j2cache.ehcache.EhCacheProvider
[main] INFO net.oschina.j2cache.CacheProviderHolder - Using L2 CacheProvider : net.oschina.j2cache.redis.RedisCacheProvider
[main] INFO net.oschina.j2cache.redis.RedisPubSubClusterPolicy - Connected to redis channel:j2cache, time 74 ms.
[main] INFO net.oschina.j2cache.J2Cache - Using cluster policy : net.oschina.j2cache.redis.RedisPubSubClusterPolicy
写入:高阁客竟去,小园花乱飞。参差连曲陌,迢递送斜晖。
写入:肠断未忍扫,眼穿仍欲归。芳心向春尽,所得是沾衣。
[main] INFO net.oschina.j2cache.util.SerializationUtils - Using Serializer -> [fst:net.oschina.j2cache.util.FSTSerializer]
获取key1:高阁客竟去,小园花乱飞。参差连曲陌,迢递送斜晖。
获取key2:肠断未忍扫,眼穿仍欲归。芳心向春尽,所得是沾衣。
删除:ab1
删除后输出:ab1null
删除后输出:ab2肠断未忍扫,眼穿仍欲归。芳心向春尽,所得是沾衣。
删除全部数据:
删除后输出:ab1null
删除后输出:ab2null

5.总结

真正的代码只有J2CachePlugin和额外封装的J2CacheKit,另外j2cache 2.0版本 caffeine缓存下clear不生效,已反馈,在以后版本修复了。


评论区

JFinal

2018-01-08 14:38

建议做成一个独立的项目叫: jfinal-j2cache, 然后开源出来
j2cache 确实牛逼, oschina 每天几千万的访问量用的就是这个方案,简洁方便

JFinal

2018-01-08 14:42

我发现对 ehcache 有两个 dependency 依赖,是啥情况?

小徐同学

2018-01-08 15:22

@JFinal 一个ehcache2 一个ehcache3 用了 2 可以去掉3

小徐同学

2018-01-08 15:23

@JFinal 几十行代码哪好意思弄一个项目

JFinal

2018-01-08 15:31

@小徐同学 代码少能解决问,才证明水平高,开源出来发布到 maven 中心库,用起来多方便

livem

2018-01-11 20:48

http://www.oschina.net/news/92309/j2cache-2-2-2-bugfix
红薯刚刚修复了一个大 bug

小徐同学

2018-01-11 21:26

@livem 嗯 我知道,那是新版本2.1的bug

zhangtianxiao

2018-01-13 20:52

过来捧个场

BirdZhang

2018-02-28 11:05

为什么还是用的Ehcache? https://gitee.com/xiaoxustudent/JFinal-vue-element-admin/blob/b8b5fdc4b02a6321786ad478eec7a42ae21dd27e/admin/src/main/java/com/sandu/MainConfig.java#L71
https://gitee.com/xiaoxustudent/JFinal-vue-element-admin/blob/b8b5fdc4b02a6321786ad478eec7a42ae21dd27e/admin/src/main/java/com/sandu/admin/login/LoginService.java#L59

小徐同学

2018-03-01 10:14

@BirdZhang 因为没改呀,要改很简单啊,搜索cacheKit替换就可以了

easymbol

2018-11-16 21:23

如何调用他的广播模式呢

maxwade

2019-03-29 10:57

这个j2cacheplugin是替代redisplugin的。

热门分享

扫码入社