当前位置: 代码网 > it编程>编程语言>Java > Springboot+Redis:实现缓存 减少对数据库的压力

Springboot+Redis:实现缓存 减少对数据库的压力

2024年08月02日 Java 我要评论
关于 Redis 缓存的解释如下:Redis 如何实现缓存?在后端接收到请求后,对于需要进行缓存的接口,首先会在 Redis 中查找是否有对应的数据。如果缓存中不存在数据,系统会继续按照正常的业务流程处理请求,并将查询到的结果返回给客户端的同时也存储在 Redis 中。下次相同的请求到达时,系统可以直接从 Redis 中获取数据,而无需访问数据库。在启用缓存后,相同的请求在缓存有效期内不会再去读取数据库。但是,如果在此期间修改了数据库中的数据,接口返回的数据就无法保证与数据库一致。因此,在进行增、删、

963034f17590412b808770f619144970.png

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏redis实战与进阶

本专栏讲解redis从原理到实践

这是苏泽的个人主页可以看到我其他的内容哦👇👇

 


缓存如何实现?面试必考题  请看 我的讲解以及最佳实践吧

目录

缓存如何实现?面试必考题  请看 我的讲解以及最佳实践吧

关于 redis 缓存的解释如下:

实现思路图

商户缓存跟着视频做的,然后我按照同样的方法逻辑 把商店类型的缓存自己做了一遍

首先注册一个ishoptypeservice服务的对象typeservice 然后直接调用typeservice的方法querytypelist()

 

下一节我们来讲解 redis缓存击穿 缓存雪崩等缓存更新会发生的问题  都是redis的面试必考题


 

关于 redis 缓存的解释如下:

  1. redis 如何实现缓存?
    在后端接收到请求后,对于需要进行缓存的接口,首先会在 redis 中查找是否有对应的数据。如果缓存中不存在数据,系统会继续按照正常的业务流程处理请求,并将查询到的结果返回给客户端的同时也存储在 redis 中。下次相同的请求到达时,系统可以直接从 redis 中获取数据,而无需访问数据库。

在启用缓存后,相同的请求在缓存有效期内不会再去读取数据库。但是,如果在此期间修改了数据库中的数据,接口返回的数据就无法保证与数据库一致。因此,在进行增、删、改操作时,需要刷新缓存。

  1. redis 缓存更新策略是什么?
    缓存更新可以采用不同的策略,以下是两种常见情况的比较:

第一种情况是先更新数据库,然后同步更新缓存,或者先更新缓存,然后同步更新数据库。这两种方式都属于写穿透(write through)策略。同步更新的好处是可以保持数据的一致性,但缺点是同步更新会对性能产生影响。

第二种情况是先更新缓存,然后异步写回数据库,也被称为写回(write back)策略。异步写回的优点是不会影响缓存的高性能,能够快速响应客户端请求。但缺点是在数据异步写回数据库之前,缓存与数据库的数据可能短暂不一致。

79f917f097604d2187a0232970ee5e97.png

实现思路图

aaa8abb1c5ee4daa90056f83b79058b0.png

 

商户缓存跟着视频做的,然后我按照同样的方法逻辑 把商店类型的缓存自己做了一遍

以下是步骤

首先注册一个ishoptypeservice服务的对象typeservice 然后直接调用typeservice的方法querytypelist()

@restcontroller
@requestmapping("/shop-type")
public class shoptypecontroller {
    @resource
    private ishoptypeservice typeservice;

    @getmapping("list")
    public result querytypelist() {
//        list<shoptype> typelist = typeservice.query().orderbyasc("sort").list();
        return typeservice.querytypelist();
    }
}

在ishoptypeservice接口中我们定义这个抽象方法 然后在ishoptypeservice的实现类ishoptypeserviceimp中实现这个方法

public interface ishoptypeservice extends iservice<shoptype> {

    result querytypelist();
}
@service
public class shoptypeserviceimpl extends serviceimpl<shoptypemapper, shoptype> implements ishoptypeservice {
    @resource
    private stringredistemplate stringredistemplate;
    @resource//引入mybatis的接口 用于查数据库
    private ishoptypeservice shoptypeservice;
    @override
    public result querytypelist() {
        //1.从redis中查询有无
        string shoptypejson = stringredistemplate.opsforvalue().get("shoptype");
        //2.判断是否存在
        if (strutil.isnotblank(shoptypejson)){
            //3.存在直接返回 jsonutil.parsearray将json 数组字符串转换为 java 对象列表
            list<shoptype> shoptype= beanutil.copytolist(jsonutil.parsearray(shoptypejson), shoptype.class);
//            system.err.println(shoptype);
            return result.ok(shoptype);
        }
        //不存在 查询数据库
        list<shoptype> shoptypelist = shoptypeservice.query().orderbyasc("sort").list();

        //数据库不存在 返回报错
        if (shoptypelist ==null) {
            return result.fail("查询失败");
        }
        //数据库存在 写入redis  返回
        //将list转换成json 要用tojsonstr不能tostring
        string str = jsonutil.tojsonstr(shoptypelist);
        stringredistemplate.opsforvalue().set("shoptype",str);
//        system.err.println(str);
        return result.ok(shoptypelist);
    }
}
  • 首先,从 redis 中查询数据是否存在。
  • 如果数据存在,将 json 数组字符串转换为 list<shoptype> 对象,并直接返回结果。
  • 如果数据不存在于 redis 中,则从数据库查询商店类型列表。
  • 如果数据库查询失败,返回查询失败的错误信息。
  • 如果数据库查询成功,将查询结果转换为 json 字符串,并存储到 redis 中。
  • 最后,返回查询结果。

 

下一节我们来讲解 redis缓存击穿 缓存雪崩等缓存更新会发生的问题  都是redis的面试必考题

 

 

 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com