Configure Spring4.0 to annotate the use of Cache+Redis caching

  • 2020-07-21 08:07:10
  • OfStack

Preface:

Currently, Redis has been set up for the processing of the last technical architecture of the company project, but redis is only used for the management of session, while the object cache in the background is not used

1. Differences between redis and ehcache:

From the perspective of deployment, I think redis is more suitable for distributed deployment. ehcache is to create a block of memory for caching on each application server, and the case of caching should also be considered when clustering. redis does not need to consider caching and is deployed on a single server (or in a certain application server).

2. Project configuration (spring mvc+maven+mybaits+redis)

a. configure pom. xml file (download 2 jar if not maven administration project)


<!-- redis cache related.....start --> 
    <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-redis</artifactId> 
      <version>1.6.0.RELEASE</version> 
    </dependency> 
    <dependency> 
      <groupId>redis.clients</groupId> 
      <artifactId>jedis</artifactId> 
      <version>2.7.3</version> 
    </dependency> 
    <!-- redis cache related.....end --> 

b. Configure the ES38en.xml file

In the first < beans > cache cache is added to


xmlns:cache="http://www.springframework.org/schema/cache" 
 
xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.2.xsd" 

Load the redis configuration in Spring


<!-- ******************** redis The cache   **********************--> 
<!--  annotations 1 Must configure, otherwise will not work  --> 
<cache:annotation-driven /> 
 
 
<!-- jedis  configuration  --> 
  <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 Server center  --> 
  <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.hostname}" /> 
    <!-- <property name="password" value="${redis.password}" /> --> 
    <property name="timeout" value="${redis.timeout}"></property> 
  </bean> 
   
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
    <property name="keySerializer"> 
      <bean 
        class="org.springframework.data.redis.serializer.StringRedisSerializer" /> 
    </property> 
    <property name="valueSerializer"> 
      <bean 
        class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> 
    </property> 
  </bean> 
  <!--  Configure the cache  --> 
  <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> 
    <constructor-arg ref="redisTemplate" /> 
  </bean> 
   
<!-- ******************** redis The cache   **********************--> 

c. Configure application. properties resource file


#redis config 
#redis.hostname=192.168.242.131  
redis.hostname=localhost 
redis.port=6379  
redis.timeout=2000 
redis.usePool=true 
redis.default.db=0 
#\u6700\u5927\u5206\u914D\u7684\u5BF9\u8C61\u6570   
redis.maxTotal=600 
#\u6700\u5927\u80FD\u591F\u4FDD\u6301idel\u72B6\u6001\u7684\u5BF9\u8C61\u6570  
redis.maxIdle=300  
#\u591A\u957F\u65F6\u95F4\u68C0\u67E5\u4E00\u6B21\u8FDE\u63A5\u6C60\u4E2D\u7A7A\u95F2\u7684\u8FDE\u63A5 
redis.timeBetweenEvictionRunsMillis=30000  
#\u7A7A\u95F2\u8FDE\u63A5\u591A\u957F\u65F6\u95F4\u540E\u4F1A\u88AB\u6536\u56DE 
redis.minEvictableIdleTimeMillis=30000  
#\u5F53\u8C03\u7528borrow Object\u65B9\u6CD5\u65F6\uFF0C\u662F\u5426\u8FDB\u884C\u6709\u6548\u6027\u68C0\u67E5  
redis.testOnBorrow=true  
########reids\u7F16\u7801\u683C\u5F0F 
redis.encode=utf-8 
######\u7F13\u5B58\u8FC7\u671F\u65F6\u95F4 \u79D2 1000*60*60*24*7 \u4E03\u5929 
redis.expire=604800000 
####\u662F\u5426\u5F00\u542FRedis\u670D\u52A1\u5E94\u7528 
redis.unlock=false 

3. The test


@Service("testService") 
public class TestServiceImpl implements ITestService { 
   
  @Resource 
  private ITestDao testDao; 
 
  @Cacheable(value="testId",key="'id_'+#id") 
  public Test getTestById(int id) { 
    return this.testDao.getObjById(id); 
  } 
   
  @CacheEvict(value="testId",key="'id_'+#id") 
  public void removeTestById(int id) { 
     
  } 
} 

Results:

Enter Service method for the first time

The second time without entering the service method, the value is also obtained

Note: Some friends may ask, when starting access, it is wrong, that is because the local redis service is not started, download win32/win64 version, boot access will not report an error


Related articles: