多级缓存(nginx本地缓存、JVM进程缓存、redis缓存)

文章目录

整体示意图

1.nginx缓存

2.进程缓存

Caffeine示例

3.Lua语法(为了在nginx中做编程)


4.OpenResty

5.封装向Tomcat发送的Http请求,获取数据

封装完函数之后,我们对nginx.conf进行修改(请求进来之后会去寻找item.lua)

item.lua文件内容

上面的item.lua文件中需要进行拼接数据,我们需要JSON结果处理

6.Tomcat集群的负载均衡

在实际生产中tomcat是肯定以集群的方式存在

当我们修改nginx.conf发送请求为集群的时候,如下图

这个时候存在一个问题,集群的负载均衡算法是轮询,会导致tomcat进程缓存产生浪费,举个例子

  • 假如现在有两台Tomcat服务器,一台端口为8080,一台端口为8081
  • 进行访问,查询id为1的信息,第一次查询8080端口的tomcat服务器,此时8080端口的tomcat服务器上有id为1信息的缓存,但是当我们再次查询id为1的信息,因为轮询的机制,会查询8081端口的tomcat服务器,但是id为1的进程缓存在8080端口的tomcat服务器上,并且进程缓存在集群之间不会共享,这就导致会发生一种情况,有多少tomcat服务器,就会有多少份进程缓存,这对资源是一种极大的浪费

解决方法:更换负载均衡算法为 hash $request_uri

这种负载均衡算法是通过对id值进行hash运算然后进行对tomcat服务器数量取余来判断访问哪台tomcat服务器,这样就保证了同一个id访问同一个tomcat服务器

7.redis缓存

两个问题

缓存预热代码(逻辑代码根据自己的更换即可)

java 复制代码
public class CaffeineConfig implements InitializingBean {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private IItemService itemService;

    @Autowired
    private IItemStockService itemStockService;

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化缓存
        // 1.查询商品信息
        List<Item> itemList = itemService.list();
        // 2.放入缓存
        for (Item item : itemList) {
            // 2.1 item序列化为JSON
            String json = MAPPER.writeValueAsString(item);
            // 2.2 存入redis
            redisTemplate.opsForValue().set("item:id:" + item.getId(),json);
        }
        
        // 3.查询商品库存信息
        List<ItemStock> stockList = itemStockService.list();
        // 2.放入缓存
        for (ItemStock stock : stockList) {
            // 2.1 item序列化为JSON
            String json = MAPPER.writeValueAsString(stock);
            // 2.2 存入redis
            redisTemplate.opsForValue().set("item:stock:id:" + stock.getId(),json);
        }
    }
}

API简介

InitializingBean

  • 一定要实现其中的afterPropertiesSet()方法
  • 该方法会在创建Bean之后执行,也就是项目启动的时候执行,也就可以实现缓存预热效果了

ObjectMapper

  • spring自带的json序列化工具

8.查询Redis缓存

9.Nginx本地缓存

相关推荐
三品吉他手会点灯5 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
zh1570235 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
kobesdu5 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
sakiko_5 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
智者知已应修善业6 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
2401_871492856 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
zhoutongsheng8 小时前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python
智者知已应修善业8 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
JasmineX-18 小时前
数据结构(笔记)——双向链表
c语言·数据结构·笔记·链表
程序猿乐锅10 小时前
【Tilas|第三篇】多表SQL语句
数据库·经验分享·笔记·学习·mysql