SpringBoot整合Redis實現緩存


項目結構

一、准備數據

創建數據庫並創建表

 

 二、在domain下新建City類

package com.uos.springboot.domain;

import java.io.Serializable;

/**
 * 城市實體類
 */
public class City implements Serializable {

    private static final long serialVersionUID = -1L;

    /**
     * 城市編號
     */
    private Long id;

    /**
     * 省份編號
     */
    private Long provinceId;

    /**
     * 城市名稱
     */
    private String cityName;

    /**
     * 描述
     */
    private String description;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getProvinceId() {
        return provinceId;
    }

    public void setProvinceId(Long provinceId) {
        this.provinceId = provinceId;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "City{" +
                "id=" + id +
                ", provinceId=" + provinceId +
                ", cityName='" + cityName + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

三、在dao層下新建

CityDao接口

package com.uos.springboot.dao;


import com.uos.springboot.domain.City;
import io.lettuce.core.dynamic.annotation.Param;

import java.util.List;

/**
 * 城市 DAO 接口類
 */
public interface CityDao {

    /**
     * 獲取城市信息列表
     */
    List<City> findAllCity();

    /**
     * 根據城市 ID,獲取城市信息
     */
    City findById(@Param("id") Long id);

    Long saveCity(City city);

    Long updateCity(City city);

    Long deleteCity(Long id);
}

在resource下創建mapper-->CityMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.uos.springboot.dao.CityDao">
    <resultMap id="BaseResultMap" type="com.uos.springboot.domain.City">
        <result column="id" property="id" />
        <result column="province_id" property="provinceId" />
        <result column="city_name" property="cityName" />
        <result column="description" property="description" />
    </resultMap>

    <sql id="Base_Column_List">
            id, province_id, city_name, description
    </sql>

    <select id="findById" resultMap="BaseResultMap" parameterType="java.lang.Long">
        select
        <include refid="Base_Column_List" />
        from city
        where id = #{id}
    </select>

    <select id="findAllCity" resultMap="BaseResultMap" >
        select
        <include refid="Base_Column_List" />
        from city
    </select>

    <insert id="saveCity" parameterType="City" useGeneratedKeys="true" keyProperty="id">
        insert into
        city(id,province_id,city_name,description)
        values
        (#{id},#{provinceId},#{cityName},#{description})
    </insert>

    <update id="updateCity" parameterType="City">
        update
        city
        set
        <if test="provinceId!=null">
            province_id = #{provinceId},
        </if>
        <if test="cityName!=null">
            city_name = #{cityName},
        </if>
        <if test="description!=null">
            description = #{description}
        </if>
        where
        id = #{id}
    </update>

    <delete id="deleteCity" parameterType="java.lang.Long">
        delete from
        city
        where
        id = #{id}
    </delete>

</mapper>

四、在Service層下

新建CityService接口

package com.uos.springboot.service;


import com.uos.springboot.domain.City;

/**
 * 城市業務邏輯接口類
 */
public interface CityService {
    /**
     * 根據城市 ID,查詢城市信息
     */
    City findCityById(Long id);

    /**
     * 新增城市信息
     */
    Long saveCity(City city);

    /**
     * 更新城市信息
     */
    Long updateCity(City city);

    /**
     * 根據城市 ID,刪除城市信息
     */
    Long deleteCity(Long id);
}

CityServiceImpl實現類

package com.uos.springboot.service.impl;

import com.uos.springboot.dao.CityDao;
import com.uos.springboot.domain.City;
import com.uos.springboot.service.CityService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * 城市業務邏輯實現類
 */
@Service
public class CityServiceImpl implements CityService {

    private static final Logger LOGGER = LoggerFactory.getLogger(CityServiceImpl.class);

    @Autowired
    private CityDao cityDao;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 獲取城市邏輯:
     * 如果緩存存在,從緩存中獲取城市信息
     * 如果緩存不存在,從 DB 中獲取城市信息,然后插入緩存
     */
    public City findCityById(Long id) {
        // 從緩存中獲取城市信息
        String key = "city_" + id;
        ValueOperations<String, City> operations = redisTemplate.opsForValue();

        // 緩存存在
        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey) {
            City city = operations.get(key);

            LOGGER.info("CityServiceImpl.findCityById() : 從緩存中獲取了城市 >> " + city.toString());
            return city;
        }

        // 從 DB 中獲取城市信息
        City city = cityDao.findById(id);

        // 插入緩存
        operations.set(key, city, 10, TimeUnit.SECONDS);
        LOGGER.info("CityServiceImpl.findCityById() : 城市插入緩存 >> " + city.toString());

        return city;
    }

    @Override
    public Long saveCity(City city) {
        return cityDao.saveCity(city);
    }

    /**
     * 更新城市邏輯:
     * 如果緩存存在,刪除
     * 如果緩存不存在,不操作
     */
    @Override
    public Long updateCity(City city) {
        Long ret = cityDao.updateCity(city);

        // 緩存存在,刪除緩存
        String key = "city_" + city.getId();
        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey) {
            redisTemplate.delete(key);

            LOGGER.info("CityServiceImpl.updateCity() : 從緩存中刪除城市 >> " + city.toString());
        }

        return ret;
    }

    @Override
    public Long deleteCity(Long id) {

        Long ret = cityDao.deleteCity(id);

        // 緩存存在,刪除緩存
        String key = "city_" + id;
        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey) {
            redisTemplate.delete(key);

            LOGGER.info("CityServiceImpl.deleteCity() : 從緩存中刪除城市 ID >> " + id);
        }
        return ret;
    }

}

五、全局配置文件

## 數據源配置
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

## Mybatis 配置
mybatis.typeAliasesPackage=com.uos.springboot.domain
mybatis.mapperLocations=classpath:mapper/*.xml

## Redis 配置
## Redis數據庫索引(默認為0)
spring.redis.database=0
## Redis服務器地址
spring.redis.host=192.168.152.120
## Redis服務器連接端口
spring.redis.port=6379
## Redis服務器連接密碼(默認為空)
spring.redis.password=1
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
## 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
## 連接池中的最大空閑連接
spring.redis.pool.max-idle=8
## 連接池中的最小空閑連接
spring.redis.pool.min-idle=0
## 連接超時時間(毫秒)
spring.redis.timeout=5000

六、啟動類

 

 七、結果測試

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM