简单使用Redis处理热点数据
Redis配置
redis-config.xml
<redis-cluster name="redisCluster" clusterAddress="${redis.cluster.address}" timeout="3000" maxRedirections="6">
<properties>
<property name="maxTotal" value="20" />
<property name="maxIdle" value="20" />
<property name="minIdle" value="2" />
</properties>
</redis-cluster>
创建模板类
//用于操作redis
public interface JedisClusterTemplate extends BasicCommands, BinaryJedisClusterCommands, MultiKeyBinaryJedisClusterCommands, JedisClusterBinaryScriptingCommands, JedisCommands, MultiKeyJedisClusterCommands, JedisClusterScriptingCommands {
}
创建Service
@Service
public class RedisService {
private static final Logger logger = LoggerFactory.getLogger(RedisService.class);
@Resource
private JedisClusterTemplate jedisClusterTemplate;
//操作举例
public String set(String key, String value,Integer time) {
try {
/**
* 当 key 存在时,进行 set并覆盖旧值
*
* @param key 缓存键
* @param seconds 过期时间,单位为秒
* @param value 缓存键
* @return
*/
return jedisClusterTemplate.setex(key, time, value);
} catch (Exception e) {
logger.error("set Error", e);
}
return null;
}
/**
* 检查某个 key 是否在缓存中存在,如果存在返回true,否则返回false
* 需要注意的是,即使该 key 所对应的 value 是一个空字符串,也依然会返回 true
*
* @param lockKey 缓存键
* @return
*/
public boolean exists(String lockKey) {
return jedisClusterTemplate.exists(lockKey);
}
- 其他操作详见:https://blog.csdn.net/qq_35246620/article/details/105029412
创建Json工具类
public class CustomJsonUtil {
private static Logger logger = Logger.getLogger(CustomJsonUtil.class);
private static final ObjectMapper MAPPER;
private static final Gson GSON;
static {
MAPPER = new ObjectMapper();
//将对象序列化为json字符串时 属性为 null 或者 为 空("")都不参与序列化
MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
MAPPER.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
//将json字符串 反序列化时,遇到未知属性(没有映射的属性)不抛JsonMappingException,会忽略这个属性的解析
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
GSON = new Gson();
}
public static ObjectMapper getObjectMapper() {
return MAPPER;
}
//最简单的常用方法,直接将一个json转换成实体类
public static <T> T readValue(String value, Class<T> clazz) {
try {
return MAPPER.readValue(value, clazz);
} catch (IOException e) {
logger.error(String.format("Convert value: %s to class: %s failed: %s", value, clazz.getName(), e.getMessage()), e);
}
return null;
}
//把Json转换成map,必须使用 TypeReference , map的类型定义 可以根据实际情况来定,比如若值都是String那么就可以 Map<String, String>
//list<Bean>模式,必须用 TypeReference
//Bean[] 数组,必须用 TypeReference
public static <T> T readValue(String value, TypeReference<T> type) {
try {
return MAPPER.readValue(value, type);
} catch (IOException e) {
logger.error(String.format("Convert value: %s to class: %s failed: %s", value, type.getType(), e.getMessage()), e);
}
return null;
}
使用Redis缓存热点数据
private T <T> run(EXT1,EXT2....) {
//检查key是否在缓存中存在
if (redisService.exists(key) {
String object = redisService.get(key);
return CustomJsonUtil.readValue(object, /*返回实例*/.class);
}
/*···········方法体·········*/
//检查key是否不存在于缓存中
if (!redisService.exists(key)) {
//将数据写入
redisService.assetCatalogSet(key, JSON.toJSONString(/*数据实例*/), 3600);
}
return xxxx;
}