首页 > 开发 > Java > 正文

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

2024-07-13 10:08:20
字体:
来源:转载
供稿:网友

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;  }}@Configurationpublic 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 {@Autowiredpublic void setJedisConnectionFactory(    RedisConnectionFactory jedisConnectionFactory) {  RedisCache.setRedisConnectionFactory(jedisConnectionFactory);}}

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

开启mybatis的二级缓存

spring.datasource.cachePrepStmts=true

5 . 基于注解的使用

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表