听书项目 Day 15|支付状态、购买记录与微信支付
记录余额支付后的订单状态更新、购买记录策略模式改造,以及微信支付发起、状态查询与回调处理。 本篇要点 处理余额支付后的订单状态 用策略模式整理购买记录 梳理微信支付请求与回调 **学习提示:**微信支付相关代码和测试片段属于学习记录,不代表已经通过真实商户环境的端到端验收。 内容回顾1、提交订单接口 检查和扣减余额 保存订单数据 延迟消息(订单超时未支付自动取消) – RabbitMQ的TTL+死信队列 – RabbitMQ延迟插件 – Redisson实现 保存购买记录 今天内容0、订单模块总结第一,订单模块流程(图) 第二,细节或者技术等 进行重复提交判断 进行数据加密防止篡改 使用策略模式对添加购买记录优化 1、余额支付完成修改订单状态 使用余额支付成功之后,修改订单状态变成已经支付 1234567891011121314151617181920212223242526272829303132//根据订单编号修改订单状态public void orderPaySuccess(String orderNo) { //根据订单编号...
听书项目 Day 14|订单提交与余额扣减
梳理订单创建、远程检查和扣减账户余额、消息可靠性与超时未支付订单处理方案。 本篇要点 串联提交订单的业务步骤 检查余额并进行条件扣减 区分消息可靠性与延迟取消方案 **学习提示:**笔记中列出 TTL/死信队列和延迟插件等方案;方案介绍不等于当前项目的超时取消链路已使用 RabbitMQ 延迟消息。 内容回顾 登录 搜索 详情 订单 1、跳转到结算页面 订单:vip、专辑、声音 都是跳转结算页面,显示vip、专辑、声音 2、生成订单接口(一部分) 重复提交 数据加密判断 今天内容1、订单实现流程 2、订单接口OrderService订单方法123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384//提交订单接口@Overridepublic String submitOrder(OrderIn...
听书项目 Day 13|声音结算页与订单提交
记录购买声音的结算页、可购买集数、订单提交前的业务检查及用户余额查询。 本篇要点 进入购买声音的结算流程 计算和展示可购买声音 梳理提交订单与余额查询 内容回顾1、canal工具 canal解决mysql和redis数据一致性问题 底层机制 – 相当于mysql从机,监控主机二进制日志变化 2、订单模块 跳转结算页面需求 – 购买vip – 购买专辑 – 购买声音 优惠价格计算公式 – 比如100,打八折,优惠20 – 原始价格 * (10-折扣)/ 10 防止重复提交 防止数据被篡改,数据加密 今天内容 登录 搜索 详情 订单 1、跳转结算页面(购买声音)1.1 实现流程 实现上面流程,编写两个接口 第一个接口,显示可以购买声音集数 第二个接口,跳转声音购买结算页面 1.2 显示可以购买声音集数接口 123456789//显示可以购买声音集数@GuiguLogin@Operation(summary = "获取用户声音分集购买支付列表")@GetMapping("/findUserTrackPaidL...
听书项目 Day 12|Canal 缓存失效与订单入口
整理 Canal 监听 MySQL Binlog 的缓存失效流程,并开始分析听书项目订单模块和结算入口。 本篇要点 理解 Binlog 与 Canal 的关系 梳理变更后的缓存失效 进入订单模块的需求分析 **学习提示:**Canal 相关示例账号已占位;这里的处理重点是识别数据变更并删除相应缓存,并非直接同步完整 Redis 对象。 内容回顾1、专辑缓存+分布式锁 使用分布式锁解决缓存击穿问题 一、使用Redis的setnx + 过期时间 + uuid + lua脚本 二、Redisson框架使用 Redisson实现分布式锁有两种机制 – 重试机制 – 看门狗机制 2、自定义注解+AOP实现缓存 切面类ProceedingJoinPoint使用 3、布隆过滤器 解决缓存穿透问题 存储0或者1数组 使用多个映射函数计算数据在数组位置 存在误判率 4、mysql和redis数据一致性 延迟双删策略:保证数据最终一致性 – 删除缓存 – 修改数据库 – 休眠一会 – 再删除缓存 数据同步canal工具 – 相当于mysql从机,监控mysql主机...
听书项目 Day 11|缓存、Redisson 与布隆过滤器
记录专辑详情缓存、Redisson 分布式锁、自定义缓存注解、布隆过滤器和 MySQL/Redis 一致性问题。 本篇要点 给专辑详情增加缓存 用 Redisson 控制热点回源 区分穿透、击穿和缓存一致性 **学习提示:**Redisson 在这里解决并发锁问题,不是分布式事务;布隆过滤器主要用于拦截不存在的键。 内容回顾1、缓存问题 穿透 雪崩 击穿 数据一致性 2、分布式锁 使用分布式锁解决缓存击穿问题 使用Redis实现分布式锁 使用Redis里面 setnx + 过期时间 + uuid + lua脚本 3、分布式锁四个条件 互斥性。 不会发生死锁。 解铃还须系铃人。 加锁和解锁必须具有原子性。 今天内容1、专辑详情添加缓存 缓存添加 + 解决缓存击穿(分布式锁) setnx + 过期时间 + uuid + lua脚本实现 在专辑详情service方法里面添加 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484...
听书项目 Day 10|排行榜与详情性能优化
梳理 Redis 在登录、统计、排行榜和幂等中的使用,并记录专辑排行榜与详情页并发优化思路。 本篇要点 盘点 Redis 在项目中的用途 实现专辑排行榜相关接口 分析详情页的并发与缓存问题 内容回顾1、根据专辑id查询声音列表1、根据专辑id获取专辑下面所有声音列表,但是声音包含免费和收费的 2、判断用户是否登录状态,如果用户没有登录: – 判断如果专辑不是免费的,去掉试看的集数,其他是收费的 3、如果用户当前是登录状态:根据专辑类型判断 – 如果vip免费专辑:判断当前登录用户是否是vip用户,如果不是vip收费,如果是vip但是vip过期了也是收费 – 如果付费专辑:需要收费,但是查询当前用户是否购买专辑或者声音 — 如果用户购买过专辑,专辑里面声音可以免费看 — 如果用户购买过专辑里面某些声音,购买的声音可以免费看 2、添加(修改)声音播放进度 更新声音播放量– 同一个用户对于同一个声音在24小时计算一次播放量 使用redis里面bitmap类型实现 1redis bitmap类型 key:userId 偏移量:声音id value:1 RabbitM...
听书项目 Day 09|声音列表、详情与播放进度
记录专辑声音列表、声音详情与播放进度处理,梳理跨服务调用和用户身份传递的问题。 本篇要点 查询专辑下的声音列表 分析声音详情数据来源 记录播放进度与远程调用边界 内容回顾1、根据一级分类Id获取全部分类2、关键字自动补全功能 completion :数据加载到内存中,通过前缀匹配 自动补全接口 3、logstashELK 使用logstash收集项目日志信息 把收集到日志信息存储到es里面 使用kibana分析es日志信息 4、专辑详情 基础功能 根据专辑id查询声音列表分析 今天内容1、根据专辑id查询声音列表(复杂)流程:1、根据专辑id获取专辑下面所有声音列表,但是声音包含免费和收费的 2、判断用户是否登录状态,如果用户没有登录: – 判断如果专辑不是免费的,去掉试看的集数,其他是收费的 3、如果用户当前是登录状态:根据专辑类型判断 – 如果vip免费专辑:判断当前登录用户是否是vip用户,如果不是vip收费,如果是vip但是vip过期了也是收费 – 如果付费专辑:需要收费,但是查询当前用户是否购买专辑或者声音 — 如果用户购买过专辑,专辑里面声音可以...
听书项目 Day 08|分类树、联想词与专辑详情
整理一级分类下的完整分类树、检索关键词自动补全、Logstash 以及专辑详情接口的学习记录。 本篇要点 组装一级分类下的二三级分类 实现关键词自动补全 了解日志与专辑详情接口 内容回顾1、专辑检索接口 重点编写DSL语句代码 2、根据一级id查询前7个置顶三级数据3、首页数据接口今天内容1、根据一级分类Id获取全部分类信息分析 在首页,点击某个一级分类,比如点击音乐,点击全部,根据一级分类id查询一级分类下面所有二级和三级分类 查询分类数据格式 123456789101112131415161718192021222324252627{ 一级分类id: 1 一级分类名称:音乐 child: [ { 二级分类id:11 二级分类名称:音乐音效 child: [ { 三级分类id:111 三级分类名称:运动音乐 } ] } ]}# 1 根据一级分类id查询一级分类数据,进行封装# 2 根据一级分类id查询下面的二级和三级分类数据# 查询base_cate...
听书项目 Day 07|专辑检索与首页数据
记录专辑关键词和分类属性筛选、分页排序与高亮,以及首页分类和推荐数据接口。 本篇要点 组合关键词与分类属性条件 处理分页、排序和高亮 梳理首页数据接口 今天内容1、专辑检索接口分析DSL语句 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687# 根据关键词与分类属性Id 过滤GET /albuminfo/_search{ "query": { "bool": { "should": [ { "match": { "albumTitle": "小说" ...
听书项目 Day 06|Elasticsearch 集成与专辑上下架
整理 Spring Data Elasticsearch 接入、专辑上架与下架、RabbitMQ 异步处理及批量添加专辑的学习过程。 本篇要点 在 Spring Boot 中操作索引 梳理专辑上下架链路 理解消息驱动的检索数据更新 **学习提示:**配置中的示例密码已替换为占位符;消息异步执行不等于搜索索引与数据库天然强一致。 内容回顾1、登录其他接口 登录校验 登录接口 2、es1、搜索引擎 2、索引库、类型、文档(json) **3、DSL:**领域专用语言,专门使用在es里面对es里面json格式文档进行查询语言 分页开始位置计算:(当前页-1)*每页记录数 3、Java API操作es ElasticsearchClient操作 123456789SearchResponse<Object> search = elasticsearchClient.search( s->s.index("my_index") .query( ...
