10.20学习

gm0920 / 2024-10-29 / 原文

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

  取这两个数组的之中的较小值,然后相加返回即可。