编辑
2025-08-03
XCPC
00

行数不知道

string line; while (getline(cin, line)) { stringstream ss(line); string s; while (ss >> s) { cout << s << endl; } }
编辑
2025-08-03
redis
00

什么是缓存雪崩

一段时间内大量缓存数据同时过期或者redis宕机,导致大量请求直接达到数据库,带来巨大压力。

与击穿的区别是,击穿是针对一个key,而雪崩是多个不同的key。

解决方案

1.给不同 key设置不同的过期时间

2.部署 redis集群

利用哨兵机制可以及时调整集群的结构,解决redis宕机导致无法查询到缓存的问题。

3.添加多级缓存。

比如Guava或Caffeine作为一级缓存,redis作为二级缓存。

4.添加降级限流机制(保底策略)。

编辑
2025-08-03
redis
00

什么是缓存击穿

热点数据缓存设置过期时间,过期的时候恰好发来了大量并发请求,大量并发请求可能直接导致数据库宕机。

解决方案

1.加互斥锁

在缓存重建之前加互斥锁,只有拿到锁的线程才会进行缓存重建,没有拿到锁的线程则会休眠重试。

缺点

没有拿到锁的线程会一直等待,性能较低。(强一致,性能差)

2.逻辑过期

不给缓存设置真实的过期时间,而是新增一个过期时间字段,当查询到缓存时,判断这个数据是否真正过期了,如果是,新开一个线程进行缓存重建,当前线程则直接返回旧数据即可。缓存重建的过程同样需要加锁,对于没有抢到锁的线程,也是直接返回旧数据。

缺点

虽然性能得到了提升,但是查询到的数据可能是旧数据。(高可用,性能优,但数据可能不一致)

编辑
2025-08-03
redis
00

什么是缓存穿透

查询一个不存在的数据时,数据库(比如mysql)查询不到数据也不直接写入缓存,导致每次请求都会查询数据库,如果有人恶意查询空数据可能会导致数据库宕机

解决方案

1.缓存空数据

不存在的数据也放入缓存中,这样的缺点是,当有大量空数据时,会占用很多额外内存

2.布隆过滤器

作用

布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存在,布隆过滤器说这个数存在可能不存在。当数据一定不存在时就可以直接返回。

原理

将一个数进行 kk 次哈希运算,可以得到 kk 个位置,在长为 nn的布尔数组里面把这 kk个位置标为 true。查询时,只需要判断这 kk 个位置是否均为 true即可。

缺点

由于底层使用是哈希,哈希冲突会导致误判,这时可以自行设置参数来调整误判的概率。

参数

布隆过滤器提供了两个参数,分别是预计加入元素的大小 nn ,运行的错误率 ff。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ll,以及无偏 hash函数的个数 kk。 它们之间的关系比较简单:

错误率越低,位数组越长,控件占用较大

错误率越低,无偏 hash函数越多,计算耗时较长 。布隆过滤器提供了两个参数,分别是预计加入元素的大小 nn,运行的错误率 ff。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ll ,以及无偏 hash函数的个数 kk。 它们之间的关系比较简单:

错误率越低,位数组越长,空间占用越大

错误率越低,无偏hash函数越多,计算耗时越长

3.接口层校验

在业务入口(比如网关,Controller层)对参数进行校验,如果参数明显非法(比如出现负数,或者太大),直接拦截即可

编辑
2025-07-26
XCPC
00

XCPC比赛时使用的操作系统大部分情况为Ubuntu,这对于不熟悉linux的计算机小白十分不友好。这里旨在给大家提供一个简洁的编译运行方式,避免比赛环境中造成不必要的时间花费。

这里我使用的是与正式赛环境相同的操作系统。

image.png

先在桌面创建目录cpp

image.png

然后在vscode中打开cpp目录,创建main.cpp,in.txt,run.sh 三个文件

image.png

然后在run.sh文件中输入以下内容: (注意每次修改文件后按ctrl+s保存,当然你也可以设置自动保存)

g++ main.cpp -o main ./main < in.txt > out.txt cat out.txt

这段命令的作用是编译main.cpp程序,编译产生的二进制文件存放到main.exe, 然后执行main.exe, 输入数据来自in.txt, 程序输出结果放在out.txt, 然后打印输出结果

后续我们编译运行只需要执行这个脚本即可

在桌面点击打开终端

9429916f0a1381b7a91855e1ba61b46a.png

输入指令

cd cpp chmod +x run.sh

image.png 编写主函数,并将输入数据写入in.txt文件

image.png

打开终端,执行指令./run.sh (注意当前一定要处于cpp目录下) image.png 这样,程序的输出结果就存放在out.txt里了

image.png

下一次运行时,只需要输入!.指令即可(如果不懂,请前往学习linux指令语法)

image.png

如果你想在热身赛前熟悉比赛环境,需要在自己的电脑上安装Ubuntu虚拟机并配置gcc环境变量(当然正式赛的时候不用自己配置)。可以去B站搜索如何在本地安装linux虚拟机。