黑马点评笔记(自用)

1.优惠卷秒杀
(1)全局唯一ID
订单如果用自增,容易被猜到交易量,且数据量大的话分成多个表,都是自增,容易出现重复。所以用全局ID生成器,Redis独立自增不会重复,但安全性不保证,所以用符号位+时间戳+序列号来代替:
在这里插入图片描述
时间戳:当前时间-初始时间
序列号:设置每天一个KEY,在一天内KEY都相同,不同天的KEY不相同。
时间戳左移32位,留出32位进行拼接,然后让时间戳和序列号完成|运算,即可完成拼接。
还可以使用雪花算法来生成全局唯一ID
(2)添加优惠卷
优惠卷分为普通优惠卷和秒杀优惠卷,秒杀优惠卷优惠力度大,有库存、开始时间、结束时间,这是比普通多的信息。
(3)实现秒杀下单
判断1、是否在时间内
2、库存是否足够
(4)超卖问题
两个线程并发执行,线程1先查询,线程2随后查询,线程1库存-1,线程2库存-1,但线程1去-1后库存变为0了,线程2再减就变为-1了这就是超卖。在修改之前,都查询完。
解决方法:悲观锁或乐观锁
乐观锁:很乐观认为不会修改数据,每次就在更新数据时判断数据有没有修改,若修改发生异常。
给设置一个版本号,线程1、2先查询版本号为1,线程1去-1则版本号+1为2,线程2修改数据判断发现版本号变了就不改了。若用库存stock去代替版本号,那么就是CAS法。要使stock>0,因为若只等于的话,会造成一个线程成功修改,其他线程失败就不尝试了。
(5)实现一人一单功能
秒杀优惠卷需要限量,一个用户只能用它下一单。
所以扣库存之前需要先根据userid和优惠卷id判断数据库内是否已经有了订单,若有了就错误。可以用悲观锁,把功能封装成类,用的时候调用它,同步锁就在调用它的地方加,这样先加锁,然后到下单一直都有锁,其他线程不会趁虚而入。(仅限单机情况下)
集群情况下上边的方法就不行了,例如有两个JVM,里边有两个锁监视器,两个线程都可以各获得一把锁互不干扰,都可以去减库存。
(6)分布式锁
在多个JVM外边创建一个JVM都可以看见的并且互斥的锁监视器,这样一旦一个线程获取锁,其他JVM就会获取失败。可以利用Redis来实现,因为Redis独立与JVM,并且利用setnx来实现互斥,向Redis中set数据时,只有里边不存在数据时才能set成功,否则失败,这样来保证互斥。安全性利用锁超时释放。
(7)Redis分布式锁误删问题
线程1获取锁,然后业务阻塞,一直到锁超时释放,这时候线程2可以获取锁执行业务,过一段时间,线程1业务执行完毕,去执行释放锁操作,线程2还没完成业务,线程3也获得了锁,这时候多个线程同时执行,出现安全问题。
解决方法:先获取锁的标识(用UUID),释放锁的时候,判断一下锁的标识看是否是同一把锁,若是就释放失败,不是可以释放。
(8)分布式锁的原子性问题
上边的解决后,若在判断操作和释放锁操作之间,业务阻塞了(JVM的Full GC垃圾回收机制造成所有都阻塞了),然后锁超时释放,这是线程2获取锁,线程1阻塞结束释放锁,线程2被释放锁,线程3获取锁。
解决方法:将判断操作和释放锁操作变成原子性。
用lua脚本执行命令时,会一块执行保证原子性,具体lua命令查菜鸟教程。
(9)Redisson实现分布式锁
因为setnx会有
在这里插入图片描述
在这里插入图片描述
重试获取锁:
在这里插入图片描述
防止锁提前超时释放:
在这里插入图片描述
解决主从一致性问题:可以试用Redisson的联锁来解决,核心是开启多个Redis的主节点,设置锁时,必须所有主节点都写入成功,才算设置成功。
实现联锁的关键点:
1、所有节点都必须成功才行,否则就要从头来过
2、在所有锁设置成功后,要设置统一释放时间。
3、锁释放时间必须要大于抢锁等待时间,不然还没抢到锁就先释放了
在这里插入图片描述

(10)异步秒杀
为了优化秒杀业务,首先校验功能执行快,创建订单涉及到数据库操作执行慢,原本他俩在一个线程拖慢速度,现在把他俩分离开来,这样提高了速度。所以校验完后直接返回订单id给前端,创建订单操作数据库可以和校验异步执行。校验这部分就放到Redis里去执行。并且用set集合去储存数据。校验这部分放到lua脚本里去做,java代码只需调用id即可。注意下单业务是放到阻塞队列中的跟之前的校验异步下单
(11)Redis消息队列实现异步秒杀
消息队列中分为生产者、消息队列、消费者。相当于快递员、快递柜、我。把下单那一部分放到消息队列,我什么时候用就什么时候取。且它独立与JVM,不会造成内存溢出。
stream的单消费者模式:消息可以回溯、一个消息可被多个消费者读取、可以阻塞读取就是什么时候新消息发过来再读取,但是若在读取之前一下发了多条消息只能读最新的一条会漏读。
stream消费者组模式:
消费者组:同组中多个消费者相互竞争,只有一个消费者能抢到,增加消费能力。
消息标识:比作书签,从上次没读完的地方接着读
消息确认机制:默认消费的信息为pending状态,会放到每个消费者的pending-list中去,只有确认(ACK)以消费才移除,这样Redis宕机也可以从新处理。

点赞
首先判断是否已经点过赞了,防止同一个用户重复点赞,就给Blog表内设置一个islike字段来判断是否点过赞。用Redis的set集合,若已存在点赞则失败,不存在就成功然后把点赞信息放进去。
点赞排行榜
去显示最新点赞的五个人,用Redis的Soretedset来排序,里面会自动按score来排序,把score设为时间就行。

关注与取关
写关注、取关、判断关注接口。关注要先获得用户id,再封装到接口、保存,取关就直接remove()删除就行。
共同关注
本质是求两个用户关注集合的交集,用set集合。因为set有可能过期,过期后开启异步任务,构建缓存。
Feed流
Feed流指像抖音那样不断下拉刷视频那种,而现在要做的是Feed流关注推送给粉丝。
Feed流分两种:
1、Timeline:按时间顺序排的,比如朋友圈。
2、智能排序模式:抖音推荐算法
我们用的是Timeline,分为推、拉、推拉结合模式。
拉模式:up主一个发件箱,粉丝一个收件箱先到发件箱,再到收件箱。适合粉丝数多的。
推模式:只有粉丝有个收件箱,直接发到收件箱,适合粉丝数少的。
推拉结合:给活跃粉丝进行推模式,普通粉丝拉模式。
GEO地理坐标计算
GEO是Redis实现储存多个地理坐标、计算坐标间的距离、坐标半径范围内的其他点和距离(附近的人)GEO底层是Sortedset类型
签到用Bitmap
一共31bit,一个bit上0或1代表是否签到(二进制101010等),一个月正好31天,这样用的数据也少,底层是string类型
统计连续签到天数
从后往前统计,直到遇到0就断签,至于如何从后向前遍历,就是拿数据和1做与运算,都是1结果为1,否则为0,先从最后一位比较,然后数据右移比较倒数第二位,以此类推。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/4001.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue Nginx 配置跨域

1、方案1:Nginx配置跨域,Vue不用配置vite代理 1.nginx 配置SSL证书 listen *:443;server_name gitlab.xxxxxx.com;server_tokens off; ## Dont show the nginx version number, a security best practicessl on;ssl_certificate /etc/gitlab/xxxxxx.c…

俺的面试qwq

1.JavaScript的基本数据类型都有什么? 布尔型、数值型、字符串、数组、null、undefined、object、symbol 2.数组方法pop()push() unshift() shift()的作用? pop()删除最后一个元素、push()在数组最后增加元素、unshift()在数组最前面增加元素、shift()删除第一个元素 3.box-s…

【ChatGPTAIGC研讨社】“iPhone时刻”:未来已来

文章目录前言一、ChaGPT&AIGC研讨社简介二、ChatGPT&AIGC研讨社的优势1.丰富充实的资料库Github开源:[ChatGPT_Project](https://github.com/shawshany/ChatGPT_Project)飞书资料库2.重量级嘉宾3.工作机会4.投资资源总结前言 去年年末,ChatGPT以…

Linux编译器-gcc/g++ 使用

在介绍gcc/g的使用前我们先了解一下两者的不同 gcc时主要编译c语言,而g主要编译c的,但是两者的选项是相同的,因此我们以gcc和c语言为例来讲解。背景知识 gcc和g都是编译器其核心作用将文本类文件翻译成二进制可执行 那么其过程是怎样的&…

dolphinscheduler 2.0.6 资源中心改造方案二:通过NFS挂载共享目录

目录调度资源中心存储概要安装NFS服务器客户端调度验证关闭SFTP开关(可忽略)重新上传资源文件worker执行任务验证服务器woker客户端worker其它nfs共享目录的配置文件/etc/exports说明调度资源中心存储概要 针对现有的单机存储可以做哪些扩展?…

免费1年服务器,部署个ChatGPT专属网页版

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com port 443: Connection timed out 你是…

【统计学习】25个必须掌握的数据分析基础概念

16个必须掌握的数据分析基础概念1. 描述性统计2. 假设性检验2.1 参数检验2.2 非参数检验3. 置信度分析4. 列联表分析5. 相关分析6. 方差分析7. 回归分析8. 聚类分析9. 判别分析10. 主成分分析11. 因子分析12. 时间序列分析13. 生存分析14. 典型相关分析15. ROC分析16. 偏差-方差…

MATLAB中quiver函数用法

目录 语法 说明 示例 创建箭头图 禁用自动缩放 绘制梯度和等高线 指定箭头颜色 指定箭头图的坐标区 在创建后修改箭头图 quiver函数的功能是绘制箭头图或向量图。 语法 quiver(X,Y,U,V) quiver(U,V) quiver(___,scale) quiver(___,LineSpec) quiver(___,LineSpec,fi…

List和list迭代器的模拟实现

list的使用 我们list表示带头双向循环链表。 我们再找我们的list中每个数据的位置&#xff0c;就不可以再用我们的下标[]了。 我们就必须用迭代器。 void test_list1() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>:…

MySQL基础-视图

文章目录MySQL基础-视图一、数据库对象二、视图概念三、视图的使用1、创建视图2、查看视图3、修改视图4、修改/删除视图四、总结MySQL基础-视图 一、数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行…

STM32输出PWM波控制电机转速,红外循迹避障智能车+L298N的详细使用手册、接线方法及工作原理,有代码

智能循迹红外避障小车 本设计的完整的系统主要包括STM32单片机最小系统、L298n电机驱动&#xff0c;超声波 &#xff0c;舵机 &#xff0c;红外模块等。寻迹小车相信大家都已经耳熟能祥了。 我们在这里主要讲一下L298N驱动电机和单片机输出PWM控制电机转速。 本设计软件系统采…

这个时候了,你还不会不知道JavaMail API吧

一、概述 1.1 简述 JavaMail API 顾名思义&#xff0c;提供给开发者处理电子邮件相关的编程接口&#xff0c;它是Sun发布的用来处理email的API&#xff0c;其提供独立于平台且与协议无关的框架来构建邮件和消息传递应用。JavaMail API 提供了一组抽象类&#xff0c;用于定义组…

第十四届蓝桥杯三月真题刷题训练——第 24 天

目录 第 1 题&#xff1a;旋转 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 思路&#xff1a; 第 2 题&#xff1a;附近最小_单调队列模板 代码&#xff1a; 第 3 题&#xff1a;扫地机器人_二分 题目描述 输入描述 输出描述 输入输出样…

【蓝桥杯】​蓝桥杯——每日四道编程题(两道真题+两道模拟)​| 第 二 天

专栏&#xff1a; 蓝桥杯——每日四道编程题&#xff08;两道真题两道模拟&#xff09; “蓝桥杯就要开始了&#xff0c;这些题刷到就是赚到” ₍ᐢ..ᐢ₎♡ 另一个专栏&#xff1a; 蓝桥杯——每日四道填空题&#xff08;两道真题两道模拟题&#xff09; 目录 第一道真题&…

Kafka 基础整理、 Springboot 简单整合

定义&#xff1a; Kafka 是一个分布式的基于发布/订阅默认的消息队列是一个开源的分布式事件流平台&#xff0c;被常用用于数据管道、流分析、数据集成、关键任务应用 消费模式&#xff1a; 点对点模式 (少用) 消费者主动拉取数据&#xff0c;消息收到后清除消息 发布/订阅模式…

【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛2]客观题及详细题解

题1 解析 USART_CR1:控制寄存器1&#xff0c;其中的M位定义了数据字的长度&#xff0c;由软件对其设置和清零。USART_CR2:控制寄存器2。USART_BRR:波特率寄存器。USART_DR:数据寄存器。 (如果现场不记得&#xff0c;可以查阅芯片手册) 答案: A 题2 解析 在STM32微控制器中&a…

每日学术速递3.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.CC3D: Layout-Conditioned Generation of Compositional 3D Scenes 标题&#xff1a;CC3D&#xff1a;合成 3D 场景的布局条件生成 作者&#xff1a;Sherwin Bahmani, Jeong Joon …

五、MyBatis各种查询功能

MyBatis的各种查询功能 如果查询出的数据只有一条&#xff0c;可以通过 实体类对象接收List集合接收Map集合接收 如果查询出的数据有多条&#xff0c;一定不能用实体对象接收&#xff0c;会抛TooManyResultsException&#xff0c;可以通过 实体类类型的List集合接收Map类型的L…

学习系统编程No.11【重定向的本质】

引言&#xff1a; 北京时间&#xff1a;2023/3/27/7:05&#xff0c;哈哈哈&#xff0c;首先是开心&#xff0c;因为上篇博客热榜目前第15&#xff0c;让我初步掌握了上热榜的小妙招&#xff0c;不单单只是要日更&#xff0c;还有非常多的上榜小技巧&#xff0c;但是首先连续更…

【备战蓝桥杯】----01背包问题(动态规划)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…
最新文章