在昨天写过的文章中:SpringMVC + Spring-data-redis整合完整示例 ,进行改版,使用BaseDao的方式,将通用的方法进行统一管理,接着上一篇文章进行配置:http://www.ibloger.net/article/1356.html
改版内容如下
第一步:删除了 RedisGeneratorDao.java
第二步:新增 RedisBaseDao.java 和 RedisBaseDaoImpl.java 实现类,(用到了Gson.jar)
第三步:更新 MemberDaoImpl.java
RedisBaseDao.java
/**
* 设置一个Redis基类,根据泛型+反射整理,实现通用方法
* <br>
* keyId代表Class类名全路径 + "_" + keyId 例如:key为id,那么到实现类中,就是 net.ibloger.demo.User_id
* <br>
* 两个方法没有提供
* 一:没有提供修改方法,set中key相同替换相当于更新
* 二:没有提供添加集合方法,因为 T 不能确定某一个参数值,所以集合可以在自定义的dao中实现
* @param <T>
*/
public interface RedisBaseDao<T>{
/**
* 根据keyId查询实体
* @param cls
* @param keyId 以什么参数作为keyid
* @return
*/
public T getEntityByKey(final Class<T> cls, final String keyId);
/**
* 新增实体
* @param entity
* @param keyId
*/
public void addEntity(final T entity, final String keyId);
/**
* 根据keyId删除实体
* @param cls
* @param keyId
*/
public void deleteEntityByKey(final Class<T> cls, final String keyId);
}RedisBaseDaoImpl.java
import java.io.Serializable;
import javax.annotation.Resource;
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.data.redis.serializer.RedisSerializer;
import org.springframework.util.Assert;
import com.google.gson.Gson;
/**
* 实现Redis通用基类
*
* @author http://www.ibloger.net
* @param <T>
*/
public class RedisBaseDaoImpl<T> implements RedisBaseDao<T> {
@Resource
protected RedisTemplate<Serializable, Serializable> redisTemplate;
/**
* 获取 RedisSerializer
*/
protected RedisSerializer<String> getStringSerializer() {
return redisTemplate.getStringSerializer();
}
@Override
public T getEntityByKey(final Class<T> cls, String keyId) {
return redisTemplate.execute(new RedisCallback<T>() {
@Override
public T doInRedis(RedisConnection connection) throws DataAccessException {
byte[] key = getStringSerializer().serialize(cls.getName() + "_" + keyId);
if (connection.exists(key)) {
byte[] value = connection.get(key);
String json = getStringSerializer().deserialize(value);
return new Gson().fromJson(json, cls);
}
return null;
}
});
}
@Override
public void addEntity(final T entity, final String keyId) {
Assert.notNull(entity);
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
byte[] key = getStringSerializer().serialize(entity.getClass().getName() + "_" + keyId);
byte[] name = getStringSerializer().serialize(new Gson().toJson(entity));
connection.set(key,name);
return null;
}
});
}
@Override
public void deleteEntityByKey(final Class<T> cls, String keyId) {
redisTemplate.delete(cls.getName() + "_" + keyId);
}
}MemberDaoImpl.java
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert;
import com.google.gson.Gson;
import net.ibloger.wechat.redis.dao.RedisBaseDaoImpl;
@Repository(value = "memberDao")
public class MemberDaoImpl extends RedisBaseDaoImpl<Member> implements MemberDao {
/**
* 添加对象
*/
@Override
public void add(final Member member) {
addEntity(member, member.getId());
}
/**
* 添加集合
*/
@Override
public void add(final List<Member> list) {
Assert.notEmpty(list);
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for (Member m : list) {
byte[] key = getStringSerializer().serialize(m.getClass().getName() + "_" + m.getId());
byte[] name = getStringSerializer().serialize(new Gson().toJson(m));
connection.set(key, name);
}
return null;
}
});
}
/**
* 删除对象 ,依赖key
*/
@Override
public void delete(String keyId) {
deleteEntityByKey(Member.class, keyId);
}
/**
* 根据key获取对象
*/
@Override
public Member get(final String keyId) {
return getEntityByKey(Member.class, keyId);
}
}测试效果图同上一节博文内容:SpringMVC + Spring-data-redis整合完整示例
关于RedisConnection中set和get方法,如何设置过期等内容,请看持续关注下一篇文章
未经允许请勿转载:程序喵 » SpringMVC + Spring-data-redis整合完整示例(续)
程序喵