SpringBoot整合Redis做緩存

項目中用到redis,redis緩存是其中一個很重要的使用場景,如果讀寫數(shù)據(jù)的時候,讀取數(shù)據(jù)的時候可直接走內(nèi)存的,這樣的高并發(fā)訪問數(shù)據(jù)的時候,和查詢數(shù)據(jù)庫想比,redis讀取數(shù)據(jù)的高效性、快速的優(yōu)勢。
1.搭建redis環(huán)境
以下地址包括下載搭建和使用
redis搭建
2.安裝mysql
想必做java后臺開發(fā)的這個并不陌生,用數(shù)據(jù)工具,我用的是Navicat,我的文章中有相關(guān)的下載破解方法可以參考(Mac上Navicat破解與使用
在本地連接的數(shù)據(jù)庫創(chuàng)建一個表,這里用的是User

image.png

3.準(zhǔn)備工作,搭建工程
image.png

pom.xml中添加依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.0.RELEASE</version>
        </dependency>

application.properties配置文件中添加redis配置

#Redis
spring.redis.database=1
#Redis服務(wù)器地址,可根據(jù)環(huán)境不同進行配置,此處是本機的
spring.redis.host=127.0.0.1
#Redis服務(wù)器連接端口,可根據(jù)自己服務(wù)器地址配置相應(yīng)端口,此處是本機的
spring.redis.port=6379
#Redis服務(wù)器連接密碼
spring.redis.password=123456

spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=
spring.redis.jedis.pool.max-idle=4
spring.redis.jedis.pool.min-idle=2

spring.redis.timeout=1200

接下來User和數(shù)據(jù)庫中的user表對應(yīng),注意這里一定要序列化,因為redis保存對象的時候要求對象是序列化的;
User實體:

public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "id")
    private Integer id;

    @ApiModelProperty(value = "name")
    private String name;

    @ApiModelProperty(value = "password")
    private String password;
}

Service層:
具體是實現(xiàn)方法代碼如下:

@Service
public class UserService {
    @Autowired
   private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    public User find(int id){

    String key = "user_"+id;

        ValueOperations<String,User>operations = redisTemplate.opsForValue();

        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey){
            User user = operations.get(key);
            System.out.println("從緩存中獲取的===="+ user.getName());
            return user;

        }else {

            User user = userMapper.find(id);
            System.out.println("從數(shù)據(jù)表中獲取的===="+ user.getName());
            operations.set(key, user, 5, TimeUnit.HOURS);
            return user;

        }
    }

public List<User>queryAll(){
        return userMapper.queryAll();
    }

    public int updateUser(User user){

        ValueOperations<String,User>operations = redisTemplate.opsForValue();
        int result = userMapper.updateUser(user);
        if(result != 0){
            String key = "user"+user.getId();
            boolean hasKey = redisTemplate.hasKey(key);
            if (hasKey){
                redisTemplate.delete(key);
                System.out.println("刪除緩存中的數(shù)據(jù)");
            }

            //再更新新的數(shù)據(jù)到緩存中
            User userNew = userMapper.find(user.getId());
            if (userNew != null){
                operations.set(key,userNew,3,TimeUnit.HOURS);
            }

        }
        return result;
    }

    public int deleteUser(int id){
        int result = userMapper.deleteUser(id);
        String key = "user"+ id;
        if(result != 0){
            boolean hasKey = redisTemplate.hasKey(key);
            if (hasKey){
                redisTemplate.delete(key);
                System.out.println("刪除緩存中的");
            }

        }
        return  result;
    }

}

Controller層:

@RestController
public class UserController {
    @Autowired
    UserService userService;

    @ApiOperation(value = "查找",nickname = "findUser")
    @RequestMapping(value = "/users/find",method = RequestMethod.POST)

    public User find(@RequestBody User user){

        return userService.find(user.getId());
    }

    @ApiOperation(value = "查找所有",nickname = "queryAll")
    @RequestMapping(value = "/users/queryAll",method = RequestMethod.POST)
    public List<User> queryAll(){
        return userService.queryAll();
    }

    @ApiOperation(value = "更新某個用戶",nickname = "updateUser")
    @RequestMapping(value = "/users/updateUser",method = RequestMethod.POST)
    public int updateUser(User user){
        return userService.updateUser(user);

    }
    @ApiOperation(value = "刪除某個用戶",nickname = "deleteUser")
    @RequestMapping(value = "/users/deleteUser",method = RequestMethod.POST)
    public int deleteUser(int id){
        return userService.deleteUser(id);
    }
}

mapper.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.redisdemo.demo.mapper.UserMapper">

    <!--id對應(yīng)接口中的方法,名字要一樣,parameterType是方法的參數(shù)類型,
    resultType是查詢返回的類型,需要注意的是,這里的SQL語句后面不能加分號,變量不能加引號-->
    <resultMap id="BaseResultMap" type="com.redisdemo.demo.entity.User" >
        <result column="id" property="id" />
        <result column="name" property="name" />
        <result column="password" property="password" />
    </resultMap>

    <select id="find" resultMap="BaseResultMap">
        select * from user where id = #{id}
    </select>

    <select id="queryAll" resultMap="BaseResultMap">
        select  * from  user
    </select>

    <update id="updateUser" parameterType="com.redisdemo.demo.entity.User">
     update user set name = #{user.name},password = #{user.password} where id = #{user.id}
    </update>


    <delete id = "deleteUser">
     delete from user where id = #{id}
    </delete>

</mapper>

首次緩存中沒有數(shù)據(jù),從數(shù)據(jù)表中查詢,打印日志如下:


image.png

當(dāng)?shù)诙尉彺嬷杏袛?shù)據(jù),直接取出緩存中的數(shù)據(jù),打印日志如下:


image.png

同樣用RDM redis可視化工具看一下緩存中的數(shù)據(jù),具體如下:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NOSQL類型簡介鍵值對:會使用到一個哈希表,表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,168評論 2 27
  • 緩存架構(gòu) 腦中的直觀反應(yīng) SQLAlchemy起到一定的本地緩存作用在同一請求中多次相同的查詢只查詢數(shù)據(jù)庫一次,S...
    大金葉子閱讀 3,046評論 0 2
  • 疑問:為何要使用服務(wù)端緩存? 1.對熱點數(shù)據(jù)進行緩存,可以加快響應(yīng)速度 2.高并發(fā),大流量這種問題怎么解決?加機器...
    大唐雷戀閱讀 1,537評論 0 1
  • 1. MySql+Memcached架構(gòu)的問題 實際MySQL是適合進行海量數(shù)據(jù)存儲的,通過Memcached將...
    Snapeliu閱讀 541評論 0 3
  • 無意中發(fā)現(xiàn)了一本很受用的好書《增廣賢文》,又名《昔時賢文》、《古今賢文》。該書最早見于明萬歷年間的戲曲《牡丹亭》中...
    夢姿書齋閱讀 645評論 4 12

友情鏈接更多精彩內(nèi)容