瑞_Redis_商户查询缓存_什么是缓存

本文基于《黑马点评》项目,总结Redis相关知识。介绍了项目功能,如短信登录、商户查询缓存等。重点讲解了缓存概念,包括应用场景、使用原因、在Web应用中的作用及成本,还提及为降低Mysql压力使用Redis集群,最后附上缓存封装工具类。

🙊 前言:本文章为瑞_系列专栏之《Redis》的实战篇的商户查询缓存章节的什么是缓存小节。由于博主是从B站黑马程序员的《Redis》学习其相关知识,所以本系列专栏主要是针对该课程进行笔记总结和拓展,文中的部分原理及图解等也是来源于黑马提供的资料,特此注明。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!

  • 主机操作系统:Windows10
  • VMware版本: VMware Workstation 16.2.4
  • Linux版本:CentOS 7 64位
  • 远程连接工具:MobaXterm_Personal_23.2
  • Redis版本:redis-6.2.6.tar.gz
  • Redis客户端:resp-2022.2.0.0
  • MySQL版本:8.0.29(5.7+均可)
  • Navicat Premium:15.0.28
  • JDK:1.8

相关链接:《瑞_VMware虚拟机安装Linux纯净版(含卸载,图文超详细)》
相关链接:《瑞_Redis_短信登录》

瑞&3l

项目介绍

  本文基于B站黑马程序员的《黑马点评》项目进行学习笔记总结和拓展,项目的相关资源和课程视频可以到B站获取。
  博主提供的该项目的相关资源的某度网盘链接:https://pan.baidu.com/s/1N-yr86yTRi3LbQdAL7prEQ?pwd=q0ry

  本项目具有以下功能点,本文为《商户查询缓存》篇的什么是缓存小节

在这里插入图片描述

  • 短信登录
    这一块我们会使用redis共享session来实现

  • 商户查询缓存
    通过本章节,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题,让小伙伴的对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容

  • 优惠卷秒杀
    通过本章节,我们可以学会Redis的计数器功能, 结合Lua完成高性能的redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列

  • 附近的商户
    我们利用Redis的GEOHash来完成对于地理坐标的操作

  • UV统计
    主要是使用Redis来完成统计功能

  • 用户签到
    使用Redis的BitMap数据统计功能

  • 好友关注
    基于Set集合的关注、取消关注,共同关注等等功能,这一块知识咱们之前就讲过,这次我们在项目中来使用一下

  • 达人探店
    基于List来完成点赞列表的操作,同时基于SortedSet来完成点赞的排行榜功能

由于该项目主要是为了学习Redis,所以不会设计为微服务架构,简化代码复杂度,所以采用前后端分离的单体架构

说明

  手机或者app端发起请求,请求我们的nginx服务器,nginx基于七层模型走的事HTTP协议,可以实现基于Lua直接绕开tomcat访问redis,也可以作为静态资源服务器,轻松扛下上万并发, 负载均衡到下游tomcat服务器,打散流量,我们都知道一台4核8G的tomcat,在优化和处理简单业务的加持下,大不了就处理1000左右的并发, 经过nginx的负载均衡分流后,利用集群支撑起整个项目,同时nginx在部署了前端项目后,更是可以做到动静分离,进一步降低tomcat服务的压力,这些功能都得靠nginx起作用,所以nginx是整个项目中重要的一环。

  在 tomcat 支撑起并发流量后,我们如果让 tomcat 直接去访问 Mysql ,根据经验 Mysql 企业级服务器只要上点并发,一般是16或32 核心cpu,32 或64G内存,像企业级mysql加上固态硬盘能够支撑的并发,大概就是4000起~7000左右,上万并发, 瞬间就会让Mysql服务器的cpu,硬盘全部打满,容易崩溃,所以我们在高并发场景下,会选择使用mysql集群,同时为了进一步降低Mysql的压力,同时增加访问的性能,我们也会加入Redis,同时使用Redis集群使得Redis对外提供更好的服务。

在这里插入图片描述

1 短信登录

瑞:见《瑞_Redis_短信登录》




2 商户查询缓存

  本章节基于hm-dianping【1.3Redis代替session的业务流程】的代码,需要请自取

链接:https://pan.baidu.com/s/1DomlH_sXyAkrciXk8-bWww?pwd=z6lu 
提取码:z6lu

2.1 什么是缓存

缓存就是数据交换的缓冲区(称作Cache [ kæʃ ] ),是存贮数据的临时地方,一般读写性能较高

2.1.1 缓存的应用场景

  缓存的应用场景:浏览器缓存、应用层缓存(如Redis)、数据库缓存(如:索引)、CPU多级缓存、磁盘缓存

  • 浏览器缓存:主要是存在于浏览器端的缓存

  • 应用层缓存:可以分为tomcat本地缓存,比如之前提到的map,或者是使用redis作为缓存

  • 数据库缓存:在数据库中有一片空间是 buffer pool,增改查数据都会先加载到mysql的缓存中

  • CPU缓存:当代计算机最大的问题是 cpu性能提升了,但内存读写速度没有跟上,所以为了适应当下的情况,增加了cpu的L1,L2,L3级的缓存

在这里插入图片描述

  CPU多级缓存的诞生:在计算机中,主要的构造为CPU、内存、磁盘。由于CPU的运算能力随着科技的发展,其计算能力已经远远的超过内存和磁盘的读写数据的能力,但是CPU所做的任何运算都需要从内存或者磁盘中读到数据,再放到自己的寄存器里,才可以进行运算。正是由于这种数据读写的能力远远低于CPU的运算能力,导致计算机性能受到瓶颈。所以人们在CPU的内部添加了缓存,即CPU会把经常需要读写的数据放入CPU缓存中,当进行高速运算的时候,就不需要每次都去内存或磁盘中读取数据再运算,而是直接从缓存中获取数据直接运算,这样就可以充分释放CPU的运算能力。

  缓存的常见使用示例

1:Static final ConcurrentHashMap<K,V> map = new ConcurrentHashMap<>(); 本地用于高并发

例2:static final Cache<K,V> USER_CACHE = CacheBuilder.newBuilder().build(); 用于redis等缓存

例3:Static final Map<K,V> map =  new HashMap(); 本地缓存

由于其被Static修饰,所以随着类的加载而被加载到内存之中,作为本地缓存,由于其又被 final 修饰,所以其引用 (例3:map) 和对象 (例3:new HashMap()) 之间的关系是固定的,不能改变,因此不用担心赋值(=)导致缓存失效。

2.1.2 为什么要使用缓存

一句话:因为速度快,好用

  缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力

  实际开发过程中,企业的数据量,少则几十万,多则几千万,这么大的数据量,如果没有缓存来作为"避震器",系统是几乎是撑不住的,所以企业会大量运用到缓存技术。

2.1.3 Web应用中缓存的作用

缓存的作用

  1️⃣ 降低后端负载:请求先进入缓存中查找数据,若缓存中不存在再将请求向数据库发送,大大降低后端数据库压力。

  2️⃣ 提高读写效率,降低响应时间

2.1.4 Web应用中缓存的成本

缓存的成本

  1️⃣ 数据一致性成本:数据本身只保存在数据库,现在将数据缓存了一份放到了内存中(如Redis),如果数据库中的数据发生了变化而缓存中的数据仍然是旧数据,由于请求先进入缓存中查找数据,就会造成数据的不一致性。

  2️⃣ 代码维护成本:由于要保证数据一致性,自然会增加业务编码,且会出现缓存穿透、雪崩、击穿等问题,会大幅度提高代码复杂度。

  3️⃣ 运维成本:为了避免缓存雪崩或缓存的高可用,需要搭建成缓存集群模式,提高了运维成本。

瑞:后续内容请关注瑞_系列专栏之《Redis》

附:缓存封装工具类

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 缓存工具类
 * <br>
 * Component / 实现 bean 的注入
 */
@Component
@SuppressWarnings("all")
public final class RedisUtil {
   
   
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 时间有效期 左区间
     */
    private final static int TIME_EXPIRE_LEFT = 300;
    /**
     * 时间有效期 右区间
     */
    private final static int TIME_EXPIRE_RIGHT = 3000;

    // =============================common============================

    /**
     * 指定缓存失效时间
     * <br>
     * 防止缓存雪崩。
     * 过期时间 = 基础时间 + 随机时间,让缓存慢慢过期,避免瞬间全部过期,对 DB 产生过大压力
     *
     * @param key  键
     * @param time 时间(秒)
     */
    public boolean expire(String key, long time) {
   
   
        try {
   
   
            if (time > 0) {
   
   
                redisTemplate.expire(key, time + MathUtil.getIntRandom(TIME_EXPIRE_LEFT, TIME_EXPIRE_RIGHT), TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
   
   
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据key 获取过期时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑞486

你的点赞评论收藏才更是动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值