目录
编辑
1.解决短信登陆–2023.4.14
redis
数据类型
阿里云短信服务
存入redis的key和value
流程
dto的意义
给token设置有效期
拦截器的类没有交给Spring
Constants
2.商户查询缓存(不采用SpringCache,而是尝试原理实现) 2023-4-13
流程:
opsForValue().increment(key,delta)
3 探店笔记
4.关注推送(Feed流)
如何实现Feed流的滚动分页
1.解决短信登陆–2023.4.14
redis
tips—- “login:user”自动分类,如果有多个login:的文件,则会变成login文件夹下的user
数据类型
首先呢不同数据类型的KEY都是一个样,数据类型不同就是VALUE类型不同!
String:VALUE是String
Hash:Value是Hash
List:
Set:Value里面是个Set
可以看见一个KEY对应着一个Set value,其中value里面的值有很多个
SoretedSet(又叫Zset):
Key —>[{value,score}]
根据score来排序,在插入元素之后,插入填入value,score
Key | Value(Object)——–score |
blog:liked:13 | 5 ———– 11 |
1 ———- 1124 |
阿里云短信服务
把aliyun短信服务都自己封装到MessageUtils
只需要
这样调用即可
存入redis的key和value
login:code:{phone}———>验证码
login:token:{token}———->userDTO
流程
关键凭证还是靠的:前端那自己的token去找redis里的token看找不找得到,如果redis里面的token被删了,就是说你得重新登陆了,重新来个token给redis
1.短信登陆注册
->保存redis,{token —> userDTO}//存到redis—- token->userDTO,一方面便于快速取出user信息,另一方面用token作为登录凭证——30minTTL
—->返回token给前端,以便于客户在浏览器可以用token证明自己登陆了
2.此后每次操作校验登录状态
—>前端发起请求,用前端浏览器的token作为authorization请求头,传给了后端,
—->后端利用authorization作为token去redis获取userDTO,拿到自己作为用户的信息来证明登录了
——>如果发现前端没有token或者 后端那这前端token找不到redis对应的tokon->user,那也完蛋了,不放行
—>把userDTO放到本次请求线程的ThreadLocal方便后端全局调用,并刷新有效期
———>判断是否放行
3.关于拦截器
class RefreshTOkenINterceptor{
preHandle(request,response,handler);{
//获取请求头中的token
//token换取redis的userDTO
//userDTO存入threadLocal
//刷新token的TTl
}
}
loginInterceptor{
preHandle()
{
//读取threadLoacl中是否有用户
//有-》放行
//没有-》拦截
}
}
同一个用户通过多个拦截器,整个过程中都是同一个thread,同一个ThreadLocal
后端在用户登录之后返回用户的token给前端,前端把authori = token
dto的意义
因为我们本来要把user存到存到的是redis,但是redis是内存里存的肯定存的内容要求精简,所以我们选择存UserDTO (只包含user中部分信息内容)
给token设置有效期
让30分钟自动删除不继续访问操作的某用户的token—->清楚了redis占用—–>也让用户30分钟得重新登录
优化用户体验(用户30分钟得重新登录)—->转为用户30min不操作才重新登陆—->拦截器中对每次操作请求都preHandle成功return之前进行刷新token的TTL
拦截器的类没有交给Spring
由于拦截器 LoginInterceptor implments HandlerInterceptor只是实现了类,但是没有类头上@XX的注解,没有交给Spring去认识——》所以在LoginInterceptor类里面用不了@Resource——>得自己去找StringRedisTemplate的实例
Constants
把一些重复使用的常量统一写道同一个Constants—->避免后续手动写错
implements Serializable的作用implements Serializable的作用_am540的博客-CSDN博客
概述:允许变成二进制之类的继续传输
什么情况下需要序列化:
1. 当你想把的内存中的对象写入到硬盘的时候(比如想要连接MYSQL,然后写的entity类需要implements serializable。
2. 当你想用套接字在网络上传送对象的时候。
3. 当你想通过RMI传输对象的时候。
关于UserHodler
作用:主要目的就是后端写程序时候方便调取当前登录用户的User
每次用户的每1次请求都是 从线程池选一个空闲线程,所以当用户登录之后,直接把他的User信息存入ThreadLocal来方便我后端随时调用本次登录的用户User
2.商户查询缓存(不采用SpringCache,而是尝试原理实现) 2023-4-13
功能:
直接从1s->10ms
流程:
opsForValue().increment(key,delta)
就会让redis里面的这个key对应的value进行自增delta,默认为1
increment()方法是实现递增,对于同一个KEY,执行一次,如果key存在,则把value的值增加delta,
3 探店笔记
在实际开发中图片一般会放在nginx上或者是云存储上。
upload上传有两种方案
1.上传到aliyun之类的oss
2.上传到nginx的前端服务器
这里选的是2
需求:
1.点赞功能:
用户可以对某笔记点赞一次,再次点击则会取消点击
如何判断是否某用户点赞过,查询Redis按照BlogId,返回这篇笔记点赞过的用户,看有没有该用户, 采用redis的ZSet缓存 Key:{BlogId} Value:[{userId,score:点赞时间}]
2.查询该笔记前五个点赞的用户
采用redis的ZSet缓存,以点赞时间作为Score
注意:这里的redis只存了UserId!而不是保存User所有信息
发布笔记是简单的新增功能+上传功能
4.好友关注推送(Feed流)
登录用户关注或者取消关注某用户
- 将当前登录用户与被关注用户 关系存入sql
- 用redis缓存当前登录用户关注了哪些用户
- 将当前登录用户作为Key,被关注用户作为Value,存入redis以set
关注推送(Feed流)
推模式:up发布博客之后,直接把新博客推送给粉丝邮箱
拉模式:当粉丝打开首页准备浏览新博客,系统才开始拉取关注的人的新博客
在这里简单采用推模式
需求:
-
修改新增探店笔记的业务,在保存blog到数据库的同时,推送到粉丝的收件箱 //采用单纯推模式
-
收件箱满足可以根据时间戳排序,必须用Redis的数据结构实现
-
查询收件箱数据时,可以实现分页查询
分析:
- 每次下滑达到分页限制将会发起请求查询下一页滚动分页
- 前端请求,带有lastminTime,offset(这里的offset指从所有满足
- 后端拿着前端给的上次查询末尾的时间戳+offset去定位,本次返回Blog的起始位置
- 后端返回的,List
本次返回的笔记,minTime,offset
如何实现Feed流的滚动分页
- 用Redis的ZSet缓存接收邮箱———Key是某个粉丝的UserId,Value是被推送的博客,Score是时间戳
- 上次读取的是minTime = 5,offset =1—->代表本次要返回的Blog要从time
- 第一次最顶端第一次请求的minTime =MAX,offset = 0
- MybatisPlus的query().list()方法源码就是用select from where IN 查的
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net