영화 기사는 "계속 봄 부트 (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时,就会走缓存