봄 부팅 항목 (X) : 통합 석영 일반 작업 : 통합 레디 스 센티넬 모델은 MyBatis로 봄 부팅 엔트리 레벨이 캐시 (IX)를 달성하기 위해

영화 기사는 "계속 봄 부트 (IX) 방법 : 통합 석영 일반 작업을 ." 이 문서는 주로 MyBatis로 L2 캐시를 실현 레디 스를 기반으로합니다. 레디 스 캐시보다, 자신의 캐시 단점 (자신의 Google)을 mybaits. 본 논문은 장착 고정 표시기 마스터 - 슬레이브 모드 레디 스에 기초한다.

1.redis 설치

(1) 먼저, 레디 스 클러스터 모델, 레디 스 디렉토리의 설립을 설치하고 주 모드를에서 고정 표시기 - compose.yml 파일을 작성

1  버전 '3.1'
 (2 개)  서비스 :
 3    주 :  
 4      이미지 : 레디 스
 5      CONTAINER_NAME : 레디 스 마스터
 6 개      포트 :
 7        - 6379 : 6379
 8          
9    SLAVE1 :  
 10      화상 : 레디 스
 11      CONTAINER_NAME : 레디 스 SLAVE1-
 12 개      포트 :
 13        - 6380 : 6379
 14      명령 레디 스 서버 --slaveof 마스터 레디 스 6379
 15            
16    slave2 :  
 17      화상 : 레디 스
 18      CONTAINER_NAME : 레디 스 slave2-
 19 개      포트 :
 20       - 6381 : 6379
 (21)      명령 : 레디 스 서버 --slaveof 레디 스 마스터 6379

(2) 시작 고정 표시기-작성까지 -d

(3) 감시 파일 및 쓰기 고정 표시기-compose.yml 파일을 설정

1  버전 '3.1'
 (2 개)  서비스 :
 3    sentinel1 :  
 4      이미지 : 레디 스
 5      sentinel1 레디 스-: CONTAINER_NAME
 6      : 포트
 7        26,379 - 26,379
 8      명령 레디 스 센티넬 /usr/local/etc/redis/sentinel.conf
 9 개      부피 :
 10        - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
 11          
12    sentinel2 :  
 13      화상 : 레디 스
 14      CONTAINER_NAME : 레디 스 sentinel2-
 15 개      포트 :
 16        - 2만6천3백80 : 26,379
 17     명령 /usr/local/etc/redis/sentinel.conf 레디 스 센티넬
 18      권 :
 19        - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
 20          
21    sentinel3 :  
 22      화상 : 레디 스
 23      CONTAINER_NAME을 : 레디 스-감시-3
 24      포트 :
 (25)        - 2만6천3백81 : 26,379
 (26)      명령 : /usr/local/etc/redis/sentinel.conf 레디 스 - 센티넬
 (27)      볼륨 :
 28        - ./sentinel3.conf:/usr/local/etc/ 레디 스 / sentinel.conf
 (29)         

모델의 conf 파일의 감시가 필요에서, 나는 세 혈관을 생성하므로, 내용이 정확히 같은 3 개 부분 (sentinel1.conf sentinel2.conf sentinel3.conf)가 필요

1 개  포트 26,379
 2  DIR / TMP
 3  센티넬 모니터링 mymaster 217.0.0.1 6379 2
 4  센티넬 다운 후 밀리 30000 rmaster
 5  mymaster 1 감시 병렬 동기화
 6  페일 오버 타임 아웃 mymaster 180000 센티넬
 7 센티넬 부정 - 스크립트 - 재구성 네

. (4) 시작 : 고정 표시기-작성까지 -d

(5) 확인을 성공적으로 발사 레디 스 여부

고정 표시기 간부 - 그것은 레디 스-감시-1 / 빈 / bash는 : 컨테이너 속으로

레디 스 연결 : 레디 스-CLI -p 26379

성공을 시작할 계획이다

 

당신은 또한 확인할 수 있습니다 엔드 데스크톱 클라이언트에 의해 성공적으로 시작, 같이 RedisDesktopManager 클라이언트 I 사용 종료 여부

 

 우리는 마스터 - 슬레이브 모드를 감시하도록 선택하는 이유, 즉 클러스터 전통 레디 스 클러스터는, 마스터 - 슬레이브 모드가 지금 : 당신에 대해 생각할 수있는 문제가 있습니다?

 2. 쓰기 RedisCache 도구

온라인 많은, 당신은에 따라 권리 유틸을 선택해야합니다 (일부 유틸 방법은 매우 넓다)

  1 package com.learn.hello.system.utils;
  2 
  3 import lombok.extern.slf4j.Slf4j;
  4 import org.apache.ibatis.cache.Cache;
  5 import org.springframework.data.redis.core.RedisCallback;
  6 import org.springframework.data.redis.core.RedisTemplate;
  7 import org.springframework.data.redis.core.ValueOperations;
  8 
  9 import java.util.concurrent.TimeUnit;
 10 import java.util.concurrent.locks.ReadWriteLock;
 11 import java.util.concurrent.locks.ReentrantReadWriteLock;
 12 
 13 /**
 14  * @ClassName RedisCache
 15  * @Deccription 通过redis实现mybaits的二级缓存
 16  * @Author DZ
 17  * @Date 2020/1/12 22:41
 18  **/
 19 @Slf4j
 20 public class RedisCache implements Cache {
 21 
 22     private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
 23     private final String id; // cache instance id
 24     private RedisTemplate redisTemplate;
 25 
 26     private static final long EXPIRE_TIME_IN_MINUTES = 30; // redis过期时间
 27 
 28     public RedisCache(String id) {
 29         if (id == null) {
 30             throw new IllegalArgumentException("Cache instances require an ID");
 31         }
 32         this.id = id;
 33     }
 34 
 35     @Override
 36     public String getId() {
 37         return id;
 38     }
 39 
 40     /**
 41      * Put query result to redis
 42      *
 43      * @param key
 44      * @param value
 45      */
 46     @Override
 47     public void putObject(Object key, Object value) {
 48         try {
 49             RedisTemplate redisTemplate = getRedisTemplate();
 50             ValueOperations opsForValue = redisTemplate.opsForValue();
 51             opsForValue.set(key, value, EXPIRE_TIME_IN_MINUTES, TimeUnit.MINUTES);
 52             log.debug("Put query result to redis");
 53         } catch (Throwable t) {
 54             log.error("Redis put failed", t);
 55         }
 56     }
 57 
 58     /**
 59      * Get cached query result from redis
 60      *
 61      * @param key
 62      * @return
 63      */
 64     @Override
 65     public Object getObject(Object key) {
 66         try {
 67             RedisTemplate redisTemplate = getRedisTemplate();
 68             ValueOperations opsForValue = redisTemplate.opsForValue();
 69             log.debug("Get cached query result from redis");
 70             return opsForValue.get(key);
 71         } catch (Throwable t) {
 72             log.error("Redis get failed, fail over to db", t);
 73             return null;
 74         }
 75     }
 76 
 77     /**
 78      * Remove cached query result from redis
 79      *
 80      * @param key
 81      * @return
 82      */
 83     @Override
 84     @SuppressWarnings("unchecked")
 85     public Object removeObject(Object key) {
 86         try {
 87             RedisTemplate redisTemplate = getRedisTemplate();
 88             redisTemplate.delete(key);
 89             log.debug("Remove cached query result from redis");
 90         } catch (Throwable t) {
 91             log.error("Redis remove failed", t);
 92         }
 93         return null;
 94     }
 95 
 96     /**
 97      * Clears this cache instance
 98      */
 99     @Override
100     public void clear() {
101         RedisTemplate redisTemplate = getRedisTemplate();
102         redisTemplate.execute((RedisCallback) connection -> {
103             connection.flushDb();
104             return null;
105         });
106         log.debug("Clear all the cached query result from redis");
107     }
108 
109     /**
110      * This method is not used
111      *
112      * @return
113      */
114     @Override
115     public int getSize() {
116         return 0;
117     }
118 
119     @Override
120     public ReadWriteLock getReadWriteLock() {
121         return readWriteLock;
122     }
123 
124     private RedisTemplate getRedisTemplate() {
125         if (redisTemplate == null) {
126             redisTemplate = SpringContextHolder.getBean("redisTemplate");
127         }
128         return redisTemplate;
129     }
130 }

3.在接口类增加redis缓存注解

@CacheNamespace(implementation = RedisCache.class)

例如:

1 @CacheNamespace(implementation = RedisCache.class)
2 public interface RoleMapper extends MyMapper<Role> {
3     List<Role> selectByCondition(ModelMap modelMap);
4 
5     Role selectById(int id);
6 
7     List<Role> selectAllRole();
8 }

这里也可以直接在MyMapper父接口中增加注解,这样,所有的接口就不需要单独增加这个注解(根据业务需要自行素选择)。

4.配置application.yml

 1 spring:
 2   redis:
 3     lettuce:
 4       # 连接池配置
 5       pool:
 6         # 连接池中的最小空闲连接,默认 0
 7         min-idle: 0
 8         # 连接池中的最大空闲连接,默认 8
 9         max-idle: 8
10         # 连接池最大阻塞等待时间(使用负值表示没有限制),默认 -1ms
11         max-wait: -1ms
12         # 连接池最大连接数(使用负值表示没有限制),默认 8
13         max-active: 8
14     #    集群模式
15     #    cluster:
16     #      nodes: 192.168.1.12:6379,192.168.1.12:6380,192.168.1.12:6381
17     #    哨兵模式
18     sentinel:
19       master: mymaster
20       nodes: 192.168.1.12:26379,192.168.1.12:26380,192.168.1.12:26381
1 mybatis:
2   mapper-locations: classpath:mapper/*.xml
3   #  此配置的作用:xml中不用写实体类的全路径
4   type-aliases-package: com.learn.hello.modules.entity
5   #  查询的null字段也返回
6   configuration:
7     call-setters-on-nulls: true
8     #    开启二级缓存
9     cache-enabled: true

 

5.效果

当进行CURD操作时,相关的检索sql语句就会缓存到redis,如图:

 

 当再次对相关数据进行CRUD时,就会走缓存

추천

출처www.cnblogs.com/dz-boss/p/12190065.html