Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 如何设计一个短链系统
  • 新Get的开发技巧
  • 项目通用工具

  • 用户模块

    • 持久层
    • 实体类
    • 用户查询
      • 用户信息查询
      • 判断用户存在
    • 用户注册
    • 用户登录
    • 用户分库分表
    • 用户上下文
  • 短链模块

  • 流量风控
  • 如何获取用户IP?
  • SaaS短链接系统
  • 用户模块
Nreal
2024-01-03
目录

用户查询

# 用户信息查询

根据用户名查询用户信息:

@GetMapping("/api/shortlink/v1/user/{username}")
public Result<UserRespDTO> getUserByUsername(@PathVariable("username") String username) {
    return Results.success(userService.getUserByUsername(username));
}
1
2
3
4
@Override
public UserRespDTO getUserByUsername(String username) {
    LambdaQueryWrapper<UserDO> queryWrapper = Wrappers.lambdaQuery(UserDO.class)
            .eq(UserDO::getUsername, username);
    UserDO userDO = baseMapper.selectOne(queryWrapper);
    if(userDO == null){
        throw new ClientException(UserErrorCodeEnum.USER_NULL);
    }
    UserRespDTO result = new UserRespDTO();
    BeanUtils.copyProperties(userDO,result);
    return result;
}
1
2
3
4
5
6
7
8
9
10
11
12

根据用户名查询未脱敏用户信息:

只需要重新构建一个不加序列化器的RespDTO,其它逻辑一样;

# 判断用户存在

布隆过滤器

引入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9

配置文件配置Redis;

配置类:

@Configuration
public class RBloomFilterConfiguration {
    /**
     * 防止用户注册查询数据库的布隆过滤器
     */
    @Bean
    public RBloomFilter<String> userRegisterCachePenetrationBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("userRegisterCachePenetrationBloomFilter");
        cachePenetrationBloomFilter.tryInit(100000000L, 0.001);
        return cachePenetrationBloomFilter;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

接口:

@GetMapping("/api/short-link/admin/v1/user/has-username")
public Result<Boolean> hasUsername(@RequestParam("username") String username) {
    return Results.success(userService.hasUsername(username));
}
1
2
3
4
private final RBloomFilter<String> userRegisterCachePenetrationBloomFilter;

// ...

@Override
public Boolean hasUsername(String username) {
    return !userRegisterCachePenetrationBloomFilter.contains(username);
}
1
2
3
4
5
6
7
8
实体类
用户注册

← 实体类 用户注册→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式