Redis做Mybatis的二级缓存

2022-08-18 15:14:40 浏览数 (1)

Redis做mybatis的二级缓存

作用提升速度,保证多台服务器访问同一数据库时不会崩 注意:保证本地有下载redis且已经打开,否则无法使用。 【本文只讲述了实现步骤,并没有原理讲解】

保证有导入mybatis依赖和Redis依赖

代码语言:javascript复制
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
代码语言:javascript复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

创建cache包放入以下类

【记住:该类不可以注入bean,就是不能加注解@Bean】

代码语言:javascript复制
//实现Mybatis的Cache接口
public class RedisMybatisCache implements Cache {	//注意这里Cache导入的是ibatis的cache

    private final String id;
    private static RedisTemplate<Object, Object> template;

   	//注意构造方法必须带一个String类型的参数接收id
    public RedisMybatisCache(String id){
        this.id = id;
    }

  	//初始化时通过配置类将RedisTemplate给过来
    public static void setTemplate(RedisTemplate<Object, Object> template) {
        RedisMybatisCache.template = template;
    }

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

    @Override
    public void putObject(Object o, Object o1) {	//o就是Key,o1就是Value
      	//这里直接向Redis数据库中丢数据即可,o就是Key,o1就是Value,60分钟为过期时间
        template.opsForValue().set(o, o1, 60, TimeUnit.MINUTES);
    }

    @Override
    public Object getObject(Object o) {
      	//这里根据Key直接从Redis数据库中获取值即可
        return template.opsForValue().get(o);
    }

    @Override
    public Object removeObject(Object o) {
      	//根据Key删除
        return template.delete(o);
    }

    @Override
    public void clear() {
      	//由于template中没封装清除操作,只能通过connection来执行
				template.execute((RedisCallback<Void>) connection -> {
          	//通过connection对象执行清空操作
            connection.flushDb();
            return null;
        });
    }

    @Override
    public int getSize() {
      	//这里也是使用connection对象来获取当前的Key数量
        return template.execute(RedisServerCommands::dbSize).intValue();	//这里导的类是redis下的
    }
}

编写配置类config

代码语言:javascript复制
@Configuration
public class MainConfiguration {
    @Resource
    RedisTemplate<Object, Object> template;

    @PostConstruct
    public void init(){
      	//把RedisTemplate给到RedisMybatisCache
        RedisMybatisCache.setTemplate(template);
    }
}

每个mapper上加入该注解

代码语言:javascript复制
//只需要修改缓存实现类implementation为我们的RedisMybatisCache即可
@CacheNamespace(implementation = RedisMybatisCache.class)	
@Mapper
public interface MainMapper {

    @Select("select name from student where sid = 1")
    String getSid();
}

每一个实体类实现该接口

(Redis存储对象时,是用序列化存储,所以select返回一个对象时会用到该接口)

代码语言:javascript复制
@Data
public class Account implements Serializable {
    int id;
    String username;
    String password;
    String role;
}

0 人点赞