针对热点数据的处理

2023-10-31

出现问题:

当热点数据被并发且大量的访问时,将有大量的请求发送到数据库,数据库的压力会随之增大,从而产生一系列的问题

解决办法:

我们可以将数据加载到Redis缓存中,从而请求可以直接在缓存获取数据,减轻数据库的压力

大体思路:

在这里插入图片描述

实现方式一:Spring Data Redis

前言:

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。
网址:Spring Data Redis官网
在这里插入图片描述
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
*
V a l u e O p e r a t i o n s :简单 K − V 操作 S t r i n g 数据操作 \color{#FF0000}{ValueOperations:简单K-V操作String数据操作} ValueOperations:简单KV操作String数据操作
*
S e t O p e r a t i o n s : s e t 类型数据操作 \color{#FF0000}{SetOperations:set类型数据操作} SetOperationsset类型数据操作
*
Z S e t O p e r a t i o n s : z s e t 类型数据操作 \color{#FF0000}{ZSetOperations:zset类型数据操作} ZSetOperationszset类型数据操作
*
H a s h O p e r a t i o n s :针对 h a s h 类型的数据操作 \color{#FF0000}{HashOperations:针对hash类型的数据操作} HashOperations:针对hash类型的数据操作
*
L i s t O p e r a t i o n s :针对 l i s t 类型的数据操作 \color{#FF0000}{ListOperations:针对list类型的数据操作} ListOperations:针对list类型的数据操作

项目要求:Redis中菜品缓存数据KEY的设计:dish_分类id

一:导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二:添加缓存的代码例子

/**
     * 根据分类id查询菜品
     *
     * @param categoryId  菜品分类id
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询菜品")
    public R<List<DishVO>> list(Long categoryId) {
        //构造redis的key
        String key="dish_"+categoryId;
        //从Redis中获得缓存数据
        List<DishVO> list= (List<DishVO>) redisTemplate.opsForValue().get(key);
        //若缓存中存在该数据则直接返回,若没有执行添加缓存的操作
        if (list != null) {
            return R.success(list);
        }
        //封装查询条件
        Dish dish = new Dish();
        dish.setCategoryId(categoryId);
        dish.setStatus(Dish.ON);
		//根据查询条件查询对应菜品信息
        list = dishService.listWithFlavor(dish);
        //将查到的菜品信息和对应的缓存kay存储到Redis中
        redisTemplate.opsForValue().set(key,list);
        //返回查到的菜品信息
        return R.success(list);
    }
}

三:删除缓存

前提:当数据被更改或删除时,Redis缓存的数据也要同步更新

封装清理缓存的方法:

/**
     * 抽取清除缓存的方法
     * @param pattern
     */
    private void clearCache(String pattern){
    //删除无法进行模糊删除,所以先查询保存到set集合,再删除
        Set keys = redisTemplate.keys(pattern);
        redisTemplate.delete(keys);
    }

进行删除操作:

clearCache("dish_*");

实现方式二:Spring Cache

前言

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

Spring Cache提供了一层抽象,底层可以切换不同的缓存实现。
CacheManager(缓存管理器)是Spring提供的各种缓存技术抽象接口。

针对不同的缓存技术需要实现不同的CacheManager:
在这里插入图片描述

RedisChacheManager常用注解

在这里插入图片描述

一:导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

二:在启动类上开启缓存注解功能

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching//开启注解式缓存功能
public class ReggieApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.class, args);
        log.info("server started");
    }
}

三:查询方法使用

/**
     * 条件查询
     *
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询套餐")
    //redis的key 由cacheNames+key组成
    @Cacheable(cacheNames = "SetmealCache",key = "#categoryId")
    public R<List<Setmeal>> list(Long categoryId) {
        Setmeal setmeal = new Setmeal();
        setmeal.setCategoryId(categoryId);
        setmeal.setStatus(StatusConstant.ENABLE);

        List<Setmeal> list = setmealService.list(setmeal);
        return R.success(list);
    }

四:删除缓存

/**
     * 新增套餐
     * @param setmealDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增套餐")
    //删除所有SetmealCaChe
    @CacheEvict(cacheNames = "SetmealCache",key = "#setmealDTO.categoryId")
    public R save(@RequestBody SetmealDTO setmealDTO) {
        setmealService.saveWithDish(setmealDTO);
        return R.success();
    }

添加缓存拓展

@PostMapping
@Cacheable(cacheNames = "SetmealCache",key = "#user.id")
//#result用于引用方法调用的结果。对与支持的包装器,例如Optional,@result指的是实际对象,而不是包装器
//@Cacheable(cacheNames = "SetmealCache",key = "#result.id")
//方法参数可以通过索引访问。例如,可以通过#root.args[1]、#p1或#a1访问第二个参数,如果该信息可用,也可以按名称访问参数
//@Cacheable(cacheNames = "SetmealCache",key = "#p0.id")
//@Cacheable(cacheNames = "SetmealCache",key = "#a0.id")
//方法名称(#root.methodName)和目标类(#root.targetClass)的快捷方式也可用
//@Cacheable(cacheNames = "SetmealCache",key = "#root.args[0].id")
public User save(@RequestBody User user){
	userMapper.insert(user);
	return user;
}

二种实现方法的区别

Spring Data Redis:虽然较注解来说复杂、麻烦但是对于一个方法中要进行多种数据缓存时,灵活性高
Spring Cache:简单快捷

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

针对热点数据的处理 的相关文章

随机推荐

  • 计算机考研各个院校自主命题吗,2014考研哪些高校计算机考研是自主命题?

    最佳答案 已确定自主命题的高校 1 哈尔滨工业大学 考试科目 数据结构 计算机组成原理 2 南京大学 考试科目 同统考科目 3 南京大学软件学院 考试科目 数据结构 软件工程 操作系统和计算机网络 4 东南大学 考试科目 数据结构 计算机组
  • html中写接口调用数据,jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例...

    本文实例讲述了jQuery Ajax js实现请求json格式数据并渲染到html页面操作 分享给大家供大家参考 具体如下 1 先给json格式的数据 id 1 name stan id 2 name jack id 3 name lucy
  • 合宙Air105

    扩展阅读 合宙Air105 fatfs io操作 扩展 SPI 可调功放 I2C SPI toHex os remove LuatOS SOC接口 官方demo 学习 15 1 fatfs文件系统 打酱油的工程师的博客 CSDN博客 合宙A
  • Uformer: A General U-Shaped Transformer for Image Restoration阅读笔记

    Abstract 构建一个分层的编码 解码器 并使用Transformer block进行图像恢复 Uformer两个核心设计 1 local enhanced window Transformer block 使用非重叠窗口自注意力降低计
  • js 密码正则表达式(至少8位且必有数字+特殊字符+字母)

    正则 var reg A Za z d lt gt A Za z d lt gt 8 可用 test 方法验证 reg test value 参考 js正则验证特殊字符 summer7310 博客园 正则表达式 密码必须至少包含八个字符 至
  • 《人工智能》知识总结

    知识图谱表示法 1 知识图谱主要用于智能搜索 智能问答 个性化推荐 多维导航 内容分发等领域 2 语义网络更侧重于表示概念与概念之间的关系 知识图谱更侧重于表示实体与实体之间的关系 3 已有图谱作用于实体 发现 扩充新的知识图谱 4 知识图
  • Map之TreeMap

    我们先不谈TreeMap我们来直接聊聊HashMap 首先当我们用HashMap存储数据的时候 我们要如何将给出的数据排序呢 这是一个问题 那么TreeMap本身是支持排序的 是对key进行的排序 但是需要用户定义 实现排序 主要有两种方法
  • 使用智星云stable diffusion创建ai创意绘画

    目录 租赁选择 控制台 参数选择 下载图片 结束租用 租赁选择 选择完以后 下面会列出可用的显卡型号 选择对应需要的就可以 2080ti 1080ti都能跑 只不过显存越大的卡 能画的图越大 速度也越快 点击租用 用默认值即可 然后创建实例
  • 弱电人要学习的网络安全基础知识

    提到网络安全 一般人们将它看作是信息安全的一个分支 信息安全是更加广义的一个概念 防止对知识 事实 数据或能力非授权使用 误用 篡改或拒绝使用所采取的措施 说白了 信息安全就是保护敏感重要的信息不被非法访问获取 以及用来进 步做非法的事情
  • html搜索区域选择框,带搜索过滤功能的jQuery国家地区选择下拉框插件

    nicecountryinput js是一款带搜索过滤功能的jQuery国家地区选择下拉框插件 该下拉框插件通过简单的代码就可以实现所有国家和地区的选择下拉框 并且可以通过搜索框对国家地区名称进行搜索 使用方法 在页面中引入jquery m
  • ENVI 混合像元分解

    一 混合像元分解的过程 在影像已经完成预处理的前提下 如几何校正 大气校正 去噪等 混合像元分解的一般的过程 首先获取端元波谱 从图像上 波谱库中或者其他来源 然后选择一种分解模型在每个像素中获取每个端元波谱的相对丰度图 最后从丰度图上提取
  • 3. Flutter——HTTP请求

    dio数据请求 HTTP 添加依赖 dependencies dio 1 0 9 版本 get 请求 import package dio dio dart Dio dio new Dio var response await dio ge
  • Vue-element-admin在左上角添加LOGO的方法

    本文主要是分享一下思路的 如不想看可以直接跳到最后 做项目时有一个在左上角添加logo的需求 但是element admin貌似没有添加logo的位置 于是我先在页面中检查侧边栏 发现它是sidebar container类 于是我在vsc
  • eclipse中使用log4j2在控制台输出彩色日志

    目录 一 eclipse中安装Ansi Console 二 在log4j2配置文件中配置颜色样式 三 在log4j2 component properties 配置文件中启用颜色配置 四 附上log4j2配置文件 1 log4j2 xml
  • left join 连表问题解析:on后多条件无效 & where与on的区别

    在项目中用到多表联合查询 发现2个现象 今天解决这2个疑问 1 left join连接2张表 on后的条件第一个生效 用and连接的其他条件不生效 2 一旦加上where 则显示的结果等同于inner join 先写结论 过滤条件放在 wh
  • 停止一下或多个进程以继续安装 vmware-vmx.exe 问题解决

    1 起因 用vmware大虚拟机做大数据集群经常出现某个虚拟机起不来 还导致vmware无法关闭 提示某某虚拟机繁忙 经网友提示 升级到15 pro可以解决 事实证明无效 最后的解决办法是手动复制虚拟机文件 在配置文件中注释uid 然后用虚
  • Java中的多态调用问题,下面代码输出是什么?

    转自 http www lvhongqiang com blog431 html 问题 下面代码输出是什么 public class Test3 public static void main String args AAA a new B
  • Spring Boot项目中使用Logback日志与使用AOP拦截请求日志信息

    日志记录了系统行为的时间 地点等很多细节的具体信息 在发生错误或者接近某种危险状态时能够及时提醒开发人员处理 往往在系统产生问题时承担问题定位与诊断和解决的重要角色 一般很多线上的问题只能通过进行日志分析才可以解决的 所以需要明确日志在日常
  • 【Android开发,极客时间资源共享

    android divider f00 分割线的颜色 android dividerHeight 2dp 分割条的高度 android cacheColorHint 0fff 当列表使用背景图之后 下拉或者上拉都会出现一个问题 背景图不见了
  • 针对热点数据的处理

    针对热点数据的处理 出现问题 解决办法 大体思路 实现方式一 Spring Data Redis 前言 项目要求 Redis中菜品缓存数据KEY的设计 dish 分类id 一 导入依赖 二 添加缓存的代码例子 三 删除缓存 实现方式二 Sp