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

  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 {
    .....
}
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值