zoukankan      html  css  js  c++  java
  • 深入理解缓存之缓存预热与淘汰策略

    GitHub:https://github.com/JDawnF

    一、缓存预热

    在刚启动的缓存系统中,如果缓存中没有任何数据,如果依靠用户请求的方式重建缓存数据,那么对数据库的压力非常大,而且系统的性能开销也是巨大的。

    此时,最好的策略是启动时就把热点数据加载好。这样,用户请求时,直接读取的就是缓存的数据,而无需去读取 DB 重建缓存数据。

    举个例子,热门的或者推荐的商品,需要提前预热到缓存中。

    一般来说,有如下几种方式来实现:

    1. 数据量不大时,项目启动时,自动进行初始化。

    2. 写个修复数据脚本,手动执行该脚本。

    3. 写个管理界面,可以手动点击,预热对应的数据到缓存中。

    二、缓存数据的淘汰策略

    除了缓存服务器自带的缓存自动失效策略之外,我们还可以根据具体的业务需求进行自定义的“手动”缓存淘汰,常见的策略有两种:

    • 1、定时去清理过期的缓存。

    • 2、当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。

    两者各有优劣,第一种的缺点是维护大量缓存的 key 是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!

    三、缓存如何存储 POJO 对象

    实际场景下,缓存值可能是一个 POJO 对象,就需要考虑如何 POJO 对象存储的问题。目前有两种方式:

    • 方案一,将 POJO 对象序列化进行存储,适合 Redis 和 Memcached 。

      当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。

      Spring Data JPA为我们提供了下面的Serializer:GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。

      序列化方式对比:

      JdkSerializationRedisSerializer: 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class),但缺点是需要实现Serializable接口,还有序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。

      Jackson2JsonRedisSerializer: 使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。

    • 方案二,使用 Hash 数据结构,适合 Redis 。

    参照:芋道源码

  • 相关阅读:
    安装DCOS,关于docker异常引发的调查
    搭建DNS服务器-bind
    DNSmasq
    桥接以及Mercury MW54R中继
    docker异常处理
    vmware的双网卡以及Pro的注册码
    ssh免密登录
    系统原生文件MD5值获取
    mysql数据库要按当天、昨天、前七日、近三十天、季度、年查询
    dirname(__FILE__) 介绍
  • 原文地址:https://www.cnblogs.com/baichendongyang/p/13235428.html
Copyright © 2011-2022 走看看