商城系统优化

1、DB、模板的渲染速度(thymeleaf)、静态资源、日志、JVM

数据库的优化(参照数据库优化课程)使用索引,减少数据库的交互次数、缓存

thymeleaf使用缓存

静态资源:放到nginx中,实现动静分离

2、上面三个中,主要是使用合理的数据库查询语句,减少数据库查询次数,然后使用缓存

3、使用缓存,出现堆外内存溢出:OutOfDirectMemoryError

(1)SpringBoot2.0以后默认使用lettuce作为操作redis的客户端,它使用netty进行网络通信。

(2)lettuce的bug导致netty堆外内存溢出 -Xmx300m;netty如果没有指定堆外内存,默认使用-Xmx300m

(3)解决方案:不能使用-Dio.netty.maxDirectMemory只能调大堆外内存。

第一种升级lettuce客户端,第二种切换使用jedis

5、三种分类优化进程

原来吞吐量为2/s, 使用索引、关日志、缓存渲染变为8,优化业务减少数据库查询次数变为111,使用缓存变为411

缓存问题及解决方案

缓存穿透:就是查到空值,也进行缓存,第二种就是使用布隆过滤器

缓存击穿:提前初始化数据,第二种,给数据加锁

缓存雪崩:设计随机的过期时间、二级缓存等

6、给数据加锁解决缓存击穿问题,给查询数据库的语句里面的代码块加锁,进去后再判断一下缓存里面有没有存在,然后就查询,查到后放入缓存中。

7、再微服务项目中,上面的锁方法只能锁住一个单体的,分布式需要使用分布式锁

redis中的setnx

问题:

但是,如果进入判断后,还没执行到过期时间语句就断电,那也会死锁,所以应该使用

但是如果执行业务时间过长,锁被自动删了,等业务执行完了,删除的锁可能是别的业务获取到锁后执行的,所以,还要加个判断

但还是可能会出现问题,因为需要跟redis通信,你获取到redis中的值后,执行判断后,如果恰好别的线程获取到了锁,还是会错删别人的锁(所以查询锁和判断锁应该是原子操作)

可以通过lua脚本解决删除

8、使用redission做分布式锁(getLock(),还有读写锁getReadWrite、信号量getSemaphore、闭锁getCountDownLatch())

相关推荐
lulu12165440785 分钟前
Claude Code Routines功能深度解析:24小时云端自动化开发指南
java·人工智能·python·ai编程
ch.ju7 分钟前
Java程序设计(第3版)第二章——关系运算符
java
Tirzano9 分钟前
springsession全能序列化方案
java·开发语言
我登哥MVP14 分钟前
【SpringMVC笔记】 - 2 - @RequestMapping
java·spring boot·spring·servlet·tomcat·intellij-idea·springmvc
殷紫川19 分钟前
深度剖析:Java 并发三大量难题 —— 死锁、活锁、饥饿全解
java
云烟成雨TD27 分钟前
Spring AI Alibaba 1.x 系列【14】ReactAgent 工具执行异常处理
java·人工智能·spring
凯尔萨厮31 分钟前
创建Web多模块项目(Maven管理)
java·maven
香香甜甜的辣椒炒肉39 分钟前
Spring JDBC 万能模板
java·后端·spring
liaowenxiong41 分钟前
实现类和接口的关系
java
编程迪44 分钟前
基于Java和uniapp开发的名片交换分享系统企业名片管理软件个人电子名片小程序源码
java·uni-app·电子名片·名片小程序·名片软件源码