03月28, 2020

【Redis学习笔记】—应用场景、数据类型、雪崩、穿透、击穿

仔细体会这句话

你知道的越多,你不知道的越多

使用场景

传统Mysql已经不能满足所有场景,比如,秒杀商品库存扣减,App流量访问高峰,很多高并发场景都有可能吧redis打崩,于是引入缓存中间件,常用的有RedisMemcached

  • 延伸:Redis和Memcached的优缺点

    Redis优点:

    1、 速度快,内存型Key-Value存储,查找时间复杂度O(1);

    2、数据类型丰富:List、Set、Zset、Hash、Geo等;

    3、支持事务,操作原子性;

    4、功能多:自定义过期时间、跳表、哨兵、分布式锁实现等;

    Redis相比于Memcached的优点:

    1、Memcached 存储是简单的字符串,没有Redis数据类型丰富;

    2、Redis速度比Memcached快;

    3、Redis支持持久化(AOF和RDB);

常用数据类型

常用:String、List、Set、SortedSet、Hash

拓展:HyperLogLog、Geo、Redis Module、BloomFilter(布隆过滤器)、RedisSearch、Redis-ML

常见三大问题(缓存雪崩、缓存穿透、缓存击穿)

1、缓存雪崩:

  • 场景:

    一般热点数据都会存在缓存中,通过定时任务或者查询的时候查不到再更新缓存, 当使用定时任务刷缓存时,如果设置的Key过期时间一样,那有可能这些Key会在同一时间失效,然后此时正处在高并发场景下,大量请求到redis中查询,查不到数据就会打到数据库上,把库打崩,重启数据库立马又被打死。

  • 处理方法

    1、如果非要设置过期时间,在设置Key过期时间时加上随机数,保证不会有大量Key在同一时间过期。

    2、不使用过期时间

2、缓存穿透:

  • 场景

    用户要访问的数据在redis和库里都没有的,如果是恶意用户使用这种方式大量访问,请求直接穿过redis打到库上,最后把库打崩。

  • 处理方法:

    在访问redis之前做一层数据合法性校验,校验不通过直接返回。

    1、缓存中取不到值,库里也取不到值,可以设这个值为null,然后返回个“请稍后重试”之类的话;缓存时间也可以设短点,比如30秒。

    2、对于恶意用户,可以在NG层面对IP做一层校验,如果某个IP每秒请求次数打到阈值,直接将这个IP加黑名单。

  • 拓展:

    布隆过滤器(Bloom Filter):

    原理是对一个Key进行K次hash算法得到K个值,然后将这K个值放到数组中并且下标设为1,查询的时候,布隆过滤器对Key同样K次hash后判断这K个值对应的下标是否为1,如果是说明存在此Key,但是布隆过滤器也存在误判可能(hash算法通病),如果布隆过滤器判断不存在,那就肯定不存在;如果布隆过滤器判断存在,那有可能不存在(hash结果相同)。

    redis中的bitmap 最大支持2^32,对应内存中是512MB,可以放下2亿左右的数据,误判率大概万分之一,布隆过滤器数据越多,误判率越大

    其次,布隆过滤器删除元素也不是绝对的安全,因为有可能会删除其他Key计算的值对应的下标,这样在那个Key来查询的时候就会找不到。

3、缓存击穿:

  • 场景:

    缓存击穿和缓存雪崩类似,也是由于Key失效造成的,不过是因为单个Key,假如有一个Key扛着线上高并发,某一时刻这个Key失效了,大量请求访问这个Key,请求不到直接打到了库上,库又被打崩了。

  • 处理方法:

    设置热点数据永不过期,对热点数据再加上互斥锁。

总结

本文介绍了Redis的使用场景、基本数据类型、和常见的几种问题(缓存的雪崩、穿透、击穿)以及分别的解决方法。

拓展:

一般避免已上情况从三个时间段分析:

事前:Redis高可用,主从+哨兵,redis cluster,避免全盘崩溃。

事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL被打死。

事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

好处:

数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。只要数据库不死,就是说,对用户来说,3/5 的请求都是可以被处理的。只要有 3/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来一次。

本文链接:http://blog.keepting.cn/blog//post/redis_0.html

-- EOF --

Comments