栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis缓存测试

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redis缓存测试

缓存的主要作用:

        缓存是将业务系统的数据处理结果,暂时在内存中保存,并且等待下次访问的时候,立马从内存中取出。

        在日常开发场景中,因为服务器的性能或者自身业务对数据处理非常耗时的时候,当发现业务系统的数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的瓶颈出现。

        应用缓存系统,就是将这些数据保存在内存中,当有其他线程或者客户端,查询相同的数据资源时,直接从缓存的内存中返回数据。

        这样不但可以提高系统的响应速度,同时也可以节省这些数据的处理流程及资源消耗,整体上来说,系统性能会有大大的提升。

缓存测试点:

1、缓存更新

                新增或者更新缓存数据,查看功能、数据是否正确

2、缓存删除

                删除缓存之后,对系统功能、性能的影响,是否根据缓存的过期策略正确删除缓存

3、缓存穿透

                查询一个一定不存在的数据,则不写入缓存,导致每次请求这个不存在的数据时,都要到存储层查询,失去了缓存的意义。在访问流量很大时,可能DB就挂掉了。如果有人利用不存在的key频繁攻击系统,这个就是漏洞

4、缓存雪崩

                设置缓存时,采用了相同的过期时间或者其它条件,导致缓存在某一时刻同时失效,请求全部转发到数据库,数据库瞬时压力过大导致挂掉

5、缓存服务停止

                关闭缓存服务,查看系统功能、性能运行情况

6、缓存超时

                缓存查询达到超时时间后,未返回指定数据,对系统的影响

7、缓存数据恢复

                缓存数据被误修改后,快速恢复到指定版本;缓存数据被误删除后,快速恢复数据

Redis测试场景实战

缓存穿透解决方案

空值缓存,如果一个查询返回的数据为空,我们仍然把这个结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

通过这个直接设置的默认值存放到Redis中,这样第二次到缓冲中获取就有值了,而不会继续访问数据库(减少数据库的压力)。

代码如下:

    @Test
    void redisTest1(){
        ValueOperations operations = redisTemplate.opsForValue();
        //1、从缓存中读取数据
        String stringData = operations.get("HotWords");
        if(StringUtils.isEmpty(stringData)){
            //2、模拟从数据库中读取数据
            String stringFromDB = queryFromDB();
            if(StringUtils.isEmpty(stringFromDB)){
                //库中没有此数据,存入一个空值,过期时间为5分钟
                operations.set("HotWords","",5, TimeUnit.MINUTES);
                //返回数据,我这里是测试方法,所以返回空,
                return;
            }else{
                operations.set("HotWords",stringFromDB);
                return;
            }
        }
        //缓存中有数据,直接返回
        return;
    }

测试点:在审计开发代码时,需要关注开发对空值的处理,取出数据后先进行非空校验,如果数据是空的,设置临时缓存数据

缓存雪崩解决方案

设置不同的过期时间,让缓存失效的时间点尽量均匀

代码如下:

@Test
    void redisTest1(){
        ValueOperations operations = redisTemplate.opsForValue();
        //1、从缓存中读取数据
        String stringData = operations.get("HotWords");
        if(StringUtils.isEmpty(stringData)){
            //2、模拟从数据库中读取数据
            String stringFromDB = queryFromDB();
            if(StringUtils.isEmpty(stringFromDB)){
                //库中没有此数据,解决缓存穿透问题,存入一个空值,过期时间为5分钟
                operations.set("HotWords","",5, TimeUnit.MINUTES);
                //返回数据,我这里是测试方法,所以返回空,
                return;
            }else{
                //将数据写入缓存,并设置一个随机的过期时间,解决缓存雪崩问题
                //生成0-1000之间的一个随机数,设置缓存随机在5-15个小时内过期
                Random random = new Random();
                int randomNum = random.nextInt(1000);
                operations.set("HotWords",stringFromDB,randomNum,TimeUnit.HOURS);
                return;
            }
        }
        //缓存中有数据,直接返回
        return;
    }

测试点:避免大量缓存集中在一段时间内失效,则会出现大量缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。

由于原有缓存失效,新缓存未存储,原来应该访问Redis的请求都去访问数据库了,所以需要随机设置过期时间。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/682222.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号