简单使用Redis处理热点数据

简单使用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
    //list模式,必须用 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;
    }

你可能感兴趣的:(Redis,java)