- 博客(55)
- 收藏
- 关注
原创 点评项目-13-附近商铺、用户签到、UV统计
通过 Redis 的 GEO 功能完成地理位置的相关操作以下是北京几个地区的经纬度:北京站:116.42803 39.903738北京南站:116.378248 39.865275北京西站:116.322287 39.893729在 redis 中添加一个位置的命令查询两个点之间的距离查看某个地点附近的商铺。
2024-10-31 12:05:40 1129
原创 点评项目-10- redis 消息队列完成异步秒杀
基于异步判断库存和一人一单,改进秒杀业务,提高并发性能需求:1.新增秒杀优惠卷的同时,将优惠卷信息保存到 Redis 中2.基于 Lua 脚本,判断秒杀库存,一人一单,决定用户是否抢购成功3.如果抢购成功,将优惠卷 id 和用户 id 封装后存入阻塞队列4.开启线程任务,不断从阻塞队列中获取信息,实现异步下单功能。
2024-10-21 21:15:01 208
原创 点评项目-9-秒杀业务(加锁)、redis分布式锁
悲观锁:在加锁时,我们将锁加在含有事物提交的方法上,对于方法的调用,会出现没有被 spirng 管理导致事物无法提交的情况,我们需要拿到其 sping 代理对象来调用含有事物提交的方法(需要添加 aspectjweaver 依赖,并在启动类添加 @EnableAspectJAutoProxy(exposeProxy = true) 注解)在释放锁时,我们需要判断要释放的锁和当前线程的锁是否一致,一致才释放,若不一致则直接让本该释放的锁通过 ttl 延迟释放。在存入锁时,我们使用 UUID 生成 Key。
2024-10-17 21:42:11 832
原创 idea 启动时,报错 Start Failed
通过第二行冒号之后的内容,我们可以推测出事因为 Lua 插件的原因导致无法启动。重新安装idea,解决。尝试禁用该插件,失败。
2024-10-17 11:09:44 307
原创 点评项目-8-全局ID生成器、秒杀优惠卷
2.新增秒杀优惠卷,将其对应的普通卷拿到后,封装成秒杀卷,再将其存入数据库,并且将其库存存入 redis 缓存,请求路径:/voucher/seckill。"rules": "全场通用\\n无需预约\\n可无限叠加\\不兑现、不找零\\n仅限堂食","rules": "全场通用\\n无需预约\\n可无限叠加\\不兑现、不找零\\n仅限堂食","rules": "全场通用\\n无需预约\\n可无限叠加\\不兑现、不找零\\n仅限堂食",1.新增普通优惠卷,直接将其存入数据库即可,请求路径:/voucher。
2024-10-14 11:47:27 956
原创 点评项目-7-缓存击穿的两种解决方案、缓存工具类的编写
在高并发访问的访问中,对于复杂业务 key 的缓存,可能会在缓存生效前打入大量的请求,导致大量的请求打到数据库解决方案:1.互斥锁,给缓存的构建过程加上一个锁,当拿到锁时才进行下一步,锁被占用则睡眠一段时间后再拿锁2.逻辑过期,给缓存加上一个逻辑过期时间,但是在 redis 中过期的数据不会被真正删除,在查询时,如果 key 在逻辑上过期了,则开启一个锁,并把更新 key 的任务交给另一个线程,然后先直接返回旧数据;若某个遇到锁被占用无需等待,直接返回旧数据。
2024-10-14 11:47:12 668
原创 点评项目-6-缓存更新策略、缓存穿透、雪崩
使用 redis 缓存记录的信息,有可能在数据库被信息被修改导致信息不一致,使用缓存更新来解决这个问题缓存更新策略主要有三种:1.内存淘汰(redis默认开启)2.超时剔除(给key添加TTL时间)3.主动更新(编写业务逻辑)主动更新策略:在数据库更新时删除缓存,通过事物保证数据库的更新和缓存的删除同时成功或失败。对于数据库的更新和缓存的删除的执行顺序:先删后更,在多线程下在数据库完成更新前可能会被另一个线程查询,导致数据不一致;
2024-10-11 17:17:28 672
原创 点评项目-5-商户查询缓存,从 2s 优化到 12ms
业务需求:当前端发送 shop/id 的请求时,我们需要向前端响应对应 id 的详细数据给前端直接查询 mysql 效率比较低,我们可以使用 redis 作为中间件进行数据的缓存,先查询 redis ,若redis 中未查询到,则在 mysql 中查询,并在查询后写入 redis 中。
2024-10-09 12:23:46 303
原创 点评项目-4-隐藏敏感信息、使用 redis 优化登录业务
对于登录信息,我们可以使用哈希结构存储不同的信息,使用随机 token 生成随机且唯一的 key,在响应时,将 token 返回给浏览器,在之后需要用到 token 的请求,需要在请求中发送 token。之前我们对 /user/me 路径,直接返回了登录的所有用户信息,其中的 passward 等敏感信息也会被返回到前端,这是很危险的,故我们需要选择性的返回用户信息,隐藏敏感用户信息。再使用第二级拦截器判断用户是否登录,登录的用户一定会存在于线程池,我们可以通过此来判断用户是否登录。
2024-10-09 10:17:38 1325
原创 java多线程-1-测试一个多线程程序
多线程:在等待线程的时间,处理其他线程,提高计算机处理效率以减小资源的占用。线程:操作系统能够进行运算调度的最小单位,包含在进程之中。进程:程序的基本执行实体。测试线程1: 花下的晚风。测试线程1: 花下的晚风。测试线程1: 花下的晚风。测试线程1: 花下的晚风。测试线程2: 花下的晚风。测试线程2: 花下的晚风。测试线程1: 花下的晚风。测试线程2: 花下的晚风。测试线程2: 花下的晚风。测试线程1: 花下的晚风。测试线程1: 花下的晚风。测试线程1: 花下的晚风。测试线程2: 花下的晚风。
2024-10-01 22:18:11 647
原创 点评项目-3-登录成功后加载登录页面
业务:在登录成功后,前端会发送/api/user/me 的 get 请求,我们需要将 session 中的 user 返回给页面,由于后续会有多个业务需要用到登录状态的校验,故这里使用拦截器完成登录状态校验功能。
2024-09-29 20:51:12 311
原创 点评项目-2-完善注册登录业务
需要处理的业务:在网页发送 /user/code 路径下的 post 请求后,我们需要检验手机号后,向合法的手机号发送一个随机生成的电话号。
2024-09-29 08:44:52 623
原创 点评项目-1-连接数据库,部署依赖
先创建持久层的 UserMapper 继承 mybatis-plus 的方法。控制台输出了查询到的数据,则表示连接没有问题。tb_user 表的封装类 pojo。
2024-09-28 19:43:43 315
原创 spring boot 热部署
热部署的主要作用是在服务器运行的时候可以在不关闭服务器的情况下修改代码。然后我们在每次修改代码后按 ctrl + F9 即可将代码更新。首先,需要在 pom.xml 文件中引入热部署需要的依赖。先启动spring boot 的 main 方法。可以很大的提高开发效率。
2024-09-23 22:21:29 1331
原创 Vue实用操作-2-如何使用网页开发者工具
第五步,f12 查看是否含有 vue 这一个选项,如果有则可以成功使用 vue 插件。第四步,在极简插件你中找到 vue 对应插件,安装到扩展插件中。第二步,将 favicon.ico 文件加入到根目录下。第三步,选择以服务器方式运行,并打开浏览器。第一步,添加扩展,live服务器。
2024-09-13 17:45:45 398
原创 Vue实用操作篇-1-第一个 Vue 程序
安装 Vue 非常的简便,只需下载好 Vue 对应的 .js 文件,在 html 中引入 vue.js 即可使用 Vue下载好了 vue.js 我们便可以编写我们的第一个 vue 程序了在浏览器运行这个 html 文件对于第一个程序,我们需要知道以下几点基础知识。
2024-09-13 16:30:45 673
原创 springboot 整合 mybatis-plus
在依赖引入后,便成功引入了 mybatis-plus,我们可以继承 baseMapper,这个类实现了很多的常用的数据库操作方法,可以直接使用。在创建 springboot 模块时,依赖勾选时没有 mybaits-plus 选项,原因是其未被加入。所以必须要手动引入依赖。这个依赖便可以删除,因为第一个依赖包含了第二个。将这个依赖引入后,原本的。
2024-09-10 16:55:14 556
原创 springboot 整合 mybatis
勾选上后 spring boot 会自动生成对应的 dependence,若没有勾选,也可以在 pom.xml 文件中手动输入对应的 mabatis 整合依赖,以及 mysql Driver 依赖。检查后发现,是 yml 配置文件中的数据库信息错误。将 learnbase 写成了 learbase。
2024-09-10 16:25:39 457
原创 sping boot 基于 RESTful 风格,模拟增删改查操作
RESTful 资源路径,一般以 s 复数结尾。使用 postman 发送对应请求。根据id修改记录,当前id为:1。根据id删除记录,当前id为:1。
2024-09-07 22:24:59 480
原创 Springboot-第一个程序
springboot 的入门程序非常便捷,只需创建好一个 spring boot 的模块,便可以使用框架完成服务器的搭建。
2024-09-07 10:54:14 171
原创 SpringMVC - 第一个 SpringMVC 程序
MVC:的简写,表示层 属于 C + V,业务层和逻辑层属于 MSpringMVC 是对 web 使用的一套框架,可以更加快捷高效的管理 web应用所有的请求都会经过 DispatcherServlet 这一个 Servlet支持 IoC 和 AOP统一处理请求可以解析多种视图,如JSP,Freemarker。
2024-08-26 19:21:48 1027
原创 Spring 集成 MyBatis
为这张表准备一个 Pojo 类,并用注解的方式将其纳入 spring 容器进行管理。若引入失败可以手动下载好jar包粘贴到本地maven仓库的对应位置。业务层:数据库表的 Service 接口。持久层:数据库表的 Mapper 接口。Mapper 接口对应的 xml 文件。数据库表的 Service 实现类。再引入 spring6 的仓库。mybatis 核心配置文件。
2024-08-24 19:23:26 344
原创 Spring-2- AOP 切面编程
当我们需要对一个类中的方法进行功能的增强,又不想改变原方法的代码时当我们需要保护一个类中的代码时我们都可以使用代理模式,帮助这个类完成一些功能,这就是 AOP 切面编程核心:切面 = 通知 + 切点。
2024-08-23 23:06:36 1169
原创 Spring-1-注解管理依赖
可以将 Spring 其当做一个 容器 ,可以随意的存储对象。@Component@Service这四个是常用的注解,用于声明 Bean 的注解,可以在后面跟括号为起 value 属性传值,代表依赖注入的 id,若不设置,则默认为 类名首字母小写这四个注解本质都是同一个注解 @Component,只是名称不同,可以用于三层架构中不同的层写在需要注入依赖的类上上面是写在类上的注解接下来是写在属性或者方法上的注解。
2024-08-23 22:25:13 395
原创 MyBatis进阶-2-常用动态sql、常用注解
动态 sql 是对于 mapper.xml 中 sql 语句的动态管理,以标签的形式管理 sql 语句以下是常用的 动态sql 标签。
2024-08-22 15:15:32 794
原创 MyBatis进阶-1-面向接口编程
通过 MyBatis 底层自动创建接口实现类,我们可以直接对接口的方法进行编程若简单的 sql 语句可以使用注解的方式进行,复杂的查询建议使用 xml 文件编写语句注解使用时直接在接口的方法上加上对应语句的注解即可,而使用 xml 需要在文件中的标签引用到当前接口和里面的方法。
2024-08-22 14:54:27 1063
原创 MyBatis框架连接数据库-初级
MyBatis 的主要功能是帮助持久层管理数据库,接下来我们利用 MyBatis 连接一下我们的数据库,实现入门程序。
2024-08-18 00:58:39 337
原创 idea 遇到依赖引入失败问题
解决方案:下载较新版本的 maven,重新构建一个 maven 项目,再在新的项目中引入依赖,最后成功引入依赖。在引入 aspects 的相关依赖时,没有找到这个版本。第一次尝试,将远程仓库更换,还是无法引入依赖。
2024-08-15 12:40:48 313
原创 学会 idea 中 debug 的简单功能 (够用就行)
直接鼠标单击添加断点即可,程序会运行到断点处的前一行,每点击一次折线箭头就走一行(点击第一个蓝色的箭头)在每执行一步后,idea 中会自动显示代码执行后的信息,如变量赋值等信息。第三个红色按钮,进入java自带的API方法中。左侧绿色竖杠加三角按钮,直接将剩余代码全部执行。第二个蓝色按钮,进入下一个方法。第四个蓝色按钮,退出当前方法。第一个蓝色按钮,执行下一步。
2024-08-07 18:15:44 161
原创 图论进阶之路-最短路(Floyd)
4.若最后需要得到最短路路径:可以通过 先找到 路径矩阵的位置,得到前一个点,再找到该点与前一个点的前一个点,直到前一个点变成自身为止。1.初始化 D,P 矩阵,D 矩阵初始化为所有结点的入度距离,P 矩阵 初始化为所有结点的入度结点。准备:需要两个矩阵,一个记录最短距离(D),一个记录最短路径的最后一个结点(P)先找到 1 -> 0 的最近的前一个结点,也就是 P[1][0] = 2。继续往前找,1 -> 2 的前一个结点,也就是 P[1][2] = 1。如:我们要找到 v1 到 v0 的最短路径。
2024-08-03 00:35:44 811
原创 史上最强逻辑题-测试你是否具有超强逻辑推理能力
三神问题:现在你的面前有三个神,一个真神,他只能说真话;一个伪神,他只能说假话;一个任意神,他的话有真有假。现在你可以向三个神提出总共三个问题(可以选择任意神提问,一个神可以被提问多次),他们只会回答你 da 或 yu,你需要自行判断 da 或 yu 代表的含义为 是或否。你能否通过这三个问题推测出三个神的身份?
2024-07-15 18:51:04 539
原创 使用 HttpServlet 接收网页的 post/get 请求
>创建一个空的项目-> 新建一个空的模块-> 右键单击模块 选择 Add..Fra.. Sup..-> 勾选Web App...后点击OK-> 点击 file - Project Struc...-> 选择刚刚的模块 -> 点击 + (JAR Or...)引入 tomcat 的 lib 文件夹下的 servlet-api.jar 和 jsp-api.jar (也可以选择+(Library)将整个 tomcat 引入)->点击右上角 绿色小锤子右边的按钮。
2024-07-14 17:36:43 1443
原创 同时用到,网页,java程序,数据库的web小应用
具体实现功能:通过网页传输添加用户的请求,需要通过JDBC来向 MySql 添加一个用户数据。
2024-07-12 16:57:22 1300
原创 通过 tomcat 让手机访问到电脑写的 html 网页
通过 tomcat运行的文件,只要处于同一个局域网下,就可以被访问,不过我们需要将防火墙对 8080 这个端口设置允许外部访问,或直接把防火墙先暂时关闭。我们需要在在环境变量中配置 JAVA_HOME 和 CATALINA_HOME 两个变量,分别装入 jdk 和 tomcat 的路径。之前实现的 html 小项目只能在自己的电脑上展示,如果要在其他电脑或者在手机上就看不到网页了。要运行 tomcat ,我们必须要确保我们的环境变量中有 jdk。想要在手机上访问自己写的网页,我们可以借助 tomcat。
2024-07-10 01:10:22 934
原创 html + css + javaScript 趣味小项目
最近学习了前端三大件,写了一个小项目来巩固一下学到的知识,在这里分享给大家网页实现了登录页面和游戏页面。
2024-06-29 18:51:12 549
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人