关注和取关 关注、取关用户:PUT /api/follow/{userId}/{true/false} 判断是否关注:GET /api/follow/or/not/{userId} 数据库建关联表 image.png|500 非常基础的实现 @Service public class FollowServiceImpl implements IFollowService { @Resource pri...
探店笔记 数据库建表: tb_blog 探店笔记表,包含标题、文字、图片等 tb_blog_comments 对某篇探店笔记的评价 建表 sql image.png|500 上传图片接口:POST /api/upload/blog @PostMapping("blog") public Result uploadImage(@RequestParam("file") MultipartFile image) { t...
异步秒杀下单优化之 Redis Stream 消息队列 需求: 创建一个 Stream 类型的消息队列,名为 stream.orders 修改之前的秒杀下单 Lua 脚本,在认定有抢购资格后,直接向 stream.orders 中添加消息,内容包含 voucherId、userId、orderId 项目启动时,开启一个线程任务,尝试获取 stream.orders 中的消息,完成下单 创建消息队列 消息队列名为 stream.orders,消费者组名为 g1,无则创建 xgroup create stream.orders g1 0 MKSTR...
消息队列入门 消息队列:确保消息至少被消费一次,也意味着持久化 image.png|500 主流的消息队列:Kafka、RabbitMQ、rocketMQ Redis 提供的消息队列 List:基于 List 结构模拟消息队列 PubSub:基本的点对点消息模型 Stream:比较完善的消息队列模型 基于 List 结构模拟消息队列 Redis 的 List 结构是双向链表,利用 LPUSH、RPOP 或 RPUSH、LPO...
异步秒杀优化 正常的执行需要执行六步,且涉及数据库,非常耗时,如果将判断库存和校验一人一单抽离出来,并将相关订单放到一个阻塞队列中,异步处理下单操作,可以优化更快的订单返回,以及下单速度 image.png|500 也就是说当前只需要确认能否执行,真正的执行可以慢慢做 将耗时的判断库存和校验一人一单的流程放入 Redis 中操作,并利用 Lua 脚本确保原子性 库存判断可以使用 String,一人一单直接使用 Set 即可 ![image.p...
基于 SETNX 的分布式锁问题 不可重入:获得锁的线程可以再次进入到相同锁的代码块中,意义在于防止死锁,如在锁内调用另一个带锁的,产生死锁 不可重试:没有重试机制,才获取一次就返回 false 超时释放:锁然避免了死锁,但是如果是业务超时,锁自动释放,可能的额外风险 主从一致性:如果使用 Redis 的主从集群,因为异步同步,可能会出现主节点宕机,数据未同步 Redisson 入门 Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格(In-Memory Data Grid) 提...
分布式锁 产生背景:各自单机看各自的锁监视器却无法共享锁 image.png|500|500 不用 JVM 内部的锁,使用一个,满足分布式系统或集群模式下多进程可见且互斥的锁,即分布式锁 image.png|500|500 分布式锁:多进程可见、互斥、高可用、高性能、安全性...... 常见实现方案 ![i...
基于 Redis 的全局唯一 ID 生成器 分布式系统下用来生成唯一性 ID 的工具:唯一性、高可用、高性能、递增性、安全性 image.png|500 示例 @Component public class RedisIdWorker { private static final long BEGIN_TIMESTAMP = 1735689600L; private static final int COUNT...
引入 Redis 作为缓存 引入 Redis 作为 Client 与 Server 之间的缓存存在,查询先经过 Redis 缓存,没有才会访问数据库,然后回写缓存,方便下一次对该数据的查询 image.png|500 示例 对于 queryShop 而言,先查询缓存中有没有,没有再去查询数据库,如果数据库中有就回写到缓存中,并返回 @GetMapping("/{id}") public Result queryShopById(...
基于 session 实现短信登陆 image.png|500 对于短信验证码来说,只有生成、发送、校验三步,在 Service 中即 /sendCode、/login 两步 显然这是利用 B/S 中的 JsessionId 在服务器中存储相关会话信息,即 smsCode 和 user 但是如果多台集群服务下,session 无法共享,所以引出了 Redis 实现短信登陆 ![image.png|500](https://0xling.cy...