Spring cache redisをキャッシュに使用

16045 ワード

Paste_Image.png
      spring      ,       ,         。

1.pom追加
ここでspring-data-redisjedisを追加するにはjarパッケージが必要です.
        
            org.springframework.data
            spring-data-redis
            1.3.4.RELEASE
        
        
            redis.clients
            jedis
            2.5.2
        

2.spring構成
springのプロファイルアプリケーションContext.xmlに次のredisの構成情報を追加します.

          
              
              
              
              
        
        
        

          
            
            

ここでredisのいくつかの情報を構成します.もちろん、プロファイルで構成することもできます.
redis.host=192.168.31.4 
redis.port=6379  
redis.pass= 
redis.maxIdle=50  
redis.maxActive=50  
redis.maxWait=50  
redis.testOnBorrow=true  
redis.timeout=1000  

次に、プロファイルでキャッシュするオブジェクトの値を次のように設定します.

    
    
        
            
                
                    
                    
                    
                
                
                    
                    
                    
                
                
                    
                    
                    
                
            
        
    

ここで構成されているorderServiceImpl.selectInterestsとorderServiceImpl.selectInterestsListはそれぞれredisキャッシュの名前です.次のコードで説明します.
3.redisキャッシュ構成クラス
ここではプロファイルで実装されるSystemRedisCacheを追加し、ここでは主にredisのビジネスの操作方法について説明します.

import com.hejia.alauda.utils.SerializableUtil;
import org.springframework.cache.Cache;
import org.springframework.cache.support.SimpleValueWrapper;
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 org.springframework.util.StringUtils;

/**
 * info:redis     
 * Created by shang on 2016/11/9.
 */
public class SystemRedisCache implements Cache {

    /**
     * Redis
     */
    private RedisTemplate redisTemplate;

    /**
     *     
     */
    private String name;

    /**
     *     
     */
    private long timeout;

    /*
     * (non-Javadoc)
     * @see org.springframework.cache.Cache#getName()
     */
    @Override
    public String getName() {
        return this.name;
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.cache.Cache#getNativeCache()
     */
    @Override
    public Object getNativeCache() {
        // TODO Auto-generated method stub
        return this.redisTemplate;
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.cache.Cache#get(java.lang.Object)
     */
    @Override
    public ValueWrapper get(Object key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        } else {
            final String finalKey;
            if (key instanceof String) {
                finalKey = (String) key;
            } else {
                finalKey = key.toString();
            }
            Object object = null;
            object = redisTemplate.execute(new RedisCallback() {
                public Object doInRedis(RedisConnection connection) throws DataAccessException {
                    byte[] key = finalKey.getBytes();
                    byte[] value = connection.get(key);
                    if (value == null) {
                        return null;
                    }
                    return SerializableUtil.unserialize(value);
                }
            });
            return (object != null ? new SimpleValueWrapper(object) : null);
        }
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.cache.Cache#get(java.lang.Object, java.lang.Class)
     */
    @SuppressWarnings("unchecked")
    @Override
    public  T get(Object key, Class type) {
        if (StringUtils.isEmpty(key) || null == type) {
            return null;
        } else {
            final String finalKey;
            final Class finalType = type;
            if (key instanceof String) {
                finalKey = (String) key;
            } else {
                finalKey = key.toString();
            }
            final Object object = redisTemplate.execute(new RedisCallback() {
                public Object doInRedis(RedisConnection connection) throws DataAccessException {
                    byte[] key = finalKey.getBytes();
                    byte[] value = connection.get(key);
                    if (value == null) {
                        return null;
                    }
                    return SerializableUtil.unserialize(value);
                }
            });
            if (finalType != null && finalType.isInstance(object) && null != object) {
                return (T) object;
            } else {
                return null;
            }
        }
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.cache.Cache#put(java.lang.Object, java.lang.Object)
     */
    @Override
    public void put(final Object key, final Object value) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
            return;
        } else {
            final String finalKey;
            if (key instanceof String) {
                finalKey = (String) key;
            } else {
                finalKey = key.toString();
            }
            if (!StringUtils.isEmpty(finalKey)) {
                final Object finalValue = value;
                redisTemplate.execute(new RedisCallback() {
                    @Override
                    public Boolean doInRedis(RedisConnection connection) {
                        connection.set(finalKey.getBytes(), SerializableUtil.serialize(finalValue));
                        //      
                        connection.expire(finalKey.getBytes(), timeout);
                        return true;
                    }
                });
            }
        }
    }

    /*
     *   Key     
     */
    @Override
    public void evict(Object key) {
        if (null != key) {
            final String finalKey;
            if (key instanceof String) {
                finalKey = (String) key;
            } else {
                finalKey = key.toString();
            }
            if (!StringUtils.isEmpty(finalKey)) {
                redisTemplate.execute(new RedisCallback() {
                    public Long doInRedis(RedisConnection connection) throws DataAccessException {
                        return connection.del(finalKey.getBytes());
                    }
                });
            }
        }
    }

    /*
     *       
     */
    @Override
    public void clear() {
        // TODO Auto-generated method stub
        // redisTemplate.execute(new RedisCallback() {
        // public String doInRedis(RedisConnection connection) throws DataAccessException {
        // connection.flushDb();
        // return "ok";
        // }
        // });
    }

    public RedisTemplate getRedisTemplate() {
        return redisTemplate;
    }

    public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getTimeout() {
        return timeout;
    }

    public void setTimeout(long timeout) {
        this.timeout = timeout;
    }
}


開発中のobjectとlistオブジェクトのシーケンス化と逆シーケンス化を主に行うツールクラスのコードが付属しています.Redisはobjectと汎用性を知らないため,オブジェクトをredisに格納する際にキャッシュされたすべてのデータをシーケンス化する必要がある.

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * info:      
 * Created by shang on 2016/11/9.
 */
public class SerializableUtil {

    /**
     *    
     *
     * @param object
     * @return
     */
    public static byte[] serialize(Object object) {
        if (object == null) {
            return null;
        }
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        byte[] bytes = null;
        try {
            //    
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            bytes = baos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(oos);
            close(baos);
        }
        return bytes;
    }

    /**
     *     
     *
     * @param bytes
     * @return
     */
    public static Object unserialize(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        ByteArrayInputStream bais = null;
        ObjectInputStream ois = null;
        try {
            //     
            bais = new ByteArrayInputStream(bytes);
            ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(bais);
            close(ois);
        }
        return null;
    }

    /**
     *     list   
     *
     * @param list
     * @return
     */
    public static byte[] serializeList(List> list) {

        if (list==null||list.size()==0) {
            return null;
        }
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        byte[] bytes = null;
        try {
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            for (Object obj : list) {
                oos.writeObject(obj);
            }
            bytes = baos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(oos);
            close(baos);
        }
        return bytes;
    }

    /**
     *      list   
     */
    public static List> unserializeList(byte[] bytes) {
        if (bytes == null) {
            return null;
        }

        List list = new ArrayList();
        ByteArrayInputStream bais = null;
        ObjectInputStream ois = null;
        try {
            //     
            bais = new ByteArrayInputStream(bytes);
            ois = new ObjectInputStream(bais);
            while (bais.available() > 0) {
                Object obj = (Object) ois.readObject();
                if (obj == null) {
                    break;
                }
                list.add(obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(bais);
            close(ois);
        }
        return list;
    }

    /**
     *   io   
     *
     * @param closeable
     */
    public static void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}


4.キャッシュサービス方法
指定したサービスメソッドをキャッシュします.使用方法は次のとおりです.
 @Cacheable(value = "orderServiceImpl.selectInterests",key = "'selectInterests_'+#params.get('user_id')+'_'+#params.get('type')+'_'+#pager.pageNumber")//  redis  
    @Override
    public Pager selectInterests(Map params, Pager pager) {
        System.out.println("select selectInterests class ....");
        pager.setList(interestMapper.findInterestListV3(params, pager));
        pager.setTotalCount(interestMapper.findCountInterestListV3(params));
        return pager;
    }

    @Cacheable(value = "orderServiceImpl.selectInterestsList",key = "'selectInterestsList_'+#params.get('user_id')+'_'+#params.get('type')+'_'+#params.get('valueDate')")//  redis  
    @Override
    public List> selectInterestsList(Map params) {
        System.out.println("select ---selectInterestsList class");
        return interestMapper.selectInterestsListV3(params);
    }

この上の2つの方法はspringプロファイルに構成されている2つのキャッシュです.ここでは主にクエリーのページングをキャッシュします.上記の方法はキャッシュを追加し、10分後に期限が切れます.ここでkeyはredisに対応する識別子であり、クエリーする場合はkey値を使用してクエリーできます.
キャッシュを変更および削除する必要がある場合は、@CachePutおよび@CacheEvictを使用します.使用方法は以下の通りです.
Cache注記の詳細
- @CacheConfig:                      。   @CacheConfig(cacheNames = "users"):                      users      ,           ,    @Cacheable             。

- @Cacheable:   findByName            。      ,        ,               。            :

    - value、cacheNames:       (cacheNames Spring 4  ,  value   ),            。  Spring 4    @CacheConfig,   Spring 3       value  ,        
    - key:       Map    key ,   ,               key ,        SpEL   ,  :@Cacheable(key = "#p0"):              key ,    SpEL               

    - condition:       ,   ,    SpEL   ,                 ,  :@Cacheable(key = "#p0", condition = "#p0.length() < 3"),               3        ,        AAA        ,         。
    - unless:          ,   ,   SpEL   。    condition             ,                 ,        result    。
    - keyGenerator:    key   ,   。           key   ,       org.springframework.cache.interceptor.KeyGenerator  ,         。      :    key    

    - cacheManager:             ,   。            
    - cacheResolver:             ,   。   org.springframework.cache.interceptor.CacheResolver             ,       。

             ,          :

- @CachePut:      ,               ,  @Cacheable    ,           ,                。     @Cacheable  ,          @Cacheable     
- @CacheEvict:      ,         ,            。   @Cacheable       ,         :

    - allEntries:   ,   false。  true ,       
    - beforeInvocation:   ,   false,            。  true ,            。

5.終了
これらはspring cacheを使用してredisをキャッシュする方法です.あなたのプロジェクトで試してみる必要がある場合は、ここでEcacheキャッシュを使用していないのは、プロジェクトが分散配置を使用しているためであり、ローカルキャッシュではだめなので、redisをキャッシュとして使用し、アクセスを統一します.
何か問題があったら、手紙や伝言をください.