黑马点评项目
文章平均质量分 73
本项目涵盖共享session、缓存及缓存更新策略、分布式锁、消息队列、秒杀等场景
light_code
code everyday!
展开
-
黑马点评项目学习笔记--(11)UV统计
PV 与 UV 的比值可以反映出这个网站的用户粘度,也就是平均每个用户点击这个网站的次数是多少。UV 值的大小可能是千万甚至上亿的,直接存储在 Redis 中将十分恐怖,如何解决?同一个用户一天内多次点击页面,只记录一次。只要有用户点击了这个页面,就做记录。原创 2023-06-19 14:28:31 · 133 阅读 · 2 评论 -
黑马点评项目学习笔记--(10)用户签到
从最好一次签到的位置向前扫描,直到遇到第一次未签到的为止,计算总的签到次数,就是连续签到天数。实际上,我们可以按月统计用户的签到情况,用位图的方式,0表示未签到,1表示已签到。会发现,如果我们用一张数据库表来保存用户签到的记录,会十分占用内存。让这个二进制数字不断右移,同时让这个二进制数字不断与 1 做与运算。如果我们用数据库表来保存签到记录。原创 2023-06-19 14:26:04 · 72 阅读 · 0 评论 -
黑马点评项目学习笔记--(9)附近商铺
SpringDataRedis的2.3.9版本并不支持Redis6.2提供的GEOSEARCH命令,因此我们需要提示其版本,修改pom.xml。redis在3.2版本后加入了对Geo的支持,Geo就是Geolocation,代表地理坐标。按照shopId作为分类依据,在redis中保存不同类型商铺的地理坐标信息和商铺的id。4.查找某个地点的经纬度信息 / 经纬度信息对应的hash值。3.返回某个坐标点的某个范围内的坐标点(由近及远)转化为 hash 值后可读性更好、存储空间更小。2.计算两点之间的距离。原创 2023-06-19 14:27:28 · 72 阅读 · 0 评论 -
黑马点评项目学习笔记--(8)好友关注
为了采用滚动分页的方式,收件箱我们应该采用sortedset来实现,因为和list相比,他不仅能够保证消息的先后顺序,还可以按照score值进行范围查询,我们只需要每次记录读取的最后一个数据的score值,下一次读取时查询该值之后的score对应的消息即可。为了解决传统分页的问题,我们采用滚动分页的方式,每次记录上一次读取至的数据的位置,然后下一次查询就可以从后面开始查询,避免了重复读取消息的情况。1)修改新增探店笔记的业务,在保存blog到数据库的同时,推送到粉丝的收件箱。原创 2023-06-19 14:25:00 · 70 阅读 · 0 评论 -
黑马点评项目学习笔记--(7)达人探店
set和sortedset在命令上有所区别,set有sismember命令判断某个元素是否存在,而sortedset则没有,它只能通过zscore命令(查找某个元素的分数)来帮助我们判断元素是否存在,当元素存在是会返回对应的分数,不存在则返回null。原创 2023-06-19 14:26:26 · 100 阅读 · 0 评论 -
黑马点评项目学习笔记--(6)消息队列
消费者不断从Stream消息队列中取出还未被消费的消息,没有取到就进入下一次循环再次获取消息,取到消息之后,处理消息,处理消息完成后会进行ack,如果在处理消息的过程中出现异常,那么进入catch代码块中,对pending-list中的消息进行处理(也会ack),这个时候如果处理过程还是报异常,会记录日志,必要时进行人工介入,同时会进入下一次循环,直到从pending-list中取不出消息。队列中的消息会分流给组内的不同消费者,在一个组中,不会出现一条消息被多个消费者消费的情况,从而加快消息处理的速度。原创 2023-06-19 14:22:58 · 250 阅读 · 0 评论 -
黑马点评项目学习笔记--(5)秒杀优化
先利用Redis完成库存余量、一人一单判断,完成抢单业务在将下单业务放入阻塞队列,利用独立线程异步下单。原创 2023-06-05 17:55:40 · 247 阅读 · 0 评论 -
黑马点评项目学习笔记--(4)分布式锁
满足集群模式或者分布式系统下,多进程可见并且互斥的锁。原理:利用 setnx 的互斥性;利用 ex 避免死锁;释放锁时判断线程标识防止释放别人的锁缺陷:不可重入、无法重试、锁超时失效。原创 2023-06-05 17:51:03 · 285 阅读 · 0 评论 -
黑马点评项目学习笔记--(3)优惠券秒杀
如何以key这样命名,说明订单业务的id自增会一直与这一个key绑定在一起,几年或者十年都是这个key在自增,而reids中单个key自增的上限是2^64,虽然订单量可能无法达到这个数值,但是上图已经规定了,订单编号是用32个bit来存储的,订单数量很可能会超过2^32。redis的kye可以自增长,而且redis是全局中唯一的一个,所以无论数据库中订单在多少个表中,都开始生成一个全局的唯一id。2)订单量庞大时,需要多张表来存储,采用id值自增长的方式,订单id可能不唯一。原创 2023-05-21 16:52:21 · 377 阅读 · 1 评论 -
黑马点评项目学习笔记--(2)商户查询缓存
而在查询数据库与写入缓存期间,B线程过来进行更新数据库与删除缓存的操作,A线程再进行写入缓存的操作,这样一来,缓存中保存的是旧数据,而数据库保存最新数据,从而出现数据不一致。一个线程在操作缓存与操作数据库期间,另一个线程恰好过来查询缓存并进行写入操作,这样一来,缓存保存的是旧数据,而数据库是最新的记录,从而出现数据不一致。发生概率:一方面,A线程进行查询缓存操作时缓存得恰好失效,另一方面,因为写入缓存的速度很快,在如此快的时间内完成更新数据库(耗时)、删除缓存的操作,比如店铺详情查询的缓存。原创 2023-05-15 10:42:22 · 117 阅读 · 1 评论 -
黑马点评项目学习笔记--(1)短信登录
用户登录成功后,之后的操作都会涉及到登录状态的验证,起初,第一次验证时,由于每次发起的请求中包含cookie,而cookie中携带了sessionId,系统会根据sessionId获取到session对象,然后看看session中是否包存在用户,存在时,不会立刻放行,而是把用户保存在ThreadLocal(相当于缓存)中,方便之后登录校验,可以直接从threadLocal中取。首先要对用户提交的手机号进行验证合法性,合法了,才会生成一个验证码保存在session中,接着,才会发送验证码到用户手机中。原创 2023-05-12 11:33:55 · 293 阅读 · 0 评论