java吧 关注:1,294,929贴子:12,830,796

记录从0开始学习后端路

只看楼主收藏回复

今天开始闪击一下黑马点评,基础篇已经看完了,进行实战的第二部分商户查询缓存。


IP属地:山东1楼2025-04-07 11:31回复
    见证大厂✌️


    IP属地:广东来自iPhone客户端2楼2025-04-07 12:30
    收起回复
      2026-01-17 18:49:35
      广告
      不感兴趣
      开通SVIP免广告
      用户查询缓存部分学习完毕,附上redis几个简单知识点。
      **缓存穿透的原因:**
      用户请求的数据既不在数据库也不在缓存中,导致不断的发起查询请求从而给数据库带来压力。
      **缓存穿透的解决方案:**
      缓存null值 (被动)
      布隆过滤器(被动)
      加强id复杂度从而保护数据库(主动)
      进行数据基础格式校验(主动)
      加强用户权限限制(主动)
      做好热点参数限流(主动)
      **缓存雪崩**
      在同一时段内大量的缓存key同时失效或者redis服务宕机,导致大量请求未命中,从而一瞬间大量数据进入数据库查询
      **解决方案**
      给不同的Key的TTL设置随机值
      利用Redis集群提高服务的可用性(利用主从哨兵机制保证数据持续工作)
      给缓存业务添加降级限流策略(当redis出现严重问题,主动降级限流,进行安全保护)
      给业务添加多级缓存(nginx反向代理,多个层面建立缓存)
      **缓存击穿**
      也被称为热点Key问题,一个被高并发访问并且缓存重建业务较为复杂的key突然失效了,大量的请求访问直接进入数据库
      **解决方案**
      互斥锁(为了避免大量线程查询数据库进行缓存重建,只让第一个获取互斥锁成功的线程进行构建)
      缺点:线程需要等待,性能较差
      可能多个线程导致死锁
      逻辑过期(在Redis设置数据时,不设置TTL,添加一个过期时间字段)
      缺点:不保证一致性
      有额外的内存损耗
      实现起来更为复杂(因为逻辑过期也需要加锁)


      IP属地:山东3楼2025-04-07 17:22
      收起回复
        嗯,加油,兄弟,给你推荐一个我经常学习的资源网站,猿学谷 ,应该对你学习比较有帮助


        IP属地:四川4楼2025-04-07 17:59
        回复
          狠狠地赚一笔


          IP属地:广东来自iPhone客户端5楼2025-04-07 19:00
          收起回复
            背景说一下呢


            IP属地:陕西来自Android客户端6楼2025-04-07 19:16
            收起回复
              看到有8u问楼主是什么背景,末流985分校区科班大学三年摆烂来的,不过绩点还可以20%左右准备润出国之前学学找找实习


              IP属地:山东来自Android客户端7楼2025-04-07 21:20
              收起回复
                本来今晚应该继续狠狠学的,结果楼主下午刚知道明天有门期中考试,完全没准备,被迫终止一下明天继续


                IP属地:山东来自Android客户端8楼2025-04-07 21:21
                回复
                  2026-01-17 18:43:35
                  广告
                  不感兴趣
                  开通SVIP免广告
                  考公考编吧,这行真不行了


                  IP属地:广东来自iPhone客户端9楼2025-04-07 21:43
                  收起回复
                    楼主今天上午刚应付了一门期中,更新下。优惠券秒杀部分学习完毕,开启分布式锁部分。在这里给出今天记忆的笔记。
                    全局ID的设置
                    UUID
                    Redis自增长
                    雪花算法(snowflake)
                    数据库单独表自增长等
                    优惠券秒杀
                    在编写seckillVoucher(Long voucherId)这个函数的时候,因为同时对两张表进行了修改,所以最好添加一个@Transactional注解,也就是事务,使得当产生问题时,可以及时进行回滚
                    超卖问题:
                    悲观锁:一定发生线程安全问题,确保线程串行执行
                    例如Synchronized,Lock
                    乐观锁:不一定发生线程安全问题,一开始不加锁,只在线程更新数据时判断是否有其他线程对数据做了修改。
                    乐观锁的性能高
                    乐观锁方法:
                    版本号法:给数据加上一个版本号,基于其进行判断是否有修改。(感觉是在MySQL层面加了个锁)
                    CAS法:优化版本号,直接用库存作为检测值进行比对,从而判断是否有修改。
                    在解决超卖问题时,对于集群项目,因为JVM的不同,会导致单体解决方案存在锁失效的问题,所以需要引入分布式锁。


                    IP属地:山东10楼2025-04-08 22:17
                    收起回复
                      今天分布式锁进行了一半多,这玩意怎么这么多这么长,而且一直在关注新闻,晚上没咋学进去


                      IP属地:山东11楼2025-04-09 22:15
                      回复
                        没用的 现在记住了 过会儿就忘了,这玩意要不停做项目才能巩固


                        IP属地:广东来自Android客户端12楼2025-04-11 11:15
                        回复
                          最近这两天没更新,有点事情,继续更新一下,分布式锁,秒杀优化,消息队列部分都已经完成了,在这里给出一些小知识点。
                          基于setnx实现的分布式锁存在下面的问题:
                          **重入问题**:获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁
                          **不可重试**:是指目前的分布式只能尝试一次
                          **超时释放:** 我们在加锁时增加了过期时间,这样的我们可以防止死锁,但是如果卡顿的时间超长,虽然我们采用了lua表达式防止删锁的时候,误删别人的锁,但是毕竟没有锁住,有安全隐患
                          **主从一致性:** 如果Redis提供了主从集群,当我们向集群写数据时,主机需要异步的将数据同步给从机,而万一在同步过去之前,主机宕机了,就会出现死锁问题。
                          秒杀优化思路:
                          将同步下单转变为异步下单,将一个线程的业务流程,进行异步的拆解。
                          先使用Redis进行库存余量,一人一单的判断,完成抢单的业务。
                          再使用下单业务放入阻塞队列中,利用独立的线程异步下单。
                          基于阻塞队列的异步秒杀问题:
                          内存限制问题:占用JVM的内存,可能导致内存溢出
                          数据安全问题:当出现异常问题的时候,后台没有相关数据
                          线程出现异常,任务从队列中取出后丢失
                          消息队列:
                          不在JVM中,是一个独立的部分
                          数据持久化,不会数据丢失,要求消费者做消息的确认,确保消息至少被消费一次
                          不过,课程中这个基于stream实现的消息队列,在正常企业项目应该是不太会用到的,后面要补充学习一下mq,然后前面缓存穿透的部分,我也会基于布隆过滤器重新优化改进一下,还有全局ID的设置,因为UUID方式对于高并发场景适应度过低,随机生成无时间戳属性,作为主键性能过差等问题,我会考虑改成雪花算法进行全局ID配置。


                          IP属地:山东13楼2025-04-15 20:02
                          回复
                            太唐了,因为没弄虚拟机,没在linux服务器上弄redis,下载了个3.0版本的,导致没有xgroup命令,真是够麻烦的,天天因为版本问题改来改去。


                            IP属地:山东14楼2025-04-15 20:53
                            回复
                              2026-01-17 18:37:35
                              广告
                              不感兴趣
                              开通SVIP免广告
                              学毛线,直接就是ctrl c + ctrl v


                              IP属地:广东15楼2025-04-17 20:21
                              回复