10.20学习
1、技术栈学习
1.1 Mybatisplus框架使用
定义一个mapper接口,继承BaseMapper,BaseMapper是mybatisplus提供的,里面封装了一些对数据的基本操作方法。
例:
public interface UserMapper extends BaseMapper<UserDO> {
}
然后服务类的接口继承一个一个IService类,这个类也是由mybatisplus封装好的类。
例:
public interface UserService extends IService<UserDO>
最后编写服务类的实现类。在这个实现类中,可以直接调用baseMapper中提供的方法。
例:
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService
baseMapper.insert(userDO);
最后在启动类中加上
@MapperScan("springboot.dao.mapper")
括号里面是mapper所在的包位置。
1.2 全局异常捕获
在服务层发生的异常我们通常在controller捕获并返回结果。
首先自定义一个异常
public abstract class AbstractException extends RuntimeException
再设置全局异常捕捉器
@Component
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler
最后在服务实现类中抛出该异常就可以被捕获到。
1.3 用户信息脱敏。
像手机号,身份证号这类隐私信息不能够直接返回,因为这样有可能被抓包识别出隐私信息。所以返回数据要做脱敏处理,改成11111***1111的形式。
这里我们选择在返回数据做序列化时进行脱敏。
首先我们先自定义一个序列化器
public class PhoneCardDesensitizationSerializer extends JsonSerializer<String>
然后直接在返回类型的字段加上这个序列化就可以了。
@JsonSerialize(using = PhoneCardDesensitizationSerializer.class)
private String phone;
1.4 布隆过滤器。
布隆过滤器是一种很强大的数据结构,它是由一组哈希函数和一个位数组构成,根据哈希函数映射到位数组的几个位置,设置为1,就代表存了这个数据。它可以在很小的空间下存储很大量的数据。但存在一定的误判率,因为产生哈希冲突时,明明没有存这个值,但是因为哈希存储,这个位被设置了1,所以认为存储了。
使用场景:我们可以在接受一定的误判率的情况下,并且需要存储大量的数据,这时我们可以用布隆过滤器,这个布隆过滤器是redis提供的,存在缓存中,访问速度很快,适合大量热点数据的存储。
使用方法:
导入依赖:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
设置布隆过滤器的大小和误判率
@Configuration
public class RBloomFilterConfiguration {
/**
* 防止用户注册查询数据库的布隆过滤器
*/
@Bean
public RBloomFilter<String> userRegisterCachePenetrationBloomFilter(RedissonClient redissonClient) {
RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("userRegisterCachePenetrationBloomFilter");
cachePenetrationBloomFilter.tryInit(100000000L, 0.001);
return cachePenetrationBloomFilter;
}
}
在实现类中注入可以直接使用
private final RBloomFilter<String> bloomFilter;
bloomFilter.add(userDO.getUsername());
这里使用 @RequiredArgsConstructor注入。
2、算法刷题(leetcode面试15题)
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:
输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
解题思路:
先从左到右遍历,当arr[i]>arr[i-1]的话,left[i]=left[i-1]+1;
然后从右到左遍历,当arr[i]>arr[i+1] right[i]=right[i+1]+1
取这两个数组的之中的较小值,然后相加返回即可。

浙公网安备 33010602011771号