近期项目中遇到了缓存的内容,缓存主要采用redis作为缓存容器,基于Spring Cache实现编码。那么首先先了解一下Spring Cache的相关内容以及实现。
缓存的相关基础知识应该都有了解,这里就不再累诉了。就贴几个比较重要的概念吧:
缓存命中率,即从缓存中读取数据的次数 与 总读取次数的比率,命中率越高越好:
命中率 = 从缓存中读取次数 / (总读取次数[从缓存中读取次数 + 从慢速设备上读取的次数])
Miss率 = 没有从缓存中读取的次数 / (总读取次数[从缓存中读取次数 + 从慢速设备上读取的次数])
这是一个非常重要的监控指标,如果做缓存一定要健康这个指标来看缓存是否工作良好;
缓存策略(Eviction policy):移除策略,即如果缓存满了,从缓存中移除数据的策略;常见的有LFU、LRU、FIFO:
- FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除;
- LRU(Least Recently Used):最久未使用算法,使用时间距离现在最久的那个被移除;
- LFU(Least Frequently Used):最近最少使用算法,一定时间段内使用次数(频率)最少的那个被移除;
TTL(Time To Live ):存活期,即从缓存中创建时间点开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期);
TTI(Time To Idle):空闲期,即一个数据多久没被访问将从缓存中移除的时间。
Spring 提供了核心的Cache接口:
package org.springframework.cache;public interface Cache {
String getName(); //缓存的名字
Object getNativeCache(); //得到底层使用的缓存,如 Ehcache
ValueWrapper get(Object key); //根据 key 得到一个 ValueWrapper,然后调用其 get 方法获取值
<T> T get(Object key, Class<T> type);//根据 key,和 value 的类型直接获取 value
void put(Object key, Object value);//往缓存放数据
void evict(Object key);//从缓存中移除 key 对应的缓存
void clear(); //清空缓存interface ValueWrapper { //缓存值的Wrapper Object get(); //得到真实的value }
}
提供了缓存操作的读取/写入/移除方法;
这个接口有默认的实现:
如果你使用了Spring提供的redis集成依赖包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
那么这其中会有一个RedisCache的实现,具体如何实现的各位看官可以自己去看看。
既然讲到这里了,那接下来就先动手使用上面的依赖包集成一下吧。
先在pom.xml文件中加入以下依赖包:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.5.2</version> </dependency>
然后在工程的classpath下新建一个Redis的配置文件redis.properties
redis.host=xxx.xxx.xxx.xxx redis.port=6379 redis.password=xxxxxx redis.maxIdle=100 redis.maxActive=300 redis.maxWait=1000 redis.testOnBorrow=true redis.timeout=100000
接下来在Spring的application.xml文件中加入一下配置:
<!-- redis 相关配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" > <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <!-- redis服务器中心 --> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" > <property name="poolConfig" ref="poolConfig" /> <property name="port" value="${redis.port}" /> <property name="hostName" value="${redis.host}" /> <property name="password" value="${redis.password}" /> <property name="timeout" value="${redis.timeout}" /> </bean> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> </bean>
别忘记把之前的redis.properties加载进去。
最后还要添加:
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager" c:template-ref='redisTemplate'/>
<!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 --> <cache:annotation-driven cache-manager="cacheManager" />
这样子,你就就可以在方法上使用Spring Cache的注解来实现缓存了。
@Cacheable(value = "userCache", key = "'User.'+#userId") public User getUserById(int userId) { logger.info("没有缓存,直接数据库获取数据");; return this.userDao.selectByPrimaryKey(userId); }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于