听书项目 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( ...
听书项目 Day 05|用户接口与 Elasticsearch 基础
记录当前用户信息和资料更新接口,并学习 Elasticsearch 的分词、倒排索引及基础操作。 本篇要点 补齐用户资料相关接口 理解搜索与倒排索引 练习 Elasticsearch 基础操作 内容回顾 用户登录功能 1、用户登录业务流程 Cookie: – Cookie默认会话级别,设置Cookie有效时间 – 每次请求都会携带cookie值,cookie是key-value结构 – 默认不能跨域访问,放到请求头传递 RabbitMQ: – 异步、解耦、流量削峰 – 场景:用户第一次登录时候,初始化账户使用RabbitMQ异步实现的 – 缺陷:实时一致性,因为异步 2、登录校验 自定义注解 + AOP实现的 3、登录接口 今天内容1、登录其他接口获取当前登录用户信息 123456789101112131415//获取当前登录用户信息@GuiguLogin(required = true)@GetMapping("getUserInfo")public Result getUserInfo() { //获取当前登录用户i...
听书项目 Day 04|微信登录与登录校验
梳理微信小程序登录、OpenID 查询、Redis 保存登录态,以及自定义注解和 AOP 校验登录的流程。 本篇要点 从 code 获取用户身份 用 Redis 保存登录状态 通过注解与切面统一校验登录 内容回顾核心模块 登录 专辑详情 订单 搜索 声音管理模块 保存声音 声音列表 删除声音 修改声音 今天内容前置知识 自定义注解 AOP Redis 1、用户登录流程(背) **httpClient:**请求微信接口服务器使用httpClient **RabbitMQ:**第一次登录,使用RabbitMQ异步初始化账户余额 **Redis:**通过Redis存储token数据,Redis的key是token,value是用户信息,设置过期时间 **Cookie(localStorage):**因为cookie默认不能跨域传递的,每次发送请求时候,把cookie值放到请求头里面进行传递 自定义注解 AOP 2、实现校验登录流程 每次请求接口都需要首先做登录判断 1、从请求头获取token(前端传递过来的) 2、根据token查询redis(redis的key是...
听书项目 Day 03|声音上传与管理
整理声音管理模块,从专辑选择、腾讯云点播上传,到声音列表、删除、修改等接口的学习记录。 本篇要点 分析声音与专辑的关系 学习音频上传与保存流程 梳理声音列表和维护接口 内容回顾专辑管理模块 保存专辑 专辑列表 – 行变列 删除专辑 修改专辑 今天内容声音管理模块1、保存声音1.1 分析实现以下接口 上传声音的接口(腾讯云云点播服务) 上传图片接口(已经完成了) 查询所有专辑接口 保存声音的接口 1.2 查询所有专辑接口 AlbumInfoApiController1234567@Operation(summary = "获取当前用户全部专辑列表")@GetMapping("findUserAllAlbumList")public Result findUserAllAlbumList() { Long userId = 1L; //TODO 再完善 List<AlbumInfo> list = albumInfoService.findUserAllAlbumList(userId)...
