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

来源:互联网 发布:怎样注销淘宝店铺 编辑:程序博客网 时间:2024/06/10 01:12
  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 {    .....}
1 0
原创粉丝点击