SpringBoot+Mybatis整合Redis实现二级缓存

一. redis与spring boot整合

  1. 添加pom依赖

	org.springframework.boot
 	spring-boot-starter-data-redis
 


    org.apache.commons
    commons-pool2
    2.7.0

  1. 代码中注入RedisTemplate使用即可
@RequestMapping("/redis")
@RestController
public class RedisController {

    @Resource
    private RedisTemplate redisTemplate;

    @RequestMapping("/set")
    public Object set() {
//        redisTemplate.opsForValue(); // opsForValue 就是之前操作字符串
//        redisTemplate.opsForList(); //opsForList, 操作列表
//        redisTemplate.opsForHash(); // hash(map)
//        redisTemplate.opsForZSet(); // zset
//        redisTemplate.opsForSet(); //set

        redisTemplate.opsForList().leftPushAll("users", "zhangsan", "lisi");

        return "success";   //set成功后直接进入redis客户端即可查看添加数据成功
    }

    @RequestMapping("/get")
    public Object get() {
        return redisTemplate.opsForList().range("users", 0, -1);
    }
}

二、 Mybatis二级缓存

一级缓存,就算Sqlsession级别缓存,二级缓存就是SqlsessionFactory级别缓存

2.1 缓存类的实现
package com.zqh.cache;

import com.zqh.config.ApplicationContextHolder;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;

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

/**
 * 1.使用@Component的方式,是spring的方式,会生成一个RedisCache的实例,纳入spring容器中,
 *    在这个容器中实例,是可以注入RedisTemplate。
 * 2.因为在每个mapper中,配置了二级缓存,对应的mapper会重新生成实例,生成的这个实例没有按照spring的规则来生成。
 *   所以这个类中加入了 @Resource @AutoWire都是无法获取。
 * 3.那么如何获取spring容器中的对象了?就需要先拿到spring容器,然后从容器中去手动取。
 */

public class RedisCache implements Cache {  //要想使用Mybatis的二级缓存,必须要实现Cache接口

    private RedisTemplate redisTemplate;

    private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

    private String id;

    // id的作用是将不同的mapper作一个区分
    public RedisCache(String id) {
        this.id = id;
    }

    // 获取RedisTemplate
    private RedisTemplate getRedisTemplate() {
        this.redisTemplate = ApplicationContextHolder.getRedisTemplate();
        return redisTemplate;
    }

    @Override
    public void putObject(Object key, Object value) {
        getRedisTemplate().opsForValue().set(key, value);
    }

    @Override
    public Object getObject(Object key) {
        return getRedisTemplate().opsForValue().get(key);
    }

    @Override
    public Object removeObject(Object key) {
        return getRedisTemplate().delete(key);
    }

    @Override
    public int getSize() {
        return 1;
    }

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

    // 不用实现
    @Override
    public void clear() {
    }

    @Override
    public ReadWriteLock getReadWriteLock() {
        return this.reentrantReadWriteLock;
    }
}
2.2 获取ApplicationContext
package com.zqh.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * spring提供了很多的接口 XXXXAware, 这一类的接口比较的特殊, 那么spring容器在启动的时候
 * 如果检测某个类实现了这一类接口,那么会去调用实现了该接口方法的实现。
 */
@Component
public class ApplicationContextHolder implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    // 该放方法会自动将spring容器的类 ApplicationContext, 传入给该方法。
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextHolder.applicationContext = applicationContext;
    }

    // 从容器中获取RedisTemplate
    public static RedisTemplate getRedisTemplate() {
        return applicationContext.getBean("redisTemplate", RedisTemplate.class);
    }
}
2.3 mapper.xml配置
    
     
    

你可能感兴趣的:(Redis)