string line; while (getline(cin, line)) { stringstream ss(line); string s; while (ss >> s) { cout << s << endl; } }
热点数据缓存设置过期时间,过期的时候恰好发来了大量并发请求,大量并发请求可能直接导致数据库宕机。
在缓存重建之前加互斥锁,只有拿到锁的线程才会进行缓存重建,没有拿到锁的线程则会休眠重试。
没有拿到锁的线程会一直等待,性能较低。(强一致,性能差)
不给缓存设置真实的过期时间,而是新增一个过期时间字段,当查询到缓存时,判断这个数据是否真正过期了,如果是,新开一个线程进行缓存重建,当前线程则直接返回旧数据即可。缓存重建的过程同样需要加锁,对于没有抢到锁的线程,也是直接返回旧数据。
虽然性能得到了提升,但是查询到的数据可能是旧数据。(高可用,性能优,但数据可能不一致)
查询一个不存在的数据时,数据库(比如mysql)查询不到数据也不直接写入缓存,导致每次请求都会查询数据库,如果有人恶意查询空数据可能会导致数据库宕机
不存在的数据也放入缓存中,这样的缺点是,当有大量空数据时,会占用很多额外内存
布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存在,布隆过滤器说这个数存在可能不存在。当数据一定不存在时就可以直接返回。
将一个数进行 次哈希运算,可以得到 个位置,在长为 的布尔数组里面把这 个位置标为 true。查询时,只需要判断这 个位置是否均为 true即可。
由于底层使用是哈希,哈希冲突会导致误判,这时可以自行设置参数来调整误判的概率。
布隆过滤器提供了两个参数,分别是预计加入元素的大小 ,运行的错误率 。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ,以及无偏 hash函数的个数 。 它们之间的关系比较简单:
错误率越低,位数组越长,控件占用较大
错误率越低,无偏 hash函数越多,计算耗时较长 。布隆过滤器提供了两个参数,分别是预计加入元素的大小 ,运行的错误率 。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ,以及无偏 hash函数的个数 。 它们之间的关系比较简单:
错误率越低,位数组越长,空间占用越大
错误率越低,无偏hash函数越多,计算耗时越长
在业务入口(比如网关,Controller层)对参数进行校验,如果参数明显非法(比如出现负数,或者太大),直接拦截即可
XCPC比赛时使用的操作系统大部分情况为Ubuntu,这对于不熟悉linux的计算机小白十分不友好。这里旨在给大家提供一个简洁的编译运行方式,避免比赛环境中造成不必要的时间花费。



然后在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, 然后打印输出结果
后续我们编译运行只需要执行这个脚本即可

输入指令
cd cpp chmod +x run.sh
编写主函数,并将输入数据写入in.txt文件

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

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

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