2022.9.27

210 阅读3分钟

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的在实际应用中场景有哪些?

  1. Authentication 权限
  2. Caching 缓存
  3. Context passing 内容传递
  4. Error handling 错误处理
  5. Lazy loading 懒加载
  6. Debugging 调试
  7. logging,tracing,profiling and monitoring 记录跟踪 优化 校准
  8. Performance optimization 性能优化
  9. Persistence 持久化
  10. Resource pooling 资源池
  11. Synchronization 同步
  12. Transactions 事务
  13. Logging 日志

5.延时双删的第一次删除是干什么的

简单说延迟双删并不能完全解决一致性问题。但是有个第一次删除缓存能减少发生数据不一致的概率。

有了第一次删除可以排除下面的情况:

线程B读取缓存,被删除,此时刚好线程A数据库修改成功。B由于缓存被删刚好读取更新后的数据库。

所以第一次删除缓存只是解决了这种情况下数据不一致,这情况是很有可能发生的。提高数据的一致性概率。

如果不加第一次删除的话,上面那种情况,就会走缓存。