1. 程式人生 > 資料庫 >springboot整合redis超級詳解

springboot整合redis超級詳解

redis中文官網:
redis-windows安裝下載:
redis-linux下載:
接下來正式實現整合,在springboot中使用redis

1,建立springboot專案

2,需要的依賴

	jedis,同時需要使用下面的fastjson
	<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>3.3.0</version>
	</dependency>
	fastjson
	<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.75</version>
	</dependency>

也可以去官網中下載其他版本

3,application.properties配置

#配置redis
spring.redis.host=127.0.0.1
spring.redis.port=6379

4,在專案載入完之後,可以分析一波原始碼

在外部庫中就能發現這個redis已經載入進來
在這裡插入圖片描述
點進去後可以發現,在每個對應的自動配置類裡面,都有對應的配置檔案
在這裡插入圖片描述
在點開配置檔案類中就可以發現,redis基本操作就在這個對應的配置檔案中了
如一些使用的預設資料庫為第0個,url,主機等,不過實際開發中一般在linux下,並且這些命令一般不會用程式碼實現,而是使用配置檔案,在配置檔案中修改這些指令
在這裡插入圖片描述

5,進行測試,看是否可以使用redis

package com.example.bootredis;

import com.example.bootredis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class BootredisApplicationTests {

    @Autowired
    //@Qualifier("redisTemplate")
    //重新編寫的模板
    private RedisTemplate redisTemplate;
    long s1 = System.currentTimeMillis();
    @Test
    void contextLoads() {
        //opsForValue:操作字串
        //opsForList:操作list
        //set,hash,geo,zset...等
        //redisTemplate可以操作我們的常用方法
        //獲取redis的連線物件
        //RedisConnection rc = redisTemplate.getConnectionFactory().getConnection();
        redisTemplate.opsForValue().set("name","ZhengHuiSheng");
        String name = (String)redisTemplate.opsForValue().get("name");
        long s2 = System.currentTimeMillis();
        System.out.println(name);
        System.out.println(s2 - s1);

    }
//    @Test
//    public void test(){
//        //在開發中一般都使用json來傳遞物件
//        User user = new User("鄭輝盛",18);
//        //向redis中新增資料
//        redisTemplate.opsForValue().set("user",user);
//        System.out.println(redisTemplate.opsForValue().get("user"));
//    }
}

6,測試發現並不能成功

原因:沒有在我們安裝在本地的redis下啟動redis-server.exe以及redis-cli.exe,安裝連線在一開始就已經說了,
這裡再說一下:
安裝好之後也不用配置環境,主機和埠預設為127.0.0.1 6379
在這裡插入圖片描述

7,在windows中測試一下,依次開啟redis-server.exe和redis-cli.exe,在redis-cli.exe中輸入ping,如果能得到pong,name就連線成功,本地redis就可以正常使用了

在這裡插入圖片描述

8,重新進行測試,專案就能執行成功了,可以自己試著debug一下,這樣才能知道程式幹了什麼,以及快速進行排錯

9,再儲存一個物件試試

新建一個pojo包,下面建一個User類,一般開發中實體類都是需要進行序列化的

package com.example.bootredis.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import java.io.Serializable;

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private String name;
    private Integer age;
}

10,再進行測試,加入到上一段測試程式碼中

@Test
    public void test(){
        //在開發中一般都使用json來傳遞物件
        User user = new User("鄭輝盛",18);
        //向redis中新增資料
        redisTemplate.opsForValue().set("user",user);
        System.out.println(redisTemplate.opsForValue().get("user"));
    }

11,然而實體類序列化只是在jdk中序列化,在我們進行物件儲存時可能使用json進行序列化,因此在的查詢設定的物件可以發現一串亂碼,原因是在RedisTemplate類中並未進行序列化處理

在這裡插入圖片描述

在原始碼中可以發現並未進行序列化,序列化預設為jdk序列化
在這裡插入圖片描述
在這裡插入圖片描述

12,新建一個config包,下面新建一個RedisConfig配置類,相當於自定義一個模板配置類

package com.example.bootredis.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    //自定義了一個RedisTemplate
    @Bean
    @SuppressWarnings("all")    //告訴編譯器忽略指定的警告,不用在編譯完成後出現警告資訊
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //為了自己開發方便,使用String,Object型別
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        //序列化配置,使用json解析任意的物件,將物件解析成可以序列化的物件
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //使用Mapper物件進行轉義
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        //開始序列化物件
        jackson2JsonRedisSerializer.setObjectMapper(om);

        //String 型別的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //key採用String序列化的方式
        template.setKeySerializer(stringRedisSerializer);
        //hash採用String序列化的方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value序列化方式採用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash的value序列化方式採用jackson
        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

13,先在redis中flushdb(清空)一下資料庫,在重新進行測試,那麼使用的模板配置類肯定就要使用自定義配置的模板類了,終極測試

	@Autowired
    @Qualifier("redisTemplate")
    //重新編寫的模板
    private RedisTemplate redisTemplate;
	@Test
    public void test(){
        //在開發中一般都使用json來傳遞物件
        User user = new User("鄭輝盛",18);
        //向redis中新增資料
        redisTemplate.opsForValue().set("user",user);
        System.out.println(redisTemplate.opsForValue().get("user"));
    }

14,結果 user獲取成功

在這裡插入圖片描述