IT袋

当前位置:主页 > 经验教程 > 建站编程 >

多级缓存设计和实战应用

多级缓存设计和实战应用 多级缓存的设计与应用(4)

时间:2024-01-27 18:00:34 来源:IT袋 作者:马勇
导读:多级缓存设计和实战应用,4.2. 访问:http://localhost:8081/item/10002,返回正确结果 4.3. 查看控制台SQL打印情况,显然第一次访问查询了数据库 23:25:33:162 DEBUG 20032 --- [nio-8081-exec-1] c.asdc.

多级缓存设计和实战应用

多级缓存设计和实战应用

4.2. 访问:http://localhost:8081/item/10002,返回正确结果

多级缓存设计和实战应用

4.3. 查看控制台SQL打印情况,显然第一次访问查询了数据库

23:25:33:162 DEBUG 20032 --- [nio-8081-exec-1] c.asdc.item.mapper.ItemMapper.selectOne  : ==>  Preparing: SELECT id,name,title,price,image,category,brand,spec,status,create_time,update_time FROM tb_item WHERE (status <> ? AND id = ?)
23:25:33:163 DEBUG 20032 --- [nio-8081-exec-1] c.asdc.item.mapper.ItemMapper.selectOne  : ==> Parameters: 2(Integer), 10002(Long)
23:25:33:171 DEBUG 20032 --- [nio-8081-exec-1] c.asdc.item.mapper.ItemMapper.selectOne  : <==      Total: 1
从数据库中获取数据:{"id":10002,"name":"脱脂牛奶","title":"安佳脱脂牛奶 新西兰进口轻欣脱脂250ml*24整箱装*2","price":68600,"image":"https://m.360buyimg.com/mobilecms/s720x720_jfs/t25552/261/1180671662/383855/33da8faa/5b8cf792Neda8550c.jpg!q70.jpg.webp","category":"牛奶","brand":"安佳","spec":"{\"数量\": 24}","status":1,"createTime":1706198400000,"updateTime":1706198400000,"stock":null,"sold":null}

4.4. 查看当前redis库db1中数据

多级缓存设计和实战应用

4.5. 再次访问:http://localhost:8081/item/10002,控制台打印:

从Redis缓存中获取数据:{"id":10002,"name":"脱脂牛奶","title":"安佳脱脂牛奶 新西兰进口轻欣脱脂250ml*24整箱装*2","price":68600,"image":"https://m.360buyimg.com/mobilecms/s720x720_jfs/t25552/261/1180671662/383855/33da8faa/5b8cf792Neda8550c.jpg!q70.jpg.webp","category":"牛奶","brand":"安佳","spec":"{\"数量\": 24}","status":1,"createTime":1706198400000,"updateTime":1706198400000,"stock":null,"sold":null}

显然,本次查询走redis缓存,验证通过。这也印证了上边的流程。

缓存预热怎么做?

通常,Redis缓存会面临冷启动问题:

冷启动:服务刚刚启动时,Redis中并没有缓存,如果所有业务数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。

缓存预热:在实际开发中,为避免上述问题,我们一般会利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。这个过程成为缓存预热。

方案一、在项目启动时初始化Bean时候完成

这里我们利用InitializingBean接口来实现,因为InitializingBean可以在对象被Spring创建并且成员变量全部注入后执行。

这里我们是测试数据(模拟热点数据),全量加载到redis中。

程序实现:

@Component
public class RedisHandler implements InitializingBean {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private IItemService itemService;
    //JSON 转化
    private static final ObjectMapper MAPPER = new ObjectMapper();
    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化缓存
        // 1.从数据库获取热点数据
        List<Item> itemList = itemService.list();
        // 2.放入缓存
        for (Item item : itemList) {
            // item序列化为JSON
            String json = MAPPER.writeValueAsString(item);
            // 存入redis
            redisTemplate.opsForValue().set("item:id:" + item.getId(), json);
        }
    }
}

启动并测试:

23:42:08:477 DEBUG 13200 --- [           main] c.a.item.mapper.ItemMapper.selectList    : ==>  Preparing: SELECT id,name,title,price,image,category,brand,spec,status,create_time,update_time FROM tb_item
23:42:08:507 DEBUG 13200 --- [           main] c.a.item.mapper.ItemMapper.selectList    : ==> Parameters: 
23:42:08:534 DEBUG 13200 --- [           main] c.a.item.mapper.ItemMapper.selectList    : <==      Total: 5

查看redis中,key:item:10001~10005 ,均正常保存。代表缓存预热已实现。

相关阅读

  • 服务器优化的重要性 服务器优化方法

    服务器优化的重要性 服务器优化方法

    如果想了解服务器优化的重要性的IT小经验,一定能解决您的问题的,一起来了解吧! 服务器优化是指通过对服务器硬件、软件和网络进行调整和优化,以提高服务器的性能和稳定性,从而提

  • 怎么创建网络平台账号 创建网站免费注册

    怎么创建网络平台账号 创建网站免费注册

    关于这个怎么创建网络平台账号和创建网站免费注册方面的知识,具体详情如下: 在当下,传统的线下营销渠道已经无法满足消费者的多样化需求,所以很多企业商家都会选择搭建一个网站平

  • 创建一个网站要多少钱 自己做一个网站需要的费用

    创建一个网站要多少钱 自己做一个网站需要的费用

    对于大多数网友来说创建一个网站要多少钱和自己做一个网站需要的费用的方法内容,继续往下看吧! 想搞一个网站,我们先了解一下搞个网站需要多少钱?网站建设费用主要包括:网站搭建

  • OSI七层网络模型传输层详解 传输层使用的协议有哪些

    OSI七层网络模型传输层详解 传输层使用的协议有哪些

    今日重点为您介绍OSI七层网络模型传输层详解的IT知识,接下来小编为网友介绍。 传输层是OSI七层网络模型中的第四层,主要负责为应用层提供端到端的数据传输服务,同时也可以对网络层提