编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

smart-cache基于Ehcache和Redis实现的分布式二级缓存.

wxchong 2024-08-31 04:08:28 开源技术 10 ℃ 0 评论

项目介绍

基于Ehcache2和Redis实现的Java分布式二级缓存.除基本操作以外实现多机集群时各级缓存的监管和抓取.

  • 将单机缓存以特定结构同步至Redis存储,实现全局缓存统一管理.
  • 编码方式动态创建CacheManager和StoreLocation.摆脱了烦人的ehcache.xml配置文件,同时避免服务重启或不可用时缓存未同步的问题.
  • 使用自身维护的hash数据结构,替换Redis原生的hash类型,实现每个缓存元素过期时间可控.
  • 使用Redis.Topic机制.实现缓存同步.
  • 提供缓存管理监控页面.
  • 实现多机本地缓存抓取功能.
  • 类似Jedis的API,使用简便.
  • 尽可能减少配置和封装,力求精简,够用即可.

开源地址: github oschina

使用方式

  • cmd
mvn clean install -Dmaven.test.skip=true
  • pom.xml
<dependency>
	<groupId>com.smart</groupId>
	<artifactId>smart-cache</artifactId>
	<version>${VERSION}</version>
</dependency>
  • spring.xml
<!-- Redis -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
	<property name="maxTotal" value="${redis.max.total:1024}"/>
	<property name="minIdle" value="${redis.min.idle:256}"/>
	<property name="maxIdle" value="${redis.max.idle:256}"/>
	<property name="maxWaitMillis" value="${redis.max.wait.millis:3000}"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
	<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
	<constructor-arg name="host" 	 value="${redis.host}" />
	<constructor-arg name="port" 	 value="${redis.port}" />
</bean>
<bean id="jedisTemplate" class="com.smart.jedis.JedisTemplate">
	<property name="jedisPool" ref="jedisPool" />
</bean>
<!-- Smart Cache -->
<bean id="cacheTemplate" class="com.smart.cache.CacheTemplate" destroy-method="shutdown">
	<property name="jedisTemplate" ref="jedisTemplate" />
</bean>
  • 代码示例
cacheTemplate.set(name, key, value);// 设置
cacheTemplate.get(name, key);// 获取
cacheTemplate.del(name, key);// 删除
cacheTemplate.rem(name);// 删除name下所有缓存
cacheTemplate.cls();// 清空所有缓存
cacheTemplate.fetch(name, key);// 抓取集群下所有单机一级缓存
cacheTemplate.ttl(name, key, level);// 获取缓存ttl
cacheTemplate.names();// 获取所有缓存name
cacheTemplate.keys(name);// 获取name下所有key
cacheTemplate.size(name);// 获取name下缓存数量
cacheTemplate.values(name);// 获取name下缓存值

见:smart-cache/src/test/java/com/smart/cache/App.java

与Spring Cache联用

  • spring.xml
<cache:annotation-driven cache-manager="cacheManager" proxy-target-class="true"/>
<bean id="cacheManager" class="com.smart.cache.spring.CacheManager">
	<property name="cacheTemplate" ref="cacheTemplate" />
</bean>

与AutoLoadCache联用

  • pom.xml
<dependency>
	<groupId>com.smart</groupId>
	<artifactId>smart-cache-autoload</artifactId>
	<version>${VERSION}</version>
</dependency>
  • spring.xml
<bean id="cacheTemplateManager" class="com.smart.cache.autoload.CacheManager" destroy-method="destroy">
	<constructor-arg ref="autoLoadConfig" />
	<constructor-arg ref="cacheSerializer" />
	<constructor-arg ref="scriptParser" />
	<constructor-arg ref="cacheTemplate" />
</bean>

缓存监控

  • web.xml
	<servlet>
		<servlet-name>SmartCache</servlet-name>
		<servlet-class>com.smart.servlet.CacheAdminServlet</servlet-class>
		<init-param>
			<param-name>username</param-name>
			<param-value>admin</param-value>
		</init-param>
		<init-param>
			<param-name>password</param-name>
			<param-value>admin</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>SmartCache</servlet-name>
		<url-pattern>/smartcache/*</url-pattern>
	</servlet-mapping>

项目演示

监控页面

  • 登录页面:http://localhost:8080/smartcache/login.html
  • 用户密码:admin/admin
  • 监控页面:http://localhost:8080/smartcache/admin.html
  • 页面截图:

Showcase.AutoLoadCache

  • 演示页面:http://localhost:8080/view/autoload/user.html
  • 页面截图:

Showcase.Spring Cache

  • 查询缓存:http://localhost:8080/showcase/springcache/user/find
  • 添加数据:http://localhost:8080/showcase/springcache/user/create

注意: 若修改了序列化方式,务必清空Redis上原缓存数据

完整配置

<!-- Serializer -->
<bean id="stringSerializer" class="com.smart.serializer.StringSerializer" />
<bean id="fstSerializer" class="com.smart.serializer.FSTSerializer" />
<bean id="fastjsonSerializer" class="com.smart.serializer.FastjsonSerializer" />

<!-- Redis -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
	<property name="maxTotal" value="${redis.max.total:1024}"/>
	<property name="minIdle" value="${redis.min.idle:256}"/>
	<property name="maxIdle" value="${redis.max.idle:256}"/>
	<property name="maxWaitMillis" value="${redis.max.wait.millis:3000}"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
	<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
	<constructor-arg name="host" 	 value="${redis.host}" />
	<constructor-arg name="port" 	 value="${redis.port}" />
</bean>

<bean id="jedisTemplate" class="com.smart.jedis.JedisTemplate">
	<property name="jedisPool" ref="jedisPool" />
	<property name="keySerializer" ref="stringSerializer" /><!-- key默认使用string序列化 -->
	<property name="valSerializer" ref="fstSerializer" /> <!-- val默认使用fst序列化 -->
</bean>
<!-- Smart Cache -->
<bean id="cacheTemplate" class="com.smart.cache.CacheTemplate" destroy-method="shutdown">
	<property name="key" value="smart" /><!-- Redis前缀 -->
	<property name="spliter" value=":" /><!-- Redis分隔符 -->
	<property name="localEnabled" value="true" /><!-- 是否启用本地缓存 -->
	<property name="setCmdEnabled" value="false" /><!-- 是否启用set通知 -->
	<property name="localStoreLocation" value="/cache/" /><!-- 本地缓存存储磁盘位置 -->
	<property name="localMaxBytesLocalHeap" value="128M" /><!-- 本地缓存最大内存大小 -->
	<property name="localMaxBytesLocalDisk" value="1024M" /><!-- 本地缓存最大磁盘大小 -->
	<property name="localTimeToLiveSeconds" value="600" /><!-- 本地缓存10分钟过期 -->
	<property name="localDiskExpiryThreadIntervalSeconds" value="180" /><!-- 本地缓存3分钟清理一次 -->
	<property name="fetchTimeoutSeconds" value="3" /><!-- fetch命令最长等待3秒 -->
	<property name="jedisTemplate" ref="jedisTemplate" /><!-- jedis操作类 -->
</bean>

见:smart-cache/src/test/java/spring.xml

Redis集群配置

<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> 
	<constructor-arg index="0"> 
		<set> 
			<bean class="redis.clients.jedis.HostAndPort"> 
				<constructor-arg index="0" value="192.168.1.157" /> 
				<constructor-arg index="1" value="3001" type="int" /> 
			</bean> 
			<bean class="redis.clients.jedis.HostAndPort"> 
				<constructor-arg index="0" value="192.168.1.157" /> 
				<constructor-arg index="1" value="3002" type="int" /> 
			</bean> 
			<bean class="redis.clients.jedis.HostAndPort"> 
				<constructor-arg index="0" value="192.168.1.157" /> 
				<constructor-arg index="1" value="3003" type="int" /> 
			</bean>
			<bean class="redis.clients.jedis.HostAndPort"> 
				<constructor-arg index="0" value="192.168.1.157" /> 
				<constructor-arg index="1" value="3004" type="int" /> 
			</bean>
			<bean class="redis.clients.jedis.HostAndPort"> 
				<constructor-arg index="0" value="192.168.1.157" /> 
				<constructor-arg index="1" value="3005" type="int" /> 
			</bean>
			<bean class="redis.clients.jedis.HostAndPort"> 
				<constructor-arg index="0" value="192.168.1.157" /> 
				<constructor-arg index="1" value="3006" type="int" /> 
			</bean>
		</set> 
	</constructor-arg> 
	<constructor-arg index="1" value="2000" type="int"></constructor-arg>
	<constructor-arg index="2" value="100" type="int"></constructor-arg>
	<constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg>
</bean>
	
<bean id="jedisTemplate" class="com.smart.jedis.JedisTemplate">
	<property name="jedisCluster" ref="jedisCluster"/>
</bean>

Redis密码配置

<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
	<constructor-arg index="0" ref="jedisPoolConfig" />
	<constructor-arg index="1" value="${redis.host}" />
	<constructor-arg index="2" value="${redis.port}" />
	<constructor-arg index="3" value="${redis.timeout:3000}" />
	<constructor-arg index="4" value="${redis.pass}" />
</bean>

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表