各位小夥伴,好久不見。最近一直都沒有更新,因為公司的項目一直在抓進度,又是表結構更替,又是重構,還要迭代需求。感覺項目都快做爛了……所以一個公司的好壞真的和領導者有極大的關係,許多程式員真的只是三年程式員,謝三年代碼就去轉崗管理了,最後導致技術水平有限,管理水平又跟不上。好,我廢話少說,開始這次的內容,這次我們聊一下NoSql資料庫Redis在SpringBoot中的使用。 Redis在Spring Boot中的整合
Maven依賴引入:
Redis是一個基於記憶體的日誌型可持久化的快取資料庫,儲存形式為key-value格式。還不清楚的小夥伴可以先學習一下,Redis在現在的開發中可是很常用的哦。
首先,我們先在maven中引入相關依賴:
<!--redis依賴--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
之後我們把Redis的相關配置寫入yml,這裡建議根據之前不同的環境寫入不同的配置,Redis預設使用的連接埠是6379,通常Redis預設使用0號資料庫,預設共有16個資料庫:
#redis配置 redis:# 資料庫索引 database: 0# 伺服器位址 host: 127.0.0.1# 伺服器串連連接埠 port: 6379# 連結密碼 password:# 連結池 pool:# 最大串連數(負值表示沒有限制) max-active: 8# 最大阻塞等待時間(負值表示沒有限制) max-wait: 1# 最大空閑連結 max-idle: 8# 最小空閑連結 min-idle: 0# 連結逾時時間(毫秒) timeout: 0
此時,我們已經完成了Redis的所有配置,可以直接來使用了,我們寫一個測試案例來測試一下:
@SpringBootTest@RunWith(SpringJUnit4ClassRunner.class)public class RedisAutoTest { @Autowired private StringRedisTemplate stringRedisTemplate; @Test public void save(){ stringRedisTemplate.opsForValue().set("zzp","big z"); Assert.assertEquals("big z",stringRedisTemplate.opsForValue().get("zzp")); }}
OK,沒有問題,同樣的我們使用rdm開啟看下是否成功存入了。
OK,也沒有任何問題。
在這個測試案例中我們使用的StringRedisTemplate,因為我們之前說過redis使用key-value格式儲存資料,這裡其實儲存的就是
public class UserInfo implements Serializable{ private static final long serialVersionUID = 1L; private String tel; private String nickName; @Max(value = 999999,message = "超過最大數值") @Min(value = 000000,message = "密碼設定不正確") private String passWord; public UserInfo() { } @Override public String toString() { return "UserInfo{" + "tel='" + tel + '\'' + ", nickName='" + nickName + '\'' + ", passWord='" + passWord + '\'' + '}'; } public UserInfo(String tel, String nickName, String passWord) { this.tel = tel; this.nickName = nickName; this.passWord = passWord; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; }}
然後我們駛向下序列化介面:
public class RedisObjectSerializer implements RedisSerializer<Object> { private Converter<Object,byte[]> serializer = new SerializingConverter(); private Converter<byte[],Object> deserializer = new DeserializingConverter(); static final byte[] EMPTY_ARRAY = new byte[0]; @Override public byte[] serialize(Object o) throws SerializationException { if(o == null){ return EMPTY_ARRAY; } try { return serializer.convert(o); }catch (Exception e){ return EMPTY_ARRAY; } } @Override public Object deserialize(byte[] bytes) throws SerializationException { if(isEmpty(bytes)){ return null; } try { return deserializer.convert(bytes); }catch (Exception e){ throw new SerializationException("Can not deserializer",e); } } private boolean isEmpty(byte[] data){ return (data == null || data.length == 0); }}
之後我們在將RedisTemplate重新設定下,使用我們自己的序列化對象:
@Configurationpublic class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory(){ return new JedisConnectionFactory(); } /** * 存入對象序列化資訊 * @return */ @Bean public RedisTemplate<String,UserInfo> redisSerizlizerObj(){ RedisTemplate<String,UserInfo> redisTemplate = new RedisTemplate<String,UserInfo>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new RedisObjectSerializer()); return redisTemplate; }}
完成該工作後,我們可以繼續寫測試案例來驗證我們的相關配置了
@Autowired private RedisTemplate<String,UserInfo> Template; @Test public void testobjSerializer() throws InterruptedException { UserInfo user = new UserInfo("111111","snow","112358"); Template.opsForValue().set("User:snow",user); Assert.assertEquals(true,redisTemplate.hasKey("User:snow")); }
測試結果一切正常,我們同樣通過rdm可以看到我們所存入的序列化對象:
但是,將每一個對象都寫一個RedisTemplate未免太過麻煩,其實我們開發中,會存入對象的toString方法。所以我將存入對象ToString方法的字碼頁給到大家,大家可以根據自己的需要來使用:
/** * 存入對象tostring後的資訊 * @return */ @Bean public RedisTemplate<String,String> redisTemplate(){ RedisTemplate<String,String> redisTemplate = new StringRedisTemplate(); redisTemplate.setConnectionFactory(jedisConnectionFactory());Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; }
同樣通過測試案例來驗證可以發現,可以使用:
@Test public void testobj() throws InterruptedException { UserInfo user = new UserInfo("15201803745","snow","112358"); ValueOperations<String,UserInfo> operations = redisTemplate.opsForValue(); operations.set("User:zzp",user); Thread.sleep(1000); operations.set("User:zzq",user); Thread.sleep(1000); Assert.assertEquals(true,redisTemplate.hasKey("User:zzp")); Assert.assertEquals(true,redisTemplate.hasKey("User:zzq")); }
Redis的使用其實遠遠不止這些,包括事物等都是可以通過Redis處理的。一般開發中我們會使用Jedis對Redis進行操作,可是由於這時介紹Redis在SpringBoot中整合的,所以就不再多言了,如果有想知道的小夥伴可以告訴我,我在來說說如何使用Jedis操作。 以上所有的代碼我已經上傳到GitHub round1-springboot 如果心急的小夥伴也可以去clone我已經完成的項目,這個項目中把一些常用功能都寫了,並且都寫注釋啦。。。也希望大家能幫我點個贊哦~~~ MySpringBoot