Redis-mysql 缓存实战

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

目录

1. 添加所需maven依赖

2. 设置数据库及数据表

3. 构建实体类

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

5. Redis 缓存实战


1. 添加所需maven依赖

        
        
            redis.clients
            jedis
            3.6.3
        
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.4.2
        
        
        
            com.mysql
            mysql-connector-j
            runtime
        

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:  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;
    }
}

5. Redis 缓存实战

  前端请求路径: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 后,读取速度明显加快

你可能感兴趣的:(redis,Java,缓存,redis,数据库)