数据缓存
将热点数据放到内存中,设置内存的最大使用量以及过期淘汰策略来保证缓存的命中率。
缓存雪崩和缓存击穿
- 雪崩:如果大量的key过期时间设置的过于集中,到过期的那个时间点,Redis可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,我们一般需要在时间上加一个随机值,使得过期时间分散一些。
- 击穿:大量的请求都不存在缓存中,直接查询了数据库
大数据量去重
boolfilter
原理
当一个元素加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,并置为1。查找的时候,只要这几个位点存在一个0,则一定不存在;如果都为1,则该元素可能存在。
应用场景
- 缓存穿透:每次查询都直接打到数据库,没有使用缓存
- 爬虫过滤:将采集下来的url放在集合中,每次采集前先查询一遍
bitmap
优缺点
优点
- 省空间,使用bit存储
- 操作快,读为O(1),写为O(n)
- 方便扩容,方便计算
缺点
- 限制在512MB内,最大为2^32位
使用场景
- 用户在线状态
- 统计活跃用户
- 用户签到
轻量级分布式锁
- 互斥性: 使用
setnx
抢占锁。 - 避免永远不释放锁: 使用
expire
加一个过期时间,避免一直不释放锁,导致阻塞。 - 原子性:
setnx
和expire
必须合并为一个原子指令,避免setnx
后,机器崩溃,没来得及设置expire
,从而导致锁永不释放。
计数器
支持很频繁的读写操作
应用限流
进行流量降级
消息队列
- list
- stream
- zset 用时间戳做score,内容做key,消费者使用
zrangebyscore
消费N秒之前的数据,延时队列
排行榜、点赞、投票
使用 ZSET 数据类型。
查找表
可以将Session,用户信息等放进来
自动补全
时间线
ID生成、短网址
ID生成
- 使用
incr
或incrby
生成
短网址
- 为目标网站生成新的数字ID,可以使用
incr
或incrby
生成 - 将十进制数字转换成36进制数字来创建短网址
- 将短网址作为key,目标网址作为value放入哈希表中