当前位置: 首页 > news >正文

Redis-mysql 缓存实战

本文基于Springboot,mybatis plus,mysql,redis, Jedis模拟redis缓存实现

目录

1. 添加所需maven依赖

2. 设置数据库及数据表

3. 构建实体类

4. 构建工具类实现 redis 数据库连接池,redis 的读取,写入功能

5. Redis 缓存实战


1. 添加所需maven依赖

        <!--  web开发模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 添加jedis依赖,操作redis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.6.3</version></dependency><!--  mybatis-plus 依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><!--  mysql连接驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!--  lombok模块--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

2. 设置数据库及数据表

  执行以下 sql 脚本新建表 product 并插入四条数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product`  (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`price` float NULL DEFAULT NULL,`category` int NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES (1, 'phone', 1899, 10);
INSERT INTO `product` VALUES (2, 'apple', 1899, 20);
INSERT INTO `product` VALUES (3, 'food', 1600, 30);
INSERT INTO `product` VALUES (4, 'rice', 1230, 40);SET FOREIGN_KEY_CHECKS = 1;

3. 构建实体类

  这里使用 lombok 来构建setter,getter,构造方法,toString方法

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@TableName("product")
public class Product {private Integer id;private String name;private Float price;private Integer category;
}

4. 构建工具类实现 redis 数据库连接池,redis 的读取,写入功能

public class JedisUtil {private static JedisPool jedisPool;static{// 配置连接池JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(10);  // 设置最大连接数config.setMaxIdle(5);  // 设置最大空闲连接数config.setBlockWhenExhausted(false);  // 连接耗尽时不阻塞// 创建连接池jedisPool = new JedisPool(config,"localhost",6379);}// 从数据池获取 Jedis 连接public static Jedis getJedisPool(){return jedisPool.getResource();}// 存储商品到 redis---key:(product:id)  field:  valuepublic static long saveToRedis(Product product){Jedis jedis = JedisUtil.getJedisPool();HashMap<String,String> hashMap = new HashMap();hashMap.put("name",product.getName());hashMap.put("price",String.valueOf(product.getPrice()));hashMap.put("category",String.valueOf(product.getCategory()));String key = "product:" + product.getId();long flag = jedis.hset(key, hashMap);// 设置过期时间jedis.expire(key,3600L);jedis.close();return flag;}// 从 redis 读取数据public static Product getProductByRedis(int id){Jedis jedis = JedisUtil.getJedisPool();Product product = null;String key = "product:" + id;if(jedis.exists(key)){String name = jedis.hget(key,"name");String price = jedis.hget(key,"price");String category = jedis.hget(key,"category");product = new Product(id,name,Float.parseFloat(price),Integer.parseInt(category));}jedis.close();return product;}
}

5. Redis 缓存实战

  前端请求路径:http://localhost/getProductById?id=2

  后端新建一个 ProductMapper 接口

@Mapper
public interface ProductMapper {@Select("select * from product")List<Product> getProduct();@Select("select * from product where id=#{id}")Product getProductById(int id);
}

  后端新建一个 ProductController 类

@RestController
public class ProductController {@ResourceProductMapper productMapper;@GetMapping("/product")public List<Product> getProduct(){return productMapper.getProduct();}@GetMapping("/getProductById")public Product getProductById(int id){Product product = null;// 1. 查看 redis 缓存中是否有数据product = JedisUtil.getProductByRedis(id);if(product == null){  // redis 中没有该商品// 2.进 mysql 中查询product = productMapper.getProductById(id);if(product==null){ // mysql 中没有System.out.println("mysql 中未查询到该商品");}else { // mysql 中有System.out.println("mysql查询到该商品: "+product);// 3.返回给前端的同时也要将数据写入到 redis 中long flag = JedisUtil.saveToRedis(product);System.out.println("save flag:"+flag);}}else {  // redis 中有该商品System.out.println("redis查询到该商品: " + product);}return product;}
}

  第一次读取数据时是从 mysql 中读取,当该数据写入 redis 后,读取速度明显加快

相关文章:

Redis-mysql 缓存实战

本文基于Springboot&#xff0c;mybatis plus&#xff0c;mysql&#xff0c;redis&#xff0c; Jedis模拟redis缓存实现 目录 1. 添加所需maven依赖 2. 设置数据库及数据表 3. 构建实体类 4. 构建工具类实现 redis 数据库连接池&#xff0c;redis 的读取&#xff0c;写入功…...

蓝桥杯:通电

蓝桥杯&#xff1a; 通电https://www.lanqiao.cn/problems/162/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 题目分析(最小生成树)&#xff1a; AC代码(Java) 题目描述 2015 年&#xff0c;全中国实现了户户通电。作为一名电力建设者&#xff0…...

一文搞懂 Kubernetes 的 Limits 和 Requests

当在Kubernetes中使用容器时&#xff0c;重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的&#xff0c;不应该被饿死。知道了这一点&#xff0c;我们应该正确配置我们的容器和Pod&#xff0c;以获得两者的最佳效果。在…...

【C++】手撕红黑树

文章目录前言一、红黑树的概念二、红黑树的节点结构三、红黑树的插入四、红黑树的调整1、叔叔存在且为红2、叔叔不存在或存在且为黑3、插入完整代码4、总结五、红黑树的验证六、红黑树的删除七、红黑树与 AVL 树的比较八、红黑树的代码实现前言 在网络上流传着这样一张图片&am…...

Java中的CAS实现原理

文章目录一、什么是CAS&#xff1f;二、JAVA中如何实现CAS操作三、CAS在JUC中的运用四、ABA问题一、什么是CAS&#xff1f; 在计算机科学中&#xff0c;比较和交换&#xff08;Conmpare And Swap&#xff09;是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...

什么是华为云对象存储OBS?它有什么优势?

华为对象存储OBS&#xff08;Object Storage Service&#xff09;是一种高可用、高可靠、高性能的云存储服务&#xff0c;能够为企业和个人用户提供强大的数据存储和管理功能。本文将对华为对象存储OBS的特点、优势和未来发展进行详细介绍。 一、华为对象存储OBS的特点 1.对象…...

你知道照片怎么变清晰吗?增强照片清晰度的方法

相信很多小伙伴都会有这种的经历&#xff0c;去游玩时高高兴兴的拍照留念&#xff0c;结果拍出来的照片不是很尽人意。或者是画面还没聚焦好&#xff0c;就按下快门&#xff0c;导致拍摄出来的照片变模糊了。很多小伙伴遇到这种情况都很烦恼&#xff0c;照片丢了可惜&#xff0…...

NOIP模拟赛 轰炸(bomb)

题目描述 有nnn座城市&#xff0c;城市之间建立了mmm条有向的地下通道。 你需要发起若干轮轰炸&#xff0c;每轮可以轰炸任意多的城市。但在每次轰炸城市中&#xff0c;不能同时存在两个城市i,ji,ji,j满足可以通过地下通道从城市iii到达城市jjj。你需要求出最少需要多少轮可以…...

Linux系统之安装PHP环境

Linux系统之安装PHP环境 一、PHP介绍1.PHP简介2.PHP优势3.php7版本特点二、本地环境介绍1.环境规划2.检查操作系统版本3.检查当前yum仓库三、安装PHP5.4版本1.查看可安装php版本2.使用yum安装php3.安装httpd服务4.关闭selinux和设置防火墙5.编辑index.php测试文件6.测试php环境…...

MySQL8的安装教程

MySQL8的安装教程 1.安装包的下载 如果不想去官网下载的话可以去百度网盘进行下载。 MySQL :: Download MySQL Community Server mysql-8.0.28-winx64.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 提取码&#xff1a;0001 2.解压 3.创建一个my.ini的文件 最好是创建…...

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高&#xff0c;这我可就不同意了&#xff1a; 程序员的薪资哪里是很高&#xff0c;而是非常高&#xff01;而会接私活的程序员更是能拿到更高的收入&#xff01;作为一个程序员&#xff0c;这些接私活的网站一定要收藏起来&#xff0c;让你在“八小时外…...

MySQL表设计思路(一对多、多对多...)

要开始单独负责需求了&#xff0c;捋一捋表设计的思路。 文章目录一、MySQL中的数据类型二、一对一的关系设计二、一对多的关系设计三、多对多的关系设计四、经验总结一、MySQL中的数据类型 字符串类型 varchar&#xff1a;即variable char &#xff0c;可边长度的字符串&#…...

内存对齐:C/C++编程中的重要性和技巧

C/C中的内存对齐前言基本概念 什么是内存对齐&#xff1f;内存对齐的定义内存对齐的作用数据类型的大小ARM 64 位架构和 x86_64 架构下的数据类型大小ARM 32 位架构下的数据类型大小内存对齐的边界填充字节的作用内存对齐的原理结构体中的内存对齐结构体的定义和使用结构体中成…...

C++ Primer第五版_第七章习题答案(41~50)

文章目录练习7.411、头文件2、源文件3、主函数练习7.42练习7.43练习7.44练习7.45练习7.46练习7.47练习7.48练习7.49练习7.50练习7.41 使用委托构造函数重新编写你的Sales_data 类&#xff0c;给每个构造函数体添加一条语句&#xff0c;令其一旦执行就打印一条信息。用各种可能的…...

python玄阶斗技--NumPy入门

目录 一.NumPy介绍 二.创建数组 1.一维数组创建 2.二维数组创建 3.zeros函数 4.ones函数 5.empty函数 6.arange函数 三.NumPy的数学操作 1.基本运算 2.矩阵运算 3.ndarray类的方法 四.数组堆叠 五.数组分隔 一.NumPy介绍 在这里对NumPy的介绍我不想扯太多&#xf…...

VR黑科技丨远离拥挤,VR直播开启沉浸式赏樱新姿势

春光兮婉转&#xff0c;珞樱兮盛绽&#xff0c;又是一年樱花季&#xff0c;全国各地大部分地区的樱花进入盛花期&#xff0c;尤其是武汉&#xff0c;东湖樱园踏青赏花的游人如织、摩肩擦踵&#xff0c;勾勒一幅“人人人人人人人花人人人人人”的盛景。 为了一睹樱花“芳容”&am…...

ts的一些用法

1.交叉类型 & ---多个类型属性的集合 1.1类型别名实现 type Person {name:string} type Children Person & {age:number} let newPerson:Children {// name:hahah,name:hhaah,age:18 } 1.2 接口类型实现 interface Inter1{name:string } interface Inter2{name:…...

云计算面试总结

shell脚本对日志进行备份 shell 对日志备份 #!/bin/bash if [ -d /log/bak/ ] || mkdir -p /log/bak/ thentar Pcf /log/bak/log_$(date %Y%m%d)$(date %H%M%S).tar.gz /var/log/*.logecho "干完&#xff01;可以约会啦" fi存在的问题&#xff1a; 说的太快&a…...

(DP)买不到的数目【蓝桥杯】(裴蜀定理)

买不到的数目 小明开了一家糖果店。 他别出心裁&#xff1a;把水果糖包成4颗一包和7颗一包的两种。 糖果不能拆包卖。 小朋友来买糖的时候&#xff0c;他就用这两种包装来组合。 当然有些糖果数目是无法组合出来的&#xff0c;比如要买 10 颗糖。 你可以用计算机测试一下&#…...

Docker使用DockerFile部署Go项目

Docker使用DockerFile部署Go项目1. 文章说明2. Go项目打包到Linux2.1 学习链接与知识点2.2. 打包生成 main 文件2.3 Docker部署Go项目1. 文章说明 目的&#xff1a;将打包生成的 main 文件&#xff0c;在Docker里面&#xff0c;使用Dockerfile文件&#xff0c;生成镜像与容器&…...

D26: 向下负责——保护团队免受 AI 焦虑影响

文章目录 D26: 向下负责——保护团队免受 AI 焦虑影响 🎯 为什么这个话题重要? 现实痛点:团队 AI 焦虑的三种表现 一个真实场景 一、理解 AI 焦虑的本质 1.1 焦虑从何而来? 1.2 焦虑的恶性循环 1.3 一个心理学视角 二、建立团队心理安全网 2.1 心理安全:团队韧性的基石 2…...

为 OpenClaw 配置 Taotoken 以实现自动化工作流中的模型调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为 OpenClaw 配置 Taotoken 以实现自动化工作流中的模型调用 OpenClaw 是一款强大的自动化工作流工具&#xff0c;能够通过编排任务…...

上午题_程序设计语言

编译程序和解释程序...

资本可以复制流量,却复制不了《凰标》的天命@凤凰标志

——《凰标》为何无法被批量复刻&#xff1f;一、资本逻辑&#xff1a;无限复制与批量复刻可复制元素资本操作手法结果爆款剧情换皮翻拍同质化内容泛滥流量模式买量算法短期数据狂欢国风外壳元素拼贴文化“快餐”营销套路热搜话题转瞬即逝的热度 资本的核心能力&#xff0c;是复…...

Midjourney v7新功能全维度压测报告(v6 vs v7实测对比:提示词容错率↑47%,构图理解准确率突破92.6%)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney v7新功能全面解析 Midjourney v7 于2024年第三季度正式发布&#xff0c;标志着AI图像生成在语义理解、构图控制与跨模态一致性方面迈入新阶段。本次升级不再仅依赖提示词&#xff08;prompt…...

感统训练的真实效果能持续多久?会不会反弹?

​直接给出结论&#xff1a;常见的感统训练维持周期短、反弹率高&#xff0c;多数孩子训练效果仅能保持3-6个月。一旦停止课程&#xff0c;大部分孩子会逐步退回原有状态。感统只能调整身体感官反应&#xff0c;无法从根源提升大脑自控力&#xff0c;治标不治本。感统训练适用人…...

冻|结D球 2026

通过网盘分享的文件&#xff1a;冻&#xff5c;结D球 2026 链接: https://pan.baidu.com/s/1-bhxibfD69ahEoufeQFRRQ?pwdhygv 提取码: hygv...

AMD Ryzen硬件调试终极指南:深入SMU Debug Tool的完整实战应用

AMD Ryzen硬件调试终极指南&#xff1a;深入SMU Debug Tool的完整实战应用 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

AI赋能医院物流:基于PDCA循环的智能供应链韧性提升实践

1. 项目概述&#xff1a;当医院物流遇上AI与PDCA医院物流&#xff0c;听起来可能有点“幕后”&#xff0c;但它绝对是现代医疗体系顺畅运转的“大动脉”。从高值耗材、药品、检验试剂&#xff0c;到被服布草、医疗废物&#xff0c;甚至是一日三餐&#xff0c;这条链条上任何一个…...

大模型提示词驱动的工业图像标注流水线实战

1. 这不是“打标签”&#xff0c;而是让大模型替你做标注决策的整套工作流“Prompt-Based Automated Data Labeling and Annotation”——光看这个标题&#xff0c;很多人第一反应是&#xff1a;“哦&#xff0c;用大模型自动打标签”。但干过三年以上NLP数据工程、带过两个以上…...