Redis与mybatis,shiro,spring session整合

来源:互联网 发布:香港御可贡茶加盟 知乎 编辑:程序博客网 时间:2024/05/29 14:13

配置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;}@Beanpublic RedisTemplate<String,String> redisTemplate(){    RedisTemplate<String,String> redisTemplate = new RedisTemplate<String, String>();    redisTemplate.setConnectionFactory(jedisConnectionFactory());    redisTemplate.afterPropertiesSet();    return redisTemplate;}@Beanpublic 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;

@Overridepublic 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 idprivate 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;}@Overridepublic 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 */@Overridepublic 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 */@Overridepublic 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 */@Overridepublic int getSize() {    return (int)redisTemplate.execute((RedisCallback) connection -> connection.dbSize().intValue());}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void clear() throws CacheException {    redisTemplate = getRedisTemplate();    redisTemplate.execute((RedisCallback) connection -> {        connection.flushDb();        return null;    });    logger.debug("Clear all the cached from shiro");}@Overridepublic int size() {    redisTemplate = getRedisTemplate();    return (int)redisTemplate.execute((RedisCallback) connection -> connection.dbSize().intValue());}@Overridepublic Set keys() {    redisTemplate = getRedisTemplate();    return redisTemplate.keys("*");}@Overridepublic 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配置文件中配置




原创粉丝点击