package com.yeshi.fanli.util; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Component; import org.yeshi.utils.JsonUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.yeshi.fanli.dto.pdd.PDDGoodsDetail; import com.yeshi.fanli.entity.common.ImageInfo; import com.yeshi.fanli.entity.jd.JDGoods; import com.yeshi.fanli.entity.taobao.PidUser; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.TaoBaoShopInfo; import com.yeshi.fanli.entity.taobao.TaoBaoUnionConfig; import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.config.ConfigService; import com.yeshi.fanli.service.inter.taobao.TaoBaoShopService; import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService; import com.yeshi.fanli.util.jd.JDApiUtil; import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil; import com.yeshi.fanli.util.taobao.TaoBaoCouponUtil; import com.yeshi.fanli.util.taobao.TaoBaoUtil; import com.yeshi.fanli.util.taobao.TaoKeApiUtil; import net.sf.json.JSONArray; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.params.SetParams; //抢红包采用的redis @Component public class RedisManager { @Resource private JedisPool jedisPool; @Resource private TaoBaoShopService taoBaoShopService; @Resource private TaoBaoUnionConfigService taoBaoUnionConfigService; @Resource private ConfigService configService; /** * 缓存字符串 * * @param key * @param value */ private void setString(String key, String value) { Jedis jedis = jedisPool.getResource(); SetParams params=new SetParams().nx().ex(60); jedis.set(key, value, params); try { jedis.set(key, value); } finally { jedis.close(); } } /** * 删除某个键值 * * @param key * @param value */ private void removeKey(String key) { Jedis jedis = jedisPool.getResource(); try { jedis.del(key); } finally { jedis.close(); } } /** * 缓存字符串 * * @param key * @param value * @param seconds * -缓存时间(s) */ private void setString(String key, String value, int seconds) { Jedis jedis = jedisPool.getResource(); try { jedis.setex(key, seconds, value); } finally { jedis.close(); } } private String getString(String key) { Jedis jedis = jedisPool.getResource(); try { return jedis.get(key); } finally { jedis.close(); } } public void increase(String key) { Jedis jedis = jedisPool.getResource(); try { jedis.incr(key); } finally { jedis.close(); } } public void expire(String key, int seconds) { Jedis jedis = jedisPool.getResource(); try { jedis.expire(key, seconds); } finally { jedis.close(); } } public void cacheCommonString(String key, String value, int seconds) { setString(key, value, seconds); } public void cacheCommonString(String key, String value) { setString(key, value); } public String getCommonString(String key) { return getString(key); } public void removeCommonString(String key) { removeKey(key); } /** * 临时存储淘宝的商品详情 * * @param goods */ public void saveTaoBaoGoodsBriefTemp(TaoBaoGoodsBrief goods) { if (goods == null) return; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoGoodsTemp, goods.getAuctionId() + ""); if (Constant.IS_OUTNET) { // 暂存4个小时的分享 cacheCommonString(key, JsonUtil.getSimpleGson().toJson(goods), 60 * 60 * 4); } } public TaoBaoGoodsBrief getTaoBaoGoodsTemp(Long auctionId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoGoodsTemp, auctionId + ""); String value = getCommonString(key); if (!StringUtil.isNullOrEmpty(value)) { return JsonUtil.getSimpleGson().fromJson(value, TaoBaoGoodsBrief.class); } return null; } /** * 删除缓存 * * @param auctionId */ public void deleteTaoBaoGoodsBrief(Long auctionId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoGoods, auctionId + ""); if (Constant.IS_OUTNET) removeKey(key); } public TaoBaoGoodsBrief getTaoBaoGoodsBrief(long auctionId) throws TaobaoGoodsDownException { long startTime = System.currentTimeMillis(); String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoGoods, auctionId + ""); String value = ""; if (Constant.IS_OUTNET) value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { TaoBaoGoodsBrief goods = null; goods = TaoKeApiUtil.searchGoodsDetail(auctionId); if (goods != null) // 缓存20分钟 if (Constant.IS_OUTNET) cacheCommonString(key, JsonUtil.getSimpleGson().toJson(goods), 60 * 20); LogHelper.test(auctionId + "-获取商品详情耗时:" + (System.currentTimeMillis() - startTime)); return goods; } else {// 直接取缓存 return JsonUtil.getSimpleGson().fromJson(value, TaoBaoGoodsBrief.class); } } public List getTaoBaoGoodsDetailImgs(long auctionId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoGoodsDetailimgs, auctionId + ""); String value = ""; if (Constant.IS_OUTNET) value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { List list = null; try { list = TaoBaoUtil.getTBDetailImageWithSizev2(auctionId, configService.getTaoBaoProxyIP()); } catch (Exception e) { e.printStackTrace(); } if (list == null || list.size() == 0) { list = TaoBaoUtil.getTBDetailImageWithSize(auctionId); } if (list != null && list.size() > 0) // 缓存1天 if (Constant.IS_OUTNET) cacheCommonString(key, JsonUtil.getSimpleGson().toJson(list), 60 * 60 * 24); return list; } else {// 直接取缓存 List imgList = new Gson().fromJson(value, new TypeToken>() { }.getType()); return imgList; } } public String getXCXCouponToken(TaoBaoGoodsBrief tb) { List configList = taoBaoUnionConfigService.getConfigByTypeCache(PidUser.TYPE_FANLI_ANDROID); String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoCoupleXCX, tb.getAuctionId() + ""); String value = ""; if (Constant.IS_OUTNET) value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { value = TaoKeApiUtil.getTKToken(tb.getPictUrl(), tb.getTitle(), TaoBaoCouponUtil .getCoupleUrl(tb.getCouponActivityId(), configList.get(0).getDefaultPid(), tb.getAuctionId() + "")); if (value != null) // 缓存20分钟 if (Constant.IS_OUTNET) cacheCommonString(key, value, 60 * 20); return value; } else {// 直接取缓存 return value; } } /** * IP访问频率限制 适用于 小程序,H5,WEB 同一IP,5s内限制请求100次 * * @param ip */ public boolean ipFrequencyLimit(String ip, String apiName) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey, ip + "-" + StringUtil.Md5(apiName)); Jedis jedis = jedisPool.getResource(); try { long count = jedis.incr(key); if (count == 1) jedis.expire(key, 5); if (count >= 10) return true; else return false; } finally { jedis.close(); } } public boolean frequencyLimit(String key, int timeS, int num) { key = RedisKeyEnum.getRedisKey(RedisKeyEnum.frequencyLimit, key); Jedis jedis = jedisPool.getResource(); try { long count = jedis.incr(key); if (count == 1) jedis.expire(key, timeS); if (count >= num) return true; else return false; } finally { jedis.close(); } } /** * 获取淘宝图片 * * @param auctionId * @return */ public List getTBImg(Long auctionId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoImgs, auctionId + ""); String value = ""; if (Constant.IS_OUTNET) value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { List list = TaoBaoUtil.getTbImg(auctionId + ""); if (Constant.IS_OUTNET && list != null && list.size() > 0) { value = new Gson().toJson(list); cacheCommonString(key, value, 60 * 60 * 2); } return list; } else { JSONArray array = JSONArray.fromObject(value); List list = new ArrayList<>(); for (int i = 0; i < array.size(); i++) { list.add(array.getString(i)); } return list; } } /** * 获取淘宝店铺信息 * * @param shopTitle * @param sellerId * @return */ public TaoBaoShopInfo getTBShopInfo(String shopTitle, Long sellerId, Long auctionId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoShop, sellerId +""); String value = ""; if (Constant.IS_OUTNET) value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief(); goods.setShopTitle(shopTitle); goods.setSellerId(sellerId); goods.setAuctionId(auctionId); TaoBaoShopInfo info = taoBaoShopService.getTaoBaoShopInfo(goods); if (info != null) { String shopUrl = info.getShopUrl(); if (shopUrl != null && shopUrl.contains("tmall://page.tm/shop")) { shopUrl = "http://store.taobao.com/shop/view_shop.htm?user_number_id=" + sellerId; info.setShopUrl(shopUrl); } } if (Constant.IS_OUTNET && info != null) { value = new Gson().toJson(info); cacheCommonString(key, value, 60 * 60 * 2); } return info; } else { TaoBaoShopInfo info = new Gson().fromJson(value, TaoBaoShopInfo.class); String shopUrl = info.getShopUrl(); if (shopUrl != null && shopUrl.contains("tmall://page.tm/shop")) { shopUrl = "http://store.taobao.com/shop/view_shop.htm?user_number_id=" + sellerId; info.setShopUrl(shopUrl); } return info; } } /** * 是否限制发送短信 * * @param phone * @param type * @return */ public boolean isSmsFrequencyLimit(String phone, int type) { if (!Constant.IS_OUTNET) return false; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMS, phone + "-" + type); String value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) return false; else return true; } /** * 设置短信60s倒计时 * * @param phone * @param type */ public void sendSms(String phone, int type) { if (!Constant.IS_OUTNET) return; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMS, phone + "-" + type); setString(key, "1", 10); } public void clearSMSFrequencyLimit(String phone, int type) { if (!Constant.IS_OUTNET) return; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMS, phone + "-" + type); removeKey(key); } /** * 保存验证码 * * @param phone * @param type * @param code */ public void saveSMSVCode(String phone, int type, String code) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSVCode, phone + "-" + type); // 保存2分钟 setString(key, code, 120); } /** * * @param phone * @param type * @return */ public String getSMSVCode(String phone, int type) { // if (!Constant.IS_OUTNET) // return ""; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSVCode, phone + "-" + type); // 保存2分钟 return getString(key); } /** * 清除掉验证码 * * @param phone * @param type * @param code */ public void clearSMSVCode(String phone, int type) { // if (!Constant.IS_OUTNET) // return; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSVCode, phone + "-" + type); removeKey(key); } /** * 保存绑定支付宝短信验证码的正确性 */ public void saveBindAlipayAccountSMSState(String phone) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSStateAlipay, phone + "" ); // 验证后十分钟有效 setString(key, "1", 10 * 60); } /** * 绑定支付宝发送的短信是否在有效期内 * * @param phone * @return */ public boolean isBindAlipayAccountSMSStateValid(String phone) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSStateAlipay, phone + "" ); return !StringUtil.isNullOrEmpty(getString(key)); } /** * 缓存短连接1分钟 * * @param uid * @param shortlink */ public void setInviteShortLink(long uid, String shortlink) { String value = ""; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.inviteShortLink, uid + "" ); if (Constant.IS_OUTNET) { value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { cacheCommonString(key, shortlink, 60); } } } /** * 获取用户短连接 * * @param uid * @return */ public String getInviteShortLink(long uid) { String value = ""; String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.inviteShortLink, uid + "" ); if (Constant.IS_OUTNET) value = getCommonString(key); return value; } /** * 保存淘口令 * * @param auctionId * @param token */ public void saveCommonTaoToken(Long auctionId, String token) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoTokenCommon, auctionId + "" ); if (Constant.IS_OUTNET) { if (!StringUtil.isNullOrEmpty(token)) { // 口令缓存10天 cacheCommonString(key, token, 60 * 60 * 24 * 10); } } } /** * 获取用户短连接 * * @param uid * @return */ public String getCommonTaoToken(Long auctionId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoTokenCommon, auctionId + "" ); if (Constant.IS_OUTNET) { return getCommonString(key); } return null; } /** * 保存淘礼金的口令 * * @param url * @param token */ public void saveTLJToken(String url, String token) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoTokenTLJ, StringUtil.Md5(url)); if (Constant.IS_OUTNET) { if (!StringUtil.isNullOrEmpty(token)) { // 口令缓存10天 cacheCommonString(key, token, 60 * 60 * 24 * 10); } } } /** * 获取淘礼金口令 * * @param url * @return */ public String getTLJToken(String url) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoTokenTLJ, StringUtil.Md5(url)); if (Constant.IS_OUTNET) { return getCommonString(key); } return null; } /** * 保存对象 * * @param T * @param key * @param seconds */ public void saveObj(Object clazz, String key, Integer seconds) { if (clazz == null) return; String value = new Gson().toJson(clazz); if (seconds != null) cacheCommonString(key, value, seconds); else cacheCommonString(key, value); } /** * 保存列表 * * @param clazzList * @param key * @param seconds */ public T saveObjList(List clazzList, String key, Integer seconds) { if (clazzList == null) return null; String value = new Gson().toJson(clazzList); if (seconds != null) cacheCommonString(key, value, seconds); else cacheCommonString(key, value); return null; } /** * 获取对象 * * @param clazz * @param key * @return */ public Class getObj(Class clazz, String key) { String value = getCommonString(key); return (Class) new Gson().fromJson(value, clazz); } /** * 获取列表 * * @param clazz * @param key * @return */ public List getObjList(Class clazz, String key) { String value = getCommonString(key); return JsonUtil.jsonToList(value, clazz); } public JDGoods getJDGoods(long goodsId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.jingDongGoods, goodsId +""); String value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { JDGoods jdGoods = JDApiUtil.queryGoodsDetail(goodsId); if (jdGoods == null) { jdGoods = JDApiUtil.getGoodsDetail(goodsId); } // 缓存20分钟 if (jdGoods != null) cacheCommonString(key, JsonUtil.getSimpleGson().toJson(jdGoods), 60 * 20); return jdGoods; } else {// 直接取缓存 return JsonUtil.getSimpleGson().fromJson(value, JDGoods.class); } } public PDDGoodsDetail getPDDGoodsDetail(long goodsId) { String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.pinDuoDuoGoods, goodsId +""); String value = getCommonString(key); if (StringUtil.isNullOrEmpty(value)) { PDDGoodsDetail pddGoods = PinDuoDuoApiUtil.getGoodsDetail(goodsId); // 缓存20分钟 if (pddGoods != null) cacheCommonString(key, JsonUtil.getSimpleGson().toJson(pddGoods), 60 * 20); return pddGoods; } else {// 直接取缓存 return JsonUtil.getSimpleGson().fromJson(value, PDDGoodsDetail.class); } } }