SpringMVC + Spring-data-redis整合完整示例(续)

在昨天写过的文章中:SpringMVC + Spring-data-redis整合完整示例 ,进行改版,使用BaseDao的方式,将通用的方法进行统一管理

改版内容如下

第一步:删除了 RedisGeneratorDao.java

第二步:新增 RedisBaseDao.java 和 RedisBaseDaoImpl.java 实现类,(用到了Gson.jar)

第三步:更新 MemberDaoImpl.java

RedisBaseDao.java

/**
 * 设置一个Redis基类,根据泛型+反射整理,实现通用方法
 * <br>
 * keyId代表Class类名全路径 + "_" + keyId  例如:key为id,那么到实现类中,就是 com.youcl.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.youcl.com
 * @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 com.youcl.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方法,如何设置过期等内容,请看持续关注下一篇文章

赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏