目录
编辑
1.解决短信登陆--2023.4.14
redis
数据类型
阿里云短信服务
存入redis的key和value
流程
dto的意义
给token设置有效期
拦截器的类没有交给Spring
Constants
2.商户查询缓存(不采用SpringCache,而是尝试原理实现) 2023-4-13
流程:
opsForValue().increment(key,delta)
3 探店笔记
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,那也完蛋了,不放行
--->刷新有效期
--------->判断是否放行
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---->避免后续手动写错
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所有信息
发布笔记是简单的新增功能+上传功能