Redis与mybatis,shiro,spring session整合

xiaoxiao2021-02-28  108

配置Redis配置类 @Component

@Configuration

@EnableCaching

public class RedisConfig { @Bean

public JedisConnectionFactory jedisConnectionFactory(){ JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setHostName("172.16.142.144"); jedisConnectionFactory.setPort(7000); jedisConnectionFactory.setPassword("填自己的redis密码"); jedisConnectionFactory.afterPropertiesSet(); return jedisConnectionFactory; } @Bean public RedisTemplate<String,String> redisTemplate(){ RedisTemplate<String,String> redisTemplate = new RedisTemplate<String, String>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.afterPropertiesSet(); return redisTemplate; } @Bean public CacheManager cacheManager(RedisTemplate redisTemplate){ return new RedisCacheManager(redisTemplate); }

}

ApplicationContextHolder用于获取spring容器中的bean import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.stereotype.Component;

@Component

public class ApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext;

@Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { applicationContext = ctx; } /** * Get application context from everywhere * * @return */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * Get bean by class * * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } /** * Get bean by class name * * @param name * @param <T> * @return */ @SuppressWarnings("unchecked") public static <T> T getBean(String name) { return (T) applicationContext.getBean(name); }

}

实现mybatis的Cache接口 package com.baizhi.utils;

import org.apache.ibatis.cache.Cache;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.data.redis.core.RedisCallback;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.ValueOperations;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.ReadWriteLock;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class RedisCache implements Cache { private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);

private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private final String id; // cache instance id private RedisTemplate redisTemplate; private static final long EXPIRE_TIME_IN_MINUTES = 30; // redis过期时间 public RedisCache(String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } this.id = id; } @Override public String getId() { return id; } /** * Put query result to redis * * @param key * @param value */ @Override @SuppressWarnings("unchecked") public void putObject(Object key, Object value) { redisTemplate = getRedisTemplate(); ValueOperations opsForValue = redisTemplate.opsForValue(); opsForValue.set(key, value, EXPIRE_TIME_IN_MINUTES, TimeUnit.MINUTES); logger.debug("Put query result to redis"); } /** * Get cached query result from redis * * @param key * @return */ @Override public Object getObject(Object key) { redisTemplate = getRedisTemplate(); ValueOperations opsForValue = redisTemplate.opsForValue(); logger.debug("Get cached query result from redis"); return opsForValue.get(key); } /** * Remove cached query result from redis * * @param key * @return */ @Override @SuppressWarnings("unchecked") public Object removeObject(Object key) { redisTemplate = getRedisTemplate(); redisTemplate.delete(key); logger.debug("Remove cached query result from redis"); return null; } /** * Clears this cache instance */ @Override public void clear() { redisTemplate = getRedisTemplate(); redisTemplate.execute((RedisCallback) connection -> { connection.flushDb(); return null; }); logger.debug("Clear all the cached query result from redis"); } /** * This method is not used * * @return */ @Override public int getSize() { return (int)redisTemplate.execute((RedisCallback) connection -> connection.dbSize().intValue()); } @Override public ReadWriteLock getReadWriteLock() { return readWriteLock; } private RedisTemplate getRedisTemplate() { if (redisTemplate == null) { redisTemplate = ApplicationContextHolder.getBean("redisTemplate"); } return redisTemplate; }

}

在Mapper中开启缓存

实现shiro的Cache接口 package com.baizhi.utils;

import org.apache.shiro.cache.Cache;

import org.apache.shiro.cache.CacheException;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.data.redis.core.RedisCallback;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.ValueOperations;

import java.util.ArrayList;

import java.util.Collection;

import java.util.List;

import java.util.Set;

/**

Created by fankaixiang on 2017/7/10.

*/

public class ShiroCache implements Cache{ private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);

private RedisTemplate redisTemplate; private RedisTemplate getRedisTemplate() { if (redisTemplate == null) { redisTemplate = ApplicationContextHolder.getBean("redisTemplate"); } return redisTemplate; } @Override public Object get(Object key) throws CacheException { redisTemplate = getRedisTemplate(); ValueOperations opsForValue = redisTemplate.opsForValue(); logger.debug("Shiro get cached query result from redis"); return opsForValue.get(key); } @Override public Object put(Object key, Object value) throws CacheException { redisTemplate = getRedisTemplate(); ValueOperations opsForValue = redisTemplate.opsForValue(); opsForValue.set(key, value); logger.debug("Shiro Put query result to redis"); return value; } @Override public Object remove(Object key) throws CacheException { redisTemplate = getRedisTemplate(); ValueOperations opsForValue = redisTemplate.opsForValue(); Object value = opsForValue.get(key); redisTemplate.delete(key); logger.debug("Shiro,remove cached query result from redis"); return value; } @Override public void clear() throws CacheException { redisTemplate = getRedisTemplate(); redisTemplate.execute((RedisCallback) connection -> { connection.flushDb(); return null; }); logger.debug("Clear all the cached from shiro"); } @Override public int size() { redisTemplate = getRedisTemplate(); return (int)redisTemplate.execute((RedisCallback) connection -> connection.dbSize().intValue()); } @Override public Set keys() { redisTemplate = getRedisTemplate(); return redisTemplate.keys("*"); } @Override public Collection values() { redisTemplate = getRedisTemplate(); Set set = redisTemplate.keys("*"); List list = new ArrayList(); for (Object key : set) { list.add(get(key)); } return list; }

}

实现Shiro的CacheManager package com.baizhi.utils;

import org.apache.shiro.cache.Cache;

import org.apache.shiro.cache.CacheException;

import org.apache.shiro.cache.CacheManager;

import org.springframework.stereotype.Component;

/**

Created by fankaixiang on 2017/7/10.

*/

@Component

public class RedisShiroCacheManager implements CacheManager { @Override

public <K, V> Cache<K, V> getCache(String name) throws CacheException { return new ShiroCache(); }

}

在spring配置文件中配置

转载请注明原文地址: https://www.6miu.com/read-44874.html

最新回复(0)