Redis

概述

Redis是一个以键-值对存储数据的非关系型数据库。

Redis应用场景
  • 缓存
  • 任务队列
  • 数据过期处理
  • 应用排行榜
  • 网站访问统计
Redis数据结构

Redis主要有5种数据类型,包括String字符串,List列表,Set无序集合,Zset有序集合,Hash哈希

缓存穿透

key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

解决方案:
第一种方式是布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
第二种方式是将查询出来不存在的值也缓存起来,设置一个较短的过期时间。

缓存击穿

key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方案:
第一种方式是使用互斥锁:在缓存失效的时候先不去查询db,而是先设置锁(redis的SETNX),设置成功才去数据库load db,否则sleep后再重试。
SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。

public String get(key) {
      String value = redis.get(key);
      if (value == null) { //代表缓存值过期
          //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
      if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表设置成功
               value = db.get(key);
                      redis.set(key, value, expire_secs);
                      redis.del(key_mutex);
              } else {  //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
                      sleep(50);
                      get(key);  //重试
              }
          } else {
              return value;      
          }
 }

第二种方式:设置热点数据永不过期
第三种方式:定时主动刷新热点缓存

缓存雪崩

多个key在同一时段失效,都去数据库查询,造成数据库压力增大,越来越多的查询压力增加到数据库,导致数据库崩溃。

解决方案:
第一种方式:在缓存失效的时候通过加锁或者队列的方式去请求数据库。
第二种方式:多个key设置不同的过期时间。

https://mp.weixin.qq.com/s/8pcQ-Hbq5Wbpni9lI-8WCQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值