前言
Redis作為一個優秀的nosql數據庫,能快速讀取數據,非常值得我們去學習
SpringBoot也對Redis提供非常友好的整合,那么還等什么,擼起袖子就是干
下載Redis
Redis作為一款開源的軟件,下載方式也極為簡單,可以從Github下載window版本直接解壓
傳送門:Redis的Github下載網址
傳送門:Redis中文使用教程
SpringBoot整合Redis過程
工程結構
- 通過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創建工程時,是不會自動導入的
-
編寫實體類
@Data //lombok的注解,自動生成setter和getter public class User { /** * 姓名 */ private String name; /** * 編號 */ private String id; /** * 年齡 */ private String age; }
-
編寫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; } }
-
編寫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); } }
-
配置連接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案例效果
-
使用PostMan請求RedisController的PostUser方法,會把實體類存進Redis中
-
使用PostMan請求RedisController的getUser方法,會把實體類從Redis中取出並返回輸出
-
使用PostMan請求RedisController的set方法,會把類路徑的key和value值存進Redis中
-
使用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類型的數據操作 |
- 針對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格式數據直接取出並相應輸出
踩坑記錄
-
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說明設置成功
-
JSON序列化enableDefaultTyping方法過期,過期的方法雖然能用,但作者已經在源碼中指明替代的方法
一些寫的比較早的博客都是用這個方法,我在代碼中注釋掉這個方法並用上替代的方法方便后面的學習的人
-
Unrecognized token 'CodeLuoJay': was expecting (JSON String, Number, Array,)
這是一個Json序列化出錯的問題,我遇到的情況是自己萌蠢用了RedisController的set方法把字符串存進redis,結果我用getUser方法取出就報這個錯誤,因為字符串形式存進去,而要求輸出是POJO的實體類對象類型不一致,就會報這個錯誤
文章配套Github源碼:springboot-redis
文章對你有幫助,別忘了start一下給給星星支持一下