目录
1. 添加所需maven依赖
2. 设置数据库及数据表
3. 构建实体类
4. 构建工具类实现 redis 数据库连接池,redis 的读取,写入功能
5. Redis 缓存实战
redis.clients
jedis
3.6.3
com.baomidou
mybatis-plus-boot-starter
3.4.2
com.mysql
mysql-connector-j
runtime
执行以下 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;
这里使用 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;
}
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: value
public static long saveToRedis(Product product){
Jedis jedis = JedisUtil.getJedisPool();
HashMap 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;
}
}
前端请求路径:http://localhost/getProductById?id=2
后端新建一个 ProductMapper 接口
@Mapper
public interface ProductMapper {
@Select("select * from product")
List getProduct();
@Select("select * from product where id=#{id}")
Product getProductById(int id);
}
后端新建一个 ProductController 类
@RestController
public class ProductController {
@Resource
ProductMapper productMapper;
@GetMapping("/product")
public List 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 后,读取速度明显加快