package com.hugnew.sps.services.impls;
import com.alibaba.fastjson.JSON;
import com.hugnew.core.common.exception.BusinessException;
import com.hugnew.core.common.exception.SystemException;
import com.hugnew.core.util.StringUtil;
import com.hugnew.sps.dao.domain.BaseDomain;
import com.hugnew.sps.dto.DDDetails;
import com.hugnew.sps.services.ICacheService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 缓存业务
* Created by Martin on 2016/7/01.
*/
@Service
public class CacheService implements ICacheService {
private static Logger logger = LoggerFactory.getLogger(CacheService.class);
@Autowired
private RedisTemplate redisTemplate;
@Override
public <T> T getCacheByKey(String key, Class<T> clazz) {
ValueOperations valueOper = redisTemplate.opsForValue();
return JSON.parseObject((String) valueOper.get(key), clazz);
}
@Override
public <T> List<T> getListCacheByKey(String key, Class<T> clazz) {
ValueOperations valueOper = redisTemplate.opsForValue();
return JSON.parseArray((String) valueOper.get(key), clazz);
}
@Override
public <T> void setCacheByKey(String key, T obj) {
ValueOperations valueOper = redisTemplate.opsForValue();
valueOper.set(key, JSON.toJSONString(obj));
}
@Override
public List<DDDetails> getDictEntriesByKey(String dictKey) {
HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash();
Map<Object, Object> entries = opsForHash.entries(dictKey);
List<DDDetails> ddDetailsList = new ArrayList<>();
for (Map.Entry<Object, Object> entry : entries.entrySet()) {
DDDetails ddDetails = new DDDetails();
ddDetails.setId(entry.getKey().toString());
ddDetails.setName((String) entry.getValue());
ddDetailsList.add(ddDetails);
}
return ddDetailsList;
}
@Override
public Map<String, String> getDictMapByKey(String dictKey) {
HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();
return opsForHash.entries(dictKey);
}
@Override
public String getDictEntryByKey(String dictKey, Object entryKey) {
HashOperations<String, String, Object> opsForHash = redisTemplate.opsForHash();
String entryVal = (String) opsForHash.get(dictKey, entryKey.toString());
return entryVal;
}
@Override
public <T> void setToHashTable(String tableName, String key, T value) {
HashOperations<String, String, T> hashOperations = redisTemplate.opsForHash();
hashOperations.put(tableName, key, value);
}
@Override
public <T> T getFromHashTable(String tableName, String key) throws SystemException {
HashOperations<String, String, T> hashOperations = redisTemplate.opsForHash();
return hashOperations.get(tableName, key);
}
@Override
public <T> Set<String> getAllKeysFromHashTable(String tableName) {
HashOperations<String, String, T> hashOperations = redisTemplate.opsForHash();
return hashOperations.keys(tableName);
}
@Override
public <T> void setToHashTableUseJson(String tableName, String key, T value) {
HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();
hashOperations.put(tableName, key, JSON.toJSONString(value));
}
@Override
public <T> T getObjectFromHashTableUseJson(String tableName, String key, Class<T> clazz) throws SystemException {
HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();
String obj = hashOperations.get(tableName, key);
if (obj != null) {
return JSON.parseObject(obj, clazz);
} else {
return null;
}
}
@Override
public <T> List<T> getListFromHashTableUseJson(String tableName, String key, Class<T> clazz) throws SystemException {
HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();
String obj = hashOperations.get(tableName, key);
if (obj != null) {
return JSON.parseArray(obj, clazz);
} else {
return null;
}
}
@Override
public <T> List<T> getListFromHashTableUseJson(String tableName, List<String> keys, Class<T> clazz) throws SystemException {
HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();
List<T> result = null;
List<String> objList = hashOperations.multiGet(tableName, keys);
if (objList != null && !objList.isEmpty()) {
result = new ArrayList<>();
for (String s : objList) {
result.add(JSON.parseObject(s, clazz));
}
}
return result;
}
@Override
public <T> List<T> getFromHashTable(String tableName, List<String> keys) throws SystemException {
HashOperations<String, String, T> hashOperations = redisTemplate.opsForHash();
return hashOperations.multiGet(tableName, keys);
}
@Override
public void removeFromHashTable(String tableName, String... keys) {
HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash();
hashOperations.delete(tableName, keys);
}
@Override
public boolean keyExistInHashTable(String tableName, String key) {
HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash();
return hashOperations.hasKey(tableName, key);
}
@Override
public void delKeyFromRedis(String key) {
if (StringUtil.isEmpty(key)) {
throw new BusinessException("参数不能为空");
}
redisTemplate.delete(key);
}
}