简单使用Redis处理热点数据

本文介绍了如何通过配置Redis Cluster,创建JedisClusterTemplate和RedisService,实现简单热点数据的缓存操作。重点讲解了set和exists方法的应用,以及如何利用CustomJsonUtil处理JSON数据。适合对Redis在高并发场景下缓存优化感兴趣的开发者。
摘要由CSDN通过智能技术生成

简单使用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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值