SpringBoot2.X整合Redis


前言

Redis作為一個優秀的nosql數據庫,能快速讀取數據,非常值得我們去學習

SpringBoot也對Redis提供非常友好的整合,那么還等什么,擼起袖子就是干

下載Redis

Redis作為一款開源的軟件,下載方式也極為簡單,可以從Github下載window版本直接解壓

傳送門Redis的Github下載網址

傳送門Redis中文使用教程

SpringBoot整合Redis過程

工程結構

  1. 通過Maven引入工程依賴

你可以在構建工程的時候分別在NoSQL下勾選Spring Data Redis,Web下勾選SpringWeb,以及Developer Tools下勾選lombok,讓IDEA自動為你導入響應的依賴

		<!--redis依賴-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!--web依賴-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--apache.commons依賴-->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>
		<!--lombok依賴-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.12</version>
		</dependency>

當然也可以直接從我這個貼出的依賴,直接拷貝進pom.xml下,需要特別注意的是commons-pool2這個依賴必須通過手動引入,IDEA創建工程時,是不會自動導入的

  1. 編寫實體類

    @Data	//lombok的注解,自動生成setter和getter
    public class User {
        /**
         * 姓名
         */
        private String name;
    
        /**
         * 編號
         */
        private String id;
    
        /**
         * 年齡
         */
        private String age;
    }
    
    
  2. 編寫Redis配置類

    @Configuration	// Springboot配置類的注解
    public class RedisConfiguration {
    
        @Bean	// IOC自動轉配Bean的注解
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
    
            // 使用Jackson2JsonRedisSerialize 替換默認序列化
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new 				Jackson2JsonRedisSerializer(Object.class);
    
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            // enableDefaultTyping方法已過期,在比較老的博客中,踩了坑用activateDefaultTyping替代
            // objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
                    ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    
            // 設置value的序列化規則和 key的序列化規則
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    }
    
  3. 編寫RedisController類

    @RestController
    public class RedisController {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        @Autowired
        private RedisTemplate redisTemplate;
    
        @GetMapping("/get/{key}")
        public String getRedis(@PathVariable(name="key") String key){
    
            return stringRedisTemplate.opsForValue().get(key);
        }
    
        @PostMapping("/set/{key}/{value}")
        public String getRedis(@PathVariable(name="key")String key, @PathVariable(name="value")String value){
            stringRedisTemplate.opsForValue().set(key,value);
            return "SUCCESS";
        }
    
    
        @PostMapping("/postUser")
        public String postEntity(){
            User user=new User();
            user.setId("1");
            user.setName("codeluojay");
            user.setAge("25");
            redisTemplate.opsForValue().set(user.getId(),user);
            return "SUCCESS";
        }
    
        @GetMapping("/getUser/{key}")
        public Object getEntity(@PathVariable(name="key")String key){
            return redisTemplate.opsForValue().get(key);
        }
    }
    
    
  4. 配置連接Redis的properties

    # Redis數據庫索引(默認為0)
    spring.redis.database=0
    # Redis服務器地址
    spring.redis.host=localhost
    # Redis服務器連接端口
    spring.redis.port=6379
    # Redis服務器連接密碼(如果不設置默認為空,那么下面這行代碼就不要寫上去,否則會報錯)
    #spring.redis.password=root
    # 連接池最大連接數(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-active=8
    # 連接池最大阻塞等待時間(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-wait=-1
    # 連接池中的最大空閑連接
    spring.redis.jedis.pool.max-idle=8
    # 連接池中的最小空閑連接
    spring.redis.jedis.pool.min-idle=0
    # 連接超時時間(毫秒)
    spring.redis.timeout=10000
    

SpringBoot整合Redis案例效果

  1. 使用PostMan請求RedisController的PostUser方法,會把實體類存進Redis中

  2. 使用PostMan請求RedisController的getUser方法,會把實體類從Redis中取出並返回輸出

  3. 使用PostMan請求RedisController的set方法,會把類路徑的key和value值存進Redis中

  4. 使用PostMan請求RedisController的get方法,會把類路徑的key作為key值去獲取Redis中對應的value值並返回輸出

SpringBoot整合Redis案例知識點

RedisTemplate

1.RedisTemplate 是spring-data-redis針對jedis客戶端進行大量封裝形成一個便於操作Redis的模板

對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝為operation接口

方法 方法說明
ValueOperations 簡單K-V操作
SetOperations set類型數據操作
ZSetOperations zset類型數據操作
HashOperations 針對map類型的數據操作
ListOperations 針對list類型的數據操作
  1. 針對Java和redis中的數據“序列化/反序列化”,提供了多種可選擇策略(RedisSerializer)

JdkSerializationRedisSerializer:POJO對象的存取場景,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將存儲字節序列。是目前最常用的序列化策略。

StringRedisSerializer:Key或者value為字符串的場景,根據指定的charset對數據的字節序列編碼成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略。

JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉換能力,可以將pojo實例序列化成json格式存儲在redis中,也可以將json格式的數據轉換成pojo實例。因為jackson工具在序列化和反序列化時,需要明確指定Class類型,因此此策略封裝起來稍微復雜。【需要jackson-mapper-asl工具支持】

OxmSerializer:提供了將javabean與xml之間的轉換能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存儲的數據將是xml工具。不過使用此策略,編程將會有些難度,而且效率最低;不建議使用。【需要spring-oxm模塊的支持】

本文的案例使用到的知識點:

1.使用ValueOperations來進行簡單的K-V操作(主要是對String字符串類型的數據進行操作)

2.使用JacksonJsonRedisSerializer對User的JavaBean序列化為json格式存儲在redis中和Redis中json格式數據直接取出並相應輸出

踩坑記錄

  1. redis客戶端設置密碼和不設密碼踩坑

    如果你的redis中默認不設置密碼,那么在properties中下面的話就不用寫上去或者用#注釋掉

    # Redis服務器連接密碼(如果不設置默認為空,那么下面這行代碼就不要寫上去,否則會報錯)
    # spring.redis.password=root
    

    否則就會報ERR Client sent AUTH, but no password is set 的錯誤,因為你沒設置密碼,又要求SpringBoot用密碼連接自然會出錯

    當然不改配置文件spring.redis.password=root

    還可以通過redis的客戶端的命令設置密碼防止出現這個錯誤

    # 解決:命令行進入你解壓Redis的文件夾找到redis-cli.exe啟動這個客戶端
    
    F:\Redis-x64-3.2.100
    
    # 查看是否設置了密碼:
    
    127.0.0.1:6379> auth root
    
    (error) ERR Client sent AUTH, but no password is set
    
    # 說明沒有設置密碼,執行設置密碼命令:config set requirepass后面的root就是本次設置的密碼
    
    127.0.0.1:6379> config set requirepass root
    
    OK  
    
    # 出現OK說明設置成功
    
  2. JSON序列化enableDefaultTyping方法過期,過期的方法雖然能用,但作者已經在源碼中指明替代的方法

    一些寫的比較早的博客都是用這個方法,我在代碼中注釋掉這個方法並用上替代的方法方便后面的學習的人

  3. Unrecognized token 'CodeLuoJay': was expecting (JSON String, Number, Array,)

    這是一個Json序列化出錯的問題,我遇到的情況是自己萌蠢用了RedisController的set方法把字符串存進redis,結果我用getUser方法取出就報這個錯誤,因為字符串形式存進去,而要求輸出是POJO的實體類對象類型不一致,就會報這個錯誤

文章配套Github源碼:springboot-redis
文章對你有幫助,別忘了start一下給給星星支持一下


免責聲明!

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



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