10.20學習

ooo神罚彡天發表於2024-10-21

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

  取這兩個陣列的之中的較小值,然後相加返回即可。

相關文章