CounpenRepository.java 5.3 KB
package com.zhaoonline.coupen.repository;

import com.zhaoonline.coupen.bean.Activity;
import com.zhaoonline.coupen.bean.CommonCoupenEntity;
import com.zhaoonline.coupen.bean.CommonCoupenSeed;
import com.zhaoonline.redis.repository.DataValueRepository;
import org.springframework.beans.factory.annotation.Autowired;
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.GenericJackson2JsonRedisSerializer;


/**
 * Created by ZhaoOnline<br/>
 * User: yangyoupeng<br/>
 * Date: 2016/12/17<br/>
 * Time: 14:46<br/>
 * Description:please descript you class
 */
public class CounpenRepository {

    private static final String radisKeyCoupenPreffix="coupen";
    private static final String radisKeyActivityPreffix="activity";
    private static final String radisKeySeedPreffix="seed";

    private DataValueRepository<CommonCoupenEntity>  coupenRepository =null;
    private  RedisTemplate<String,CommonCoupenEntity> redisTemplate;
    private static GenericJackson2JsonRedisSerializer valueDeSe= new GenericJackson2JsonRedisSerializer();

    @Autowired
    public CounpenRepository(DataValueRepository<CommonCoupenEntity>  coupenRepository){
        this.coupenRepository=coupenRepository;
        redisTemplate =  this.coupenRepository.getRedisTemplate();
    }

    public boolean  saveCoupenEntity(CommonCoupenEntity coupen) {
        String coupenKey=concatCoupenRedisKey(coupen.getCoupenID());

        CommonCoupenSeed seed=coupen.getSeed();
        byte[] activityKeyBytes =null;
        byte[] seedKeyBytes=null;
        if(seed !=null){
            String seedKey=concatSeedRedisKey(seed.getSeedID());
            seedKeyBytes=redisTemplate.getStringSerializer().serialize(seedKey);
            Activity activity= seed.getActivity();
            if(activity != null){
                String activityKey=concatActivityRedisKey(activity.getActivityID());
                activityKeyBytes=redisTemplate.getStringSerializer().serialize(activityKey);
            }
        }
        byte[] coupenKeyBytes=redisTemplate.getStringSerializer().serialize(coupenKey);
        byte[] valueBytes=valueDeSe.serialize(coupen);
        CoupenAddRedisCallBack addRedisCallBack = new CoupenAddRedisCallBack(activityKeyBytes,seedKeyBytes,coupenKeyBytes,valueBytes);
        redisTemplate.executePipelined(addRedisCallBack);
        return true;
    }

    private String concatActivityRedisKey(Integer activityID) {
        return radisKeyActivityPreffix+":"+activityID;
    }

    private String concatSeedRedisKey(String seedID) {
        return radisKeySeedPreffix+":"+seedID;
    }

    public void  deleteCoupenEntityByKey(CommonCoupenEntity coupen){
        String coupenKey=concatCoupenRedisKey(coupen.getCoupenID());
        CommonCoupenSeed seed=coupen.getSeed();
        String seedKey=concatSeedRedisKey(seed.getSeedID());
        byte[] coupenKeyBytes=redisTemplate.getStringSerializer().serialize(coupenKey);
        byte[] seedKeyBytes=redisTemplate.getStringSerializer().serialize(seedKey);
        redisTemplate.executePipelined(new RedisCallback<CommonCoupenEntity>() {
            @Override
            public CommonCoupenEntity doInRedis(RedisConnection connection) throws DataAccessException {
                connection.del(coupenKeyBytes);
                connection.sRem(seedKeyBytes,coupenKeyBytes);
                //必须要返回null。否则会抛出异常
                // org.springframework.dao.InvalidDataAccessApiUsageException: Callback cannot return a non-null value as it gets overwritten by the pipeline
                return null;
            }
        });
        //coupenRepository.delete(activitySaveedKey);
    }


    public CommonCoupenEntity getCoupenEntityByKey(String  coupenID){
        String activitySaveedKey=concatCoupenRedisKey(coupenID);
        CommonCoupenEntity result= coupenRepository.get(activitySaveedKey);
        return result;
    }



    private String concatCoupenRedisKey(String key){
        return radisKeyCoupenPreffix+":"+key;
    }


    public class CoupenAddRedisCallBack implements  RedisCallback<CommonCoupenEntity>{
        private byte[] activityKeyBytes =null;
        private byte[] seedKeyBytes =null;
        private byte[] coupenKeyBytes =null;
        private byte[] valueBytes =null;

        public CoupenAddRedisCallBack(byte[] activityKeyBytes , byte[] seedKeyBytes,byte[] coupenKeyBytes, byte[] valueBytes){
            this.activityKeyBytes=activityKeyBytes;
            this.seedKeyBytes = seedKeyBytes;
            this.coupenKeyBytes = coupenKeyBytes;
            this.valueBytes = valueBytes;
        }
        @Override
        public CommonCoupenEntity doInRedis(RedisConnection connection) throws DataAccessException {

//            connection.watch(coupenKeyBytes);
//            connection.multi();
            if(activityKeyBytes != null){
             connection.sAdd(activityKeyBytes,seedKeyBytes);
            }
            if(seedKeyBytes != null){
                connection.sAdd(seedKeyBytes,coupenKeyBytes);
            }
            connection.setNX(coupenKeyBytes,valueBytes);
//            connection.exec();
//            connection.unwatch();
            return null;
        }
    }
}