IT袋

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

多级缓存设计和实战应用

多级缓存设计和实战应用 多层次缓存设计和实际应用(4)

时间:2024-01-27 21:00:21 来源: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 ,均正常保存。代表缓存预热已实现。

相关阅读

  • 编写一个简单的网页结构 网页设计作业html成品

    编写一个简单的网页结构 网页设计作业html成品

    小编为网友们解答编写一个简单的网页结构和网页设计作业html成品方面的介绍,具体详情如下: HTML(HyperText Markup Language)是一种简单、通用的超文本标记语言,Web服务器返回给客户端的最常

  • access数据库的对象是什么 了解access数据库的结构层次

    access数据库的对象是什么 了解access数据库的结构层次

    下面为网友们详细介绍access数据库的对象是什么和了解access数据库的结构层次方面的内容,接下来分享详细内容。 说到数据处理,大家首先想到的是Excel,其实,Office中的数据处理软件除了E

  • web服务器怎么配置 免费个人web服务器推荐

    web服务器怎么配置 免费个人web服务器推荐

    对于许多网友来说web服务器怎么配置和免费个人web服务器推荐方面的内容,具体详情如下: 回想一下一个http请求的过程,你在浏览器输入xxx.com,经过域名解析 发起tcp的3次握手 建立tcp连接后

  • 信息加密、解密与常用算法的基本概念和相关知识

    信息加密、解密与常用算法的基本概念和相关知识

    本文为您带来的是信息加密、解密与常用算法的基本概念和相关知识的话题,请看下面详细的介绍。 一、信息加密概念 信息加密技术是对信息进行伪装,使得信息非法窃取者无法理解信息的真