redis缓存介绍以及常见问题

2019-08-14  本文已影响0人  程序员will

redis缓存介绍以及常见问题浅析

没缓存的日子

image

对于web来说,是用户量和访问量支持项目技术的更迭和前进。随着服务用户提升。可能会出现一下的一些状况:

  1. 页面并发量和访问量并不多,mysql足以支撑自己逻辑业务的发展。那么其实可以不加缓存。最多对静态页面进行缓存即可。
  2. 页面的并发量显著增多,数据库有些压力,并且有些数据更新频率较低反复被查询或者查询速度较慢。那么就可以考虑使用缓存技术优化。对高命中的对象存到key-value形式的redis中,那么,如果数据被命中,那么可以省经效率很低的db。从高效的redis中查找到数据。
  3. 当然,可能还会遇到其他问题,你可以需要静态页面本地缓存,cdn加速,甚至负载均衡这些方法提高系统并发量。这里就不做介绍。

缓存思想无处不在

我们从一个算法问题开始了解缓存的意义。

问题1:

分析1

static long jiecheng(int n)
{
    if(n==1||n==0)return 1;
    else {
      return n*jiecheng(n-1);
    }
}

这样每输入求一次需要执行n次。 问题2:

分析2

import java.util.Scanner;
public class test3 {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc=new Scanner(System.in);
    int t=sc.nextInt();
    long jiecheng[]=new long[21];
    jiecheng[0]=1;
    for(int i=1;i<21;i++)
    {
        jiecheng[i]=jiecheng[i-1]*i;
    }
   for(int i=0;i<t;i++) {
        int x=sc.nextInt();
        System.out.println(jiecheng[x]);
    }
}  
}

缓存的应用场景

需要注意的问题

是否用缓存

过期策略选择

数据一致性问题★

上面其实提到数据一致性问题。如果对一致性要求极高那么不建议使用缓存。下面稍微梳理一下缓存的数据。 在redis缓存中经常会遇到数据一致性问题。对于一个缓存。下面罗列逼仄

read:从redis中读取,如果redis中没有,那么就从mysql中获取更新redis缓存。 该流程图描述常规场景。一般没啥争议。

image

写1:先更新数据库,再更新缓存(普通低并发)

image

写2:先删除缓存,再写入数据库(低并发优化)

image

解决的问题

存在的问题

image

写3:延时双删策略

image

写4:直接操作缓存,定期写入sql(适合高并发)

[图片上传失败...(image-521252-1565770519509)]

总之,越是高并发、越是对数据一致性要求高的方案在数据一致性的设计方案需要考虑和顾及越复杂、越多。上述也是笔者针对redis数据一致性问题的学习和自我发散(胡扯)学习。如果有解释理解不合理或者还请联系告知!

缓存穿透、缓存雪崩和缓存击穿

如果不了解,可能对这几个概念都不了解,听着感觉太高大上,至少笔者刚开始是这么觉得,本文并不是详细介绍如何解决和完美解决,更主要的是认识和认知吧。

redis缓存穿透

image

理解

解决方案

redis缓存雪崩

理解

image

解决方案

redis缓存击穿

理解

image

解决方案

总结与感悟

其实缓存看起来,理解起来看似简单然而实际上的设计方案非常有学问。在细节设计上还会遇到消息队列、布隆过滤器、分布式锁、服务降级、熔断、分流这些。在缓存处理上甚至还有缓存预热(提前缓存部分热点数据防止刚开始缓存全部命中导致服务崩掉)等其他热门名词和问题这里就不做介绍了。

上一篇下一篇

猜你喜欢

热点阅读