软件编程
位置:首页>> 软件编程>> java编程>> 详解Spring boot使用Redis集群替换mybatis二级缓存

详解Spring boot使用Redis集群替换mybatis二级缓存

作者:White鱼  发布时间:2023-03-09 17:17:38 

标签:spring,boot,redis

1 . pom.xml添加相关依赖


<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>1.5.1.RELEASE</version>
</parent>

<!-- 依赖 -->
 <dependencies>
   <!-- mybatis -->
   <dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>1.2.0</version>
   </dependency>
   <!-- redis相关 -->
   <dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
   </dependency>

<dependency>
     <groupId>org.springframework.data</groupId>
     <artifactId>spring-data-redis</artifactId>
   </dependency>
 <dependencies>

2 . 配置Redis集群,参考spring-data-redis官方文档


@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class ClusterConfigurationProperties {

/*
  * spring.redis.cluster.nodes[0] = 127.0.0.1:7379
  * spring.redis.cluster.nodes[1] = 127.0.0.1:7380
  * ...
  */
 List<String> nodes;

/**
  * Get initial collection of known cluster nodes in format {@code host:port}.
  *
  * @return
  */
 public List<String> getNodes() {
   return nodes;
 }

public void setNodes(List<String> nodes) {
   this.nodes = nodes;
 }
}

@Configuration
public class AppConfig {

/**
  * Type safe representation of application.properties
  */
 @Autowired ClusterConfigurationProperties clusterProperties;

public @Bean RedisConnectionFactory connectionFactory() {

return new JedisConnectionFactory(
     new RedisClusterConfiguration(clusterProperties.getNodes()));
 }
}

3 . 自定义二级缓存类


public class RedisCache implements Cache {

private static final String PREFIX = "SYS_CONFIG:";

private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);

private String id;
 private JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer();

private static RedisConnectionFactory redisConnectionFactory;

public RedisCache(final String id) {
   if (id == null) {
     throw new IllegalArgumentException("Cache instances require an ID");
   }
   this.id = id;
 }

@Override
 public String getId() {
   return this.id;
 }

@Override
 public void putObject(Object key, Object value) {
   RedisClusterConnection conn = redisConnectionFactory
       .getClusterConnection();
   if (key == null)
     return;
   String strKey = PREFIX + key.toString();
   conn.set(strKey.getBytes(), jdkSerializer.serialize(value));
   conn.close();
 }

@Override
 public Object getObject(Object key) {
   if (key != null) {
     String strKey = PREFIX + key.toString();
     RedisClusterConnection conn = redisConnectionFactory
         .getClusterConnection();
     byte[] bs = conn.get(strKey.getBytes());
     conn.close();
     return jdkSerializer.deserialize(bs);
   }
   return null;
 }

@Override
 public Object removeObject(Object key) {
   if (key != null) {
     RedisClusterConnection conn = redisConnectionFactory
         .getClusterConnection();
     conn.del(key.toString().getBytes());
     conn.close();
   }
   return null;
 }

@Override
 public void clear() {
   // 关键代码,data更新时清理缓存
   RedisClusterConnection conn = redisConnectionFactory
       .getClusterConnection();
   Set<byte[]> keys = conn.keys((PREFIX+"*").getBytes());
   for (byte[] bs : keys) {
     conn.del(bs);
   }
   conn.close();
 }
 @Override
 public int getSize() {
   // TODO Auto-generated method stub
   return 0;
 }

@Override
 public ReadWriteLock getReadWriteLock() {
   return this.readWriteLock;
 }

public static void setRedisConnectionFactory(RedisConnectionFactory redisConnectionFactory) {
   RedisCache.redisConnectionFactory = redisConnectionFactory;
 }

}

使用一个Transfer类间接注入RedisConnectionFactory


@Component
public class RedisCacheTransfer {

@Autowired
public void setJedisConnectionFactory(
   RedisConnectionFactory jedisConnectionFactory) {
 RedisCache.setRedisConnectionFactory(jedisConnectionFactory);
}
}

4 . 在application.propreties中开启二级缓存

开启mybatis的二级缓存


spring.datasource.cachePrepStmts=true

5 . 基于注解的使用


@CacheNamespace(implementation = RedisCache.class)
public interface ConfigDaoMapper {
 .....
}

来源:http://blog.csdn.net/soul_code/article/details/62422036?utm_source=tuicool&utm_medium=referral

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com