当前位置: 代码网 > it编程>数据库>Redis > 关于多级缓存使用(nginx本地缓存、JVM进程缓存、redis缓存)

关于多级缓存使用(nginx本地缓存、JVM进程缓存、redis缓存)

2024年08月02日 Redis 我要评论
整体示意图1.nginx缓存2.进程缓存caffeine示例3.lua语法(为了在nginx中做编程)4.openresty5.封装向tomcat发送的http请求,获取数据封装完函数之后,我们对ng

整体示意图

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缓存

两个问题

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

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本地缓存

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com