- 博客(21)
- 收藏
- 关注
原创 【redis实战篇】第七天
(1)如果关注,将关注信息(当前用户和关注用户)存入数据库,并且存入redis的set集合中。(1)通过当前用户关注表的key和该用户关注用户列表的key求共同关注用户id。
2025-06-02 21:15:41
628
原创 【redis实战篇】第六天
如果再次出现异常,记录日志,休眠线程一段时间 ,重新开始循环。3,调用阻塞队列BlockingQueue<VoucherOrder>的数组实现并指定大小,将创建好的订单加入到阻塞队列,方法即可结束,大大提升性能。6,编写订单写入数据库的方法createVoucherOrder()并开启事务,这样保证锁的范围比事务范围大,避免出现事务未提交锁提前释放的问题。5,order传入上锁的方法handleVoucherOrder(),防止同一个用户的多个请求并发产生的问题,保证每个请求(线程)单独执行。
2025-05-29 22:08:59
898
原创 【redis实战篇】第五天
(1)如果自己指定锁释放时间,没有指定最大重试时间--新的释放时间就等于指定的释放时间:如果指定了最大重试时间,那么新的释放时间等于最大重试时间X2,因为集群部署,要重试获取多把锁花费时间较长,所以要求设置的释放时间不能太短,避免锁重试未到时间锁已经释放。(4)未获取到锁,只有当总的锁个数-获取到锁的个数=失败的上限0,才跳出循环;如果不需要重试且没有指定锁释放时间--执行普通的无参的获取锁的方法,如果需要重试或者指定了锁释放时间,有等待时间就选等待时间,没有取默认-1不重试,执行有参获取锁的方法。
2025-05-27 23:17:00
578
原创 【redis实战篇】第四天
(2)由于高并发场景,这里会有相当一部分线程更新失败,库存”卖不出去“,也是不正确的;限定一个用户只能购买一单,当用户购买时,通过用户id和代金卷id查询是否有订单数量,一旦数量大于0说明该用户已购买,返回错误信息。(1)将库存作为版本号,每次更新时都要将数据库当前库存和之前查询到的库存进行比对,如果不一致说明有线程已经修改过,所以更新失败。(3)成功创建订单对象,使用ID生成器生成唯一id作为订单id,填入用户id和代金卷id。,因为一人一卖,只需要锁对应的那个对象就行,不同的用户会加新的锁,但是因为。
2025-05-26 16:51:06
793
原创 【尚庭公寓|项目日记】第五天
该项目登录拦截使用的是Jwt令牌+token的方式来验证用户,token中存放了usrId和username信息,逻辑是每当有请求访问,取出请求头的token进行解析,如果解析中抛出异常就无法执行到最后的return而被拦截,解析成功就将token中的用户信息存入本地线程中,方便后续使用。开启定时任务,cron表达式中分别代表:秒,分 ,时 ,日 ,月 ,周(0-7),*表示每个对应时间段,如:每周每天.....其实也是对用户隐私的一种保障,通过mybatisplus自带的注解@TableField中的。
2025-05-24 11:31:52
414
原创 【redis实战篇】第三天
此外,缓存策略的优化,如热点操作逻辑的修改和缓存与数据库数据的同步,也是确保数据一致性和系统稳定性的重要手段。针对缓存穿透、缓存雪崩和缓存击穿等问题,文章提出了多种解决方案,包括缓存空值、布隆过滤器、互斥锁和逻辑过期等,以应对不同的缓存挑战,确保系统的高效运行。为了解决缓存与数据库数据不一致的问题,我们需要对数据库和缓存中的数据进行同步,在执行更新或者修改操作时要修改数据库和缓存。缓存穿透是指大量请求访问缓存中不存在的数据,导致这些请求直接访问数据库,从而给数据库带来巨大压力甚至崩溃。
2025-05-23 19:21:15
611
原创 【尚庭公寓|项目日记】第四天
文件上传接口通过Spring MVC的MultipartFile类简化操作,使用MinIO客户端进行文件存储,确保文件名唯一性,并返回文件的访问URL。此外,文章还简要提及了房间信息管理、预约看房管理以及后台管理系统的登录功能,包括验证码生成与验证、用户名和密码的校验等。转换为字符串类型传输到前端,验证码统一转换为小写,方便用户忽略大小写,这里的key表示存储到redis中的验证码的key,而不是真正的验证码。该模块的所有接口与公寓信息管理中的接口非常相似,完成的思路几乎没有区别,自行完成即可,唯一需要。
2025-05-20 16:08:05
752
原创 【redis实战篇】第二天
我们通过拦截器刷新redis用户信息来保证用户登录状态,但是拦截器是没有拦截所有路径的,这就会导致用户在访问未被拦截的功能,如:浏览点评等,达到过期时间也会自动登出。(1)检查手机号格式,其实就是使用正则表达式来进行匹配,如果这里一直出现手机号格式错误的问题,可以考虑更换正则表达式,网上随意搜索即可。,所以我们在原拦截器前再加一个拦截器,作用仅用于刷新用户token不执行拦截,原来的拦截器只需要检查本地线程是否有用户信息即可。(登录和访问都是大数量级的操作),另一方面解决了多台服务器部署时无法互通的问题,
2025-05-19 23:52:36
545
原创 【redis实战篇】第一天
点评项目默认的jdk(1.8)和springboot(2.x.x)版本较老,我这里就jdk21进行了更新,主要是springboot依赖,mybatisplus依赖。主要是完成点评项目的搭建,以及aplication.yaml文件的填写修改,主要包括数据库连接,redis连接配置。输入网址,然后点击开发者工具,将浏览器转换为手机模式。如果还是不清楚自己的版本问题可以参考。
2025-05-19 19:09:07
239
原创 【尚庭公寓|项目日记】第三天
(1)通常在实际开发场景中,都会通过全局异常处理器来处理各类异常,同时可以自定义你自己需要的异常,且在自定义异常中我们一般会接收一个状态枚举(包含code状态码和message错误信息)如果查询涉及到多表,一般采用手写sql来完成查询,观察查询返回类的字段:公寓基本信息(条件查询) + 房间总数 + 空闲房间数(房间总数-已签约房间数)主要记录了web-admin模块下与公寓有关的几个较难,且知识点较多的几个接口的实现,对这些接口的知识点进行了简单的介绍,巩固有关的知识体系。答案是匹配度高的优先执行。
2025-05-18 16:02:31
901
原创 【尚庭公寓|项目开发】第二天
模块中编写了配置类,包括Redis配置、MyBatis分页插件和字段自动填充、以及Minio配置类的实现。idle-timeout: 500000 #空闲连接存活最大时间,默认600000(10分钟)端口8081/8082,数据库(hikari),redis以及对象存储minio等配置。maximum-pool-size: 12 #连接池最大连接数,默认是10。date-format: yyyy-MM-dd HH:mm:ss #日期格式。模块的枚举类和实体类,并配置了Lombok。
2025-05-18 14:14:05
758
原创 【尚庭公寓|项目日记】第一天
lease使用<dependencyManagement>和<properties>标签统一管理依赖版本,web模块依赖于common和model模块,非通用依赖在web模块单独引入。2,在项目lease目录下打开git bash,使用git clone命令拉取你自己项目的初始化文件到项目中,idea会自动识别,然后就可以直接在idea中进行版本管理了。1,选择一个自己喜欢的平台,如:码云(gitee),创建仓库lease,初始化仓库:语言和.gitignore模板选择Java,开源许可AGPL-3.0。
2025-05-18 12:04:35
296
原创 【redis基础入门篇】
2.1,当我们向redis中存入数据会发现,key和value都出现了乱码,原因是RedisTemplate底层的序列化机制,因为RedisTemplate可以接受object类型的key和value,但是序列化会走默认的序列化机制,这个机制底层是ObjectOutputStream流完成序列化,所以会乱码。2.2,通过自定义RedisTemplate解决这个问题,自定义key,hashkey和value,hashvalue的序列化规则同时定义自己需要的key和value泛型。(2)怎么实现队列?
2025-05-17 17:31:14
664
原创 【尚庭公寓|项目日记】第十天
今天的学习内容主要围绕Nginx的安装、配置及项目部署展开。首先,通过创建和编辑nginx.repo文件,使用yum命令成功安装了Nginx,并设置了开机自启动。接着,深入了解了Nginx的主要配置文件结构,包括mainblock、httpblock、serverblock和locationblock,这些模块分别负责全局参数、HTTP服务器功能、虚拟主机配置和请求处理逻辑。在实践案例中,通过配置简单的静态资源服务和反向代理,进一步掌握了Nginx的应用。
2025-05-15 23:37:02
429
原创 【尚庭公寓|项目日记】第九天
(1)先删除缓存,后更新数据库,第二步操作失败,数据库没有更新成功,那下次读缓存发现不存在,则从数据库中读取,并重建缓存,此时数据库和缓存依旧保持一致,都是并发【读写】还是会不一致。而且很多情况下,写到缓存中的值,并不是与数据库中的值一一对应的,很有可能是先查询数据库,再经过一系列「计算」得出一个值,才把这个值才写到缓存中。(2)如果是先更新数据库,后删除缓存,第二步操作失败,数据库是最新值,缓存中是旧值,发生不一致,都是并发【读写】情况下发生不一致问题的概率非常低。2,哪种更优更安全?
2025-05-14 21:21:56
366
原创 【尚庭公寓|项目日记】第八天
对于图片集合可以采用两种查询方式:嵌套查询(手写集合查询的<select>标签)/嵌套结果查询,因为没有分页要求这里采用结果查询,但是太多的join可能损失性能。因为查询需要的表太多,所以不采用手写sql的方式来查询结果,而是在实现类中使用通用mapper来处理所有逻辑(注意处理空leaseAgreement的情况)1,因为lease_agreement表中没有userId,所以无法直接使用本地线程里的userId,但是可以使用username(就是用户手机号)一,获取个人租约基本信息列表接口(多表查询)
2025-05-14 14:33:14
269
原创 【尚庭公寓|开发日记】第七天
该接口与上述的分页查询房间列表的接口类似,只是没有查询过滤条件,较前者的复杂SQL去掉了<where>标签,增加了判断ri.apartment_id=#{id},直接使用到了前者的resultMap="RoomItemVoMap"来调用两个SQL查询graphList和labelList。(2)嵌套查询: 先单独查询主表,然后根据分页参数在主表中查询结果,然后再对主表中查询出的结果与其他表匹配,这样就避免了分页结果出错。@Schema(description = "房间标签列表")
2025-05-14 10:34:42
651
原创 【尚庭公寓|项目日记】第六天
实现preHandle和after...方法,pre...表示在执行所有请求处理之前的逻辑,通过key得到token,解析token,获取userId和username放入到本地线程中l。1,项目采用阿里云的短信通信服务,目前只使用到了该服务的测试功能,只能在测试内的手机号上使用。1,redis里对验证码的过期时间设置过长(10分钟),是否考虑缩短。3,redis查询的验证码不为空,与用户输入的验证码进行比较。5,如果用户信息为空说明是新用户,然后注册用户。5,添加用户密码登录功能,与手机号登录一起。
2025-05-12 16:52:16
264
原创 springboot和mybatisplus的版本匹配与整合问题:Invalid bean definition with name ‘xxxMapper‘ defined in flle解决方法
关于springboot和mybatisplus的版本匹配与整合问题与Invalid bean definition with name ‘xxxMapper‘ defined in flle问题解决方法
2025-04-25 13:44:58
1078
原创 minio服务启动失败 “Variable MINIO_VOLUMES not set in /etc/default/minio“; exit 1; 解决方法
Linux上启动minio服务失败遇到ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi (code=exited, status=217/USER)问题可能的解决方法
2025-04-22 23:49:14
419
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人