Redis(3) 整合


前言

 springboot+mybatis框架整合redis cluster      
 springboot加载自定义配置文件     
 mybatis一二级

一、缓存流程图

在这里插入图片描述

二、springboot+mybatis整合redis cluster

默认认为已经搭建好springboot+mybatis
下面只有redis整合部分

1.引入jar包

       <!-- redis缓存 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- jedis包 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

2.redis集群连接配置

redis.maxIdle=2000
#?????
redis.maxTotal=20000
#???????
redis.maxWaitMillis=20000
#???borrow Object?????????????
redis.testOnBorrow=false
#??????
redis.nodes=192.168.106.130:6001,192.168.106.130:6002,192.168.106.131:6003,192.168.106.131:6004,192.168.106.132:6005,192.168.106.132:6006

3.使用springboot读取自定义配置

/**
 * @author zhangyifan
 * @version 8.0
 * @description: 配置文件
 * @date 2021/12/28 10:06
 */
@Component
@PropertySource("classpath:project.properties")//读取配置文件
// 也可以同时读取多个配置文件
@ConfigurationProperties(prefix = "redis") //只读以 redis 为开头的配置文件
@Data
public class RedisProperties {
    //最大能够保持空闲状态的链接数
    private int maxIdle;
    //最大连接数
    private int maxTotal;
    //最大的等待时长
    private int maxWaitMillis;
    //当调用borrow Object方法时,是否进行有效性检查
    private boolean testOnBorrow;
    //集群节点配置
    private String nodes;

}

4.编写配置类,使用自定义配置文件,创建rediscluster连接对象

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2021/12/28 10:36
 */

@Configuration
public class RedisClusterConfig {
    @Resource
    private RedisProperties redisProperties;
    /**
     * 实例化 redis集群的连接工厂类
     * @return
     * <bean id='jedisConnectionFactory' class='org.springframework.data.redis.connection.jedis.JedisConnectionFactory'>
     *      *               <constructor-args0 name=clusterConfig ref ='clusterConfig'></constructor-arg0>
     *      *               <constructor-args1 name=poolConfig ref ='poolConfig'></constructor-arg1>
     *      *           </bean>
     */
    @Bean
    public JedisConnectionFactory jedisConnectionFactory(){
        //实例化并返回
        JedisConnectionFactory jedisConnectionFactory=
                new JedisConnectionFactory(configuration(),jedisPoolConfig());
        return jedisConnectionFactory;
    }

    /**
     * 实例化连接redis 集群 配置 并且依赖注入
     * @return
     */
    @Bean
    public RedisClusterConfiguration configuration(){
        //实例化对象
        RedisClusterConfiguration redisClusterConfiguration=
                new RedisClusterConfiguration();
        //获取配置
        String nodes = redisProperties.getNodes();
        //分割配置得到的数组
        String[] split = nodes.split(",");
        for (String node:split
             ) {
            String[] split1 = node.split(":");
            RedisNode redisNode=new RedisNode(split1[0],Integer.valueOf(split1[1]));
            redisClusterConfiguration.addClusterNode(redisNode);
        }
        return redisClusterConfiguration;
    }
    @Bean
    public JedisPoolConfig jedisPoolConfig(){
        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(redisProperties.getMaxIdle());
        jedisPoolConfig.setMaxTotal(redisProperties.getMaxTotal());
        jedisPoolConfig.setMaxWaitMillis(redisProperties.getMaxWaitMillis());
        jedisPoolConfig.setTestOnBorrow(redisProperties.isTestOnBorrow());
        return jedisPoolConfig;
    }
    @Bean
    public void  setJedisConnectionFactory(){
        //
        MyCustomCache.setJedisConnectionFactory(jedisConnectionFactory());
    }

}

5.编写mybatis二级缓存调用第3方redis cluster缓存

package com.aaa.sbm.util;

import com.mysql.jdbc.log.Log;
import io.swagger.models.auth.In;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author zhangyifan
 * @version 8.0
 * @description:
 * @date 2021/12/28 11:31
 */
public class MyCustomCache implements Cache {
    //提供一个接受 String 参数作为 id 的构造器  缓存的唯一标识,不用自己赋值,每次缓存任何对象时,都会自动生成一个唯一的ID
    private String id;
    //依赖注入redis集群连接的数据源
    private static JedisConnectionFactory jedisConnectionFactory;
//  //实例化读写策略类   读读共享   读写互斥  写读互斥  写写互斥
    private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();
//使用静态方法给jedisConnectionFactory赋值
    public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory){
        MyCustomCache.jedisConnectionFactory = jedisConnectionFactory;
    }

    /**
     * 空构造
     */
    public MyCustomCache(){

    }

    /**
     * id必须不能为空
     * @param id
     */
    public MyCustomCache(String id) {
        if (null==id){
            throw new IllegalArgumentException("id不能为空");
        }
        this.id = id;
    }

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

    @Override
    public void putObject(Object key, Object value) {
        //获取连接对象   aaa  111
        //需要序列化 实例化序列类  spring整合redis包提供的
        //序列化key和value
        RedisConnection connection =jedisConnectionFactory.getConnection();
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer=
                new JdkSerializationRedisSerializer();
        byte[] serialize = jdkSerializationRedisSerializer.serialize(key);
        byte[] serialize1 = jdkSerializationRedisSerializer.serialize(value);
        connection.set(serialize,serialize1);
    }

    @Override
    public Object getObject(Object key) {
        //获取连接对象
        RedisConnection connection=jedisConnectionFactory.getConnection();
        //需要序列化 实例化序列类 spring 整合redis包提供的
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer=new JdkSerializationRedisSerializer();
        //序列化 key 和 value
        byte[] serialize = jdkSerializationRedisSerializer.serialize(key);
        byte[] bytes = connection.get(serialize);
        return jdkSerializationRedisSerializer.deserialize(bytes);
    }

    @Override
    public Object removeObject(Object key) {
        RedisConnection connection=jedisConnectionFactory.getConnection();
        //需要序列化 实例化序列类 spring 整合redis包提供的
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer=new JdkSerializationRedisSerializer();
        byte[] serializeKey = jdkSerializationRedisSerializer.serialize(key);;

        return connection.expire(serializeKey,0);

    }

    @Override
    public void clear() {
    //获取连接对象
        RedisConnection connection = jedisConnectionFactory.getConnection();
        //清空单前库
        connection.flushDb();
        //清空所有库
        connection.flushAll();
    }

    @Override
    public int getSize() {
        RedisConnection connection = jedisConnectionFactory.getConnection();
        Long aLong = connection.dbSize();

        return Integer.valueOf(aLong.toString());
    }

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

在mapper中 调用第三方缓存配置

测试

http://localhost:18888/swagger-ui.html

查询
在这里插入图片描述
集群中放的缓存
在这里插入图片描述
新增 在查询
在这里插入图片描述
在这里插入图片描述
flushdb清空当前库
flushall 清空所有库

posted @ 2022-01-11 09:20  啧啧啧|(* ̄ ̄*)  阅读(15)  评论(0)    收藏  举报  来源