数据结构论坛

注册

 

发新话题 回复该主题

Redis雪崩击穿穿透 [复制链接]

1#

Redis雪崩:指Redis集群出现大面积问题,或者大量key值同时过期,导致大量请求并发的请求数据库,导致数据库崩溃。例如:redis中key的过期时间为0点,但是0点有秒杀活动,同时个请求访问,原本redis可以挡住个请求,但由于redis的key值过期,所以都要请求数据库查询,导致数据库宕机。重启数据库一样会再次打废。解决方式:1、在设置key值的失效时间时候加个随机值2、集群环境的时候可以选择将热点数据放在不同的redis库中。3、设置key值为永不失效,数据更新的时候刷新缓存。

Redis击穿:跟雪崩类似,但指对单独一个key来说。例如:redis的某一个key值的过期时间为12点,但是12点的时候遭受恶意攻击等,一下大量并发请求同时获取这个key的值,都要去请求数据库连接,这是就会造成数据库崩溃。解决方式:1、设置key值为永不失效,数据更新的时候刷新缓存。2、使用互斥锁。

Redis穿透:这种情况指查询的时候数据库中没有这个值,那么这个值也就不会存储在redis中,相当于没有redis集群这一层,那么大量的并发请求袭来,一样会导致数据库崩溃。解决方式:1、在接口层中增加数据校验,肯定查询不到的数据直接return。2、缓存空值,如果查询没值就缓存一个null或"",但是会造成空间浪费,所以可以设置个较短的过期时间,例如60s。3、redis中有个高级用法(布隆过滤器),他是一种数据结构,将查询条件存储在布隆过滤器中,如果查询条件有值则查询,没值直接返回。布隆过滤器:布隆过滤器是一种数据结构,一个存储二进制(0/1)的列表,通过hash算法计算当前key的hash值,如果计算的hash值为1,那么将列表中索引1位置置为1,如果hash值为7那么将所以为7的位置置为1。查询的时候如果key值通过hasg算法计算后对应列表的位置为1,那么就代表这个key有值。缺点:他可以判断某个数据一定不存在,但是没法判断一定存在,因为存在哈希冲突。而且没法删除数据。

布隆过滤器的另一个作用:推荐去重

例如新闻客户端的推送去重功能,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。

实际上,如果历史记录存储在关系数据库里,去重就需要频繁地对数据库进行exists查询,当系统并发量很高时,数据库是很难扛住压力的。如果使用缓存把历史记录都放入缓存里,占用空间太大明显不现实,这个时候布隆过滤器就登场了,它就是专门用来解决这种去重问题的。它在起到去重的同时,在空间上还能节省90%以上,只是稍微有那么点不精确,也就是有一定的误判概率。

用户浏览记录存入数据库时,会在Filter上通过key的hash算法存储判断其是否存在,类似于数据存在数据库中,判断该数据是否存在的信息即元数据存放在BloomFilter中,避免了每次判断数据是否存在都要去数据库exist一遍;这样推送新闻时通过布隆过滤器判断,推送内容是否已经存在,如果存在则不推送,如果不存在则推送;

布隆过滤器可以准确过滤你已经看过的内容,没有看过的新内容,可能由于误判率过滤掉极小的一部分,这样就可以保证推荐给用户的都是无重复的。

预览时标签不可点收录于话题#个上一篇下一篇
分享 转发
TOP
发新话题 回复该主题