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
取這兩個陣列的之中的較小值,然後相加返回即可。