1.为什么要用threadlocal获取用户信息
首先为什么不用session?
大部分人想到的都是通过session来获取用户信息,当要想获取到session,就需要获取对应的request,这样,就会增加代码的耦合性。
这样我们在单个线程内,多次获取用户信息的时候,就不用反复去redis或者数据库中或者session去取了
session实现代码如下:
用户在登录时设置session
@PostMapping("/login")
public Result<User> login(@RequestBody User user, HttpServletRequest request) {
User res = userService.login(user);
request.getSession().setAttribute("user", res);
MAP.put(res.getUsername(), res);
return Result.success(res);
}
使用:先注入request,然后写一个获取用户的方法。
@Resource
private HttpServletRequest request;
public User getUser() {
return (User) request.getSession().getAttribute("user");
}
threadlocal只需要定义好类在配合拦截器把信息保存:就能在任何地方直接使用:
@RestController
@RequestMapping("test")
public class TestController {
@RequestMapping
public Result test(){
// SysUser
SysUser sysUser = UserThreadLocal.get();
System.out.println(sysUser);
return Result.success(null);
}
}
2.为什么用redis不用session去获取用户信息
一般开发中用户状态使用session或者cookie,两种方式各种利弊。
Session:在InProc模式下容易丢失,并且引起并发问题。如果使用SQLServer或者SQLServer模式又消耗了性能
Cookie则容易将一些用户信息暴露,加解密同样也消耗了性能。
session是基于cookie进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
Redis采用这样的方案解决了几个问题,
1.Redis存取速度快。
2.用户数据不容易丢失。
3.用户多的情况下容易支持集群。
4.能够查看在线用户。
5.能够实现用户一处登录。
6.支持持久化。
3.数据库的左连接,右连接,内连接了解吗
左连接、右连接、内连接、全外连接的区别是什么?-SQL-PHP中文网
4.使用AOP实现过什么,除了日志外
目前只用过缓存和日志,以后有机会学习到新的AOP应用场景(博客项目),可以专门写文章记下
SpringAOP的在实际应用中场景有哪些?
- Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging,tracing,profiling and monitoring 记录跟踪 优化 校准
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
- Logging 日志
5.延时双删的第一次删除是干什么的
简单说延迟双删并不能完全解决一致性问题。但是有个第一次删除缓存能减少发生数据不一致的概率。
有了第一次删除可以排除下面的情况:
线程B读取缓存,被删除,此时刚好线程A数据库修改成功。B由于缓存被删刚好读取更新后的数据库。
所以第一次删除缓存只是解决了这种情况下数据不一致,这情况是很有可能发生的。提高数据的一致性概率。
如果不加第一次删除的话,上面那种情况,就会走缓存。