本文主要是介绍mybatis使用redis缓存两种方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、注入
@EnableAsync //开启异步
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{public static void main(String[] args){// System.setProperty("spring.devtools.restart.enabled", "false");SpringApplication.run(RuoYiApplication.class, args);System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +" .-------. ____ __ \n" +" | _ _ \\ \\ \\ / / \n" +" | ( ' ) | \\ _. / ' \n" +" |(_ o _) / _( )_ .' \n" +" | (_,_).' __ ___(_ o _)' \n" +" | |\\ \\ | || |(_,_)' \n" +" | | \\ `' /| `-' / \n" +" | | \\ / \\ / \n" +" ''-' `'-' `-..-' ");}@Autowiredpublic void setRedisTemplate(RedisTemplate redisTemplate) {MybatisRedisCache.setRedisTemplate(redisTemplate);}
}
package com.ruoyi.util.cache;import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class MybatisRedisCache implements Cache {private static final Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);private static RedisTemplate<String, Object> redisTemplate;private final String id;/*** The {@code ReadWriteLock}.*/private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();@Overridepublic ReadWriteLock getReadWriteLock() {return this.readWriteLock;}public static void setRedisTemplate(RedisTemplate redisTemplate) {MybatisRedisCache.redisTemplate = redisTemplate;}public MybatisRedisCache() {this.id = null;}public MybatisRedisCache(final String id) {if (id == null) {throw new IllegalArgumentException("Cache instances require an ID");}logger.debug("MybatisRedisCache:id=" + id);this.id = id;}@Overridepublic String getId() {return this.id;}@Overridepublic void putObject(Object key, Object value) {try {logger.info(">>>>>>>>>>>>>>>>>>>>>>>>putObject: key=" + key + ",value=" + value);if (null != value) {redisTemplate.opsForValue().set(key.toString(), value, 60, TimeUnit.SECONDS);}} catch (Exception e) {e.printStackTrace();logger.error("redis保存数据异常!");}}@Overridepublic Object getObject(Object key) {try {logger.info(">>>>>>>>>>>>>>>>>>>>>>>>getObject: key=" + key);if (null != key) {return redisTemplate.opsForValue().get(key.toString());}} catch (Exception e) {e.printStackTrace();logger.error("redis获取数据异常!");}return null;}@Overridepublic Object removeObject(Object key) {try {if (null != key) {return redisTemplate.expire(key.toString(), 1, TimeUnit.DAYS);}} catch (Exception e) {e.printStackTrace();logger.error("redis获取数据异常!");}return null;}@Overridepublic void clear() {Long size = redisTemplate.execute(new RedisCallback<Long>() {@Overridepublic Long doInRedis(RedisConnection redisConnection) throws DataAccessException {Long size = redisConnection.dbSize();//连接清除数据redisConnection.flushDb();redisConnection.flushAll();return size;}});logger.info(">>>>>>>>>>>>>>>>>>>>>>>>clear: 清除了" + size + "个对象");}@Overridepublic int getSize() {Long size = redisTemplate.execute(new RedisCallback<Long>() {@Overridepublic Long doInRedis(RedisConnection connection)throws DataAccessException {return connection.dbSize();}});return size.intValue();}
}
2、bean工具引入
package com.ruoyi.util;import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisServerCommands;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.util.CollectionUtils;import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** @class: MybatisRedisCache*/
@Slf4j
public class MybatisRedisCache implements Cache {// 读写锁private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);//这里使用了redis缓存,使用springboot自动注入private RedisTemplate<String, Object> redisTemplate;private String id;public MybatisRedisCache(final String id) {if (id == null) {throw new IllegalArgumentException("Cache instances require an ID");}this.id = id;}@Overridepublic String getId() {return this.id;}@Overridepublic void putObject(Object key, Object value) {if (redisTemplate == null) {//由于启动期间注入失败,只能运行期间注入,这段代码可以删除redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");}if (value != null) {redisTemplate.opsForValue().set(key.toString(), value);}}@Overridepublic Object getObject(Object key) {if (redisTemplate == null) {//由于启动期间注入失败,只能运行期间注入,这段代码可以删除redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");}try {if (key != null) {return redisTemplate.opsForValue().get(key.toString());}} catch (Exception e) {e.printStackTrace();log.error("缓存出错 ");}return null;}@Overridepublic Object removeObject(Object key) {if (redisTemplate == null) {//由于启动期间注入失败,只能运行期间注入,这段代码可以删除redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");}if (key != null) {redisTemplate.delete(key.toString());}return null;}@Overridepublic void clear() {log.debug("清空缓存");if (redisTemplate == null) {redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");}try {Set<String> keys = scan(this.id);if (!CollectionUtils.isEmpty(keys)) {redisTemplate.delete(keys);}} catch (Exception e) {log.error("清空缓存", e);}}public Set<String> scan(String matchKey) {if (redisTemplate == null) {redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");}Set<String> keys = redisTemplate.execute((RedisCallback<Set<String>>) connection -> {Set<String> keysTmp = new HashSet<>();Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match("*" + matchKey + "*").count(1000).build());while (cursor.hasNext()) {keysTmp.add(new String(cursor.next()));}return keysTmp;});return keys;}@Overridepublic int getSize() {if (redisTemplate == null) {//由于启动期间注入失败,只能运行期间注入,这段代码可以删除redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");}Long size = redisTemplate.execute((RedisCallback<Long>) RedisServerCommands::dbSize);return size.intValue();}@Overridepublic ReadWriteLock getReadWriteLock() {return this.readWriteLock;}}
这篇关于mybatis使用redis缓存两种方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!