Redis与mybatis,shiro,spring session整合

配置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 redisTemplate(){
    RedisTemplate redisTemplate = new RedisTemplate();

    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 

 * @return

 */

public static  T getBean(Class clazz) {
    return applicationContext.getBean(clazz);

}

/**

 * Get bean by class name

 *

 * @param name

 * @param 

 * @return

 */

@SuppressWarnings("unchecked")
public static  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  Cache getCache(String name) throws CacheException {
    return new ShiroCache();

}

}

在spring配置文件中配置




你可能感兴趣的:(redis,redis缓存,spring-session,shiro-缓存,mybatis,redis)