项目介绍
基于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>

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