Spring Cache集成Redis

redis大家都耳熟能详了,spring context默认没有实现redis的cache相关接口,我们需要自己实现,并借助org.springframework.cache.support.SimpleCacheManager进行redis缓存管理。

添加jar包:

<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.5.2</version>
  </dependency>cache接口实现:


package org.springframework.cache.demo.redis;

import Java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

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;

public class RedisCache implements Cache {

private RedisTemplate<String, Object> redisTemplate;
 private String name;

public RedisTemplate<String, Object> getRedisTemplate() {
  return redisTemplate;
 }

public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  this.redisTemplate = redisTemplate;
 }

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

@Override
 public String getName() {
  return this.name;
 }

@Override
 public Object getNativeCache() {
  return this.redisTemplate;
 }

@Override
 public ValueWrapper get(Object key) {
  final String keyf = (String) key;
  Object object = null;
  object = redisTemplate.execute(new RedisCallback<Object>() {
   public Object doInRedis(RedisConnection connection) throws DataAccessException {

byte[] key = keyf.getBytes();
    byte[] value = connection.get(key);
    if (value == null) {
     return null;
    }
    return toObject(value);
   }
  });
  return (object != null ? new SimpleValueWrapper(object) : null);
 }

@Override
 public void put(Object key, Object value) {
  final String keyf = (String) key;
  final Object valuef = value;
  final long liveTime = 86400;

redisTemplate.execute(new RedisCallback<Long>() {
   public Long doInRedis(RedisConnection connection) throws DataAccessException {
    byte[] keyb = keyf.getBytes();
    byte[] valueb = toByteArray(valuef);
    connection.set(keyb, valueb);
    if (liveTime > 0) {
     connection.expire(keyb, liveTime);
    }
    return 1L;
   }
  });
 }

/**
  * 描述 : <Object转byte[]>. <br>
  * <p>
  * <使用方法说明>
  * </p>
  *
  * @param obj
  * @return
  */
 private byte[] toByteArray(Object obj) {
  byte[] bytes = null;
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  try {
   ObjectOutputStream oos = new ObjectOutputStream(bos);
   oos.writeObject(obj);
   oos.flush();
   bytes = bos.toByteArray();
   oos.close();
   bos.close();
  } catch (IOException ex) {
   ex.printStackTrace();
  }
  return bytes;
 }

/**
  * 描述 : <byte[]转Object>. <br>
  * <p>
  * <使用方法说明>
  * </p>
  *
  * @param bytes
  * @return
  */
 private Object toObject(byte[] bytes) {
  Object obj = null;
  try {
   ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
   ObjectInputStream ois = new ObjectInputStream(bis);
   obj = ois.readObject();
   ois.close();
   bis.close();
  } catch (IOException ex) {
   ex.printStackTrace();
  } catch (ClassNotFoundException ex) {
   ex.printStackTrace();
  }
  return obj;
 }

@Override
 public void evict(Object key) {
  final String keyf = (String) key;
  redisTemplate.execute(new RedisCallback<Long>() {
   public Long doInRedis(RedisConnection connection) throws DataAccessException {
    return connection.del(keyf.getBytes());
   }
  });
 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15009.html