springboot使用RedisRepository操作數(shù)據(jù)的實(shí)現(xiàn)
通過(guò)集成spring-boot-starter-data-redis
之后一共有三種redis hash數(shù)據(jù)操作方式可以供我們選擇
- 一個(gè)屬性、一個(gè)屬性的存取
- 使用Jackson2HashMapper存取對(duì)象
- 使用RedisRepository的對(duì)象操作(本節(jié)核心內(nèi)容)
一、一個(gè)屬性、一個(gè)屬性的存取
這種方式在本專欄上一文章中的代碼,已經(jīng)得以體現(xiàn)。
@Test public void HashOperations() { Person person = new Person("kobe","byrant"); person.setAddress(new Address("洛杉磯","美國(guó)")); //使用hash的方法存儲(chǔ)對(duì)象數(shù)據(jù)(一個(gè)屬性一個(gè)屬性的存,下節(jié)教大家簡(jiǎn)單的方法) hashOperations.put("hash:player","firstname",person.getFirstname()); hashOperations.put("hash:player","lastname",person.getLastname()); hashOperations.put("hash:player","address",person.getAddress()); String firstName = (String)hashOperations.get("hash:player","firstname"); System.out.println(firstName); }
數(shù)據(jù)在redis數(shù)據(jù)庫(kù)里面存儲(chǔ)結(jié)構(gòu)是下面這樣的
- 一個(gè)hash代表一個(gè)對(duì)象的數(shù)據(jù)
- 一個(gè)對(duì)象有多個(gè)屬性key、value鍵值對(duì)數(shù)據(jù),每一組鍵值對(duì)都可以單獨(dú)存取
二、使用Jackson2HashMapper存取對(duì)象
上一小節(jié)我們操作hash對(duì)象的時(shí)候是一個(gè)屬性一個(gè)屬性設(shè)置的,那我們有沒(méi)有辦法將對(duì)象一次性hash入庫(kù)呢?我們可以使用jacksonHashOperations和Jackson2HashMapper
import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest public class RedisConfigTest3 { @Resource(name="redisTemplate") private HashOperations<String, String, Object> jacksonHashOperations; //注意這里的false,下文會(huì)講解 private HashMapper<Object, String, Object> jackson2HashMapper = new Jackson2HashMapper(false); @Test public void testHashPutAll(){ Person person = new Person("kobe","bryant"); person.setId("kobe"); person.setAddress(new Address("洛杉磯","美國(guó)")); //將對(duì)象以hash的形式放入redis數(shù)據(jù)庫(kù) Map<String,Object> mappedHash = jackson2HashMapper.toHash(person); jacksonHashOperations.putAll("player:" + person.getId(), mappedHash); //將對(duì)象從數(shù)據(jù)庫(kù)取出來(lái) Map<String,Object> loadedHash = jacksonHashOperations.entries("player:" + person.getId()); Object map = jackson2HashMapper.fromHash(loadedHash); Person getback = new ObjectMapper().convertValue(map,Person.class); //Junit5,驗(yàn)證放進(jìn)去的和取出來(lái)的數(shù)據(jù)一致 assertEquals(person.getFirstname(),getback.getFirstname()); } }
使用這種方式可以一次性的存取java 對(duì)象為redis數(shù)據(jù)庫(kù)的hash數(shù)據(jù)類(lèi)型。需要注意的是:執(zhí)行上面的測(cè)試用例,Person和Address一定要有public無(wú)參構(gòu)造方法,在將map轉(zhuǎn)換成Person或Address對(duì)象的時(shí)候用到,如果沒(méi)有的話會(huì)報(bào)錯(cuò)。
當(dāng)new Jackson2HashMapper(false)
,注意屬性對(duì)象Address的存儲(chǔ)格式(兩張圖對(duì)比觀察)
當(dāng)new Jackson2HashMapper(true)
,注意屬性對(duì)象Address的存儲(chǔ)格式(兩張圖對(duì)比觀察)
需要注意的是:使用這種方法存儲(chǔ)hash數(shù)據(jù),需要多出一個(gè)鍵值對(duì)@class
說(shuō)明該hash數(shù)據(jù)對(duì)應(yīng)的java類(lèi)。在反序列化的時(shí)候會(huì)使用到,用于將hash數(shù)據(jù)轉(zhuǎn)換成java對(duì)象。
三、使用RedisRepository的對(duì)象操作
下面為大家介紹使用RedisRepository進(jìn)行redis數(shù)據(jù)操作,它不只是能簡(jiǎn)單的存取數(shù)據(jù),還可以做很多的CURD操作。使用起來(lái)和我們用JPA進(jìn)行關(guān)系型數(shù)據(jù)庫(kù)的單表操作,幾乎是一樣的。
首先,我們需要在需要操作的java實(shí)體類(lèi)上面加上@RedisHash
注解,并使用@Id
為該實(shí)體類(lèi)指定id。是不是和JPA挺像的?
@RedisHash("people") //注意這里的person,下文會(huì)說(shuō)明 public class Person { @Id String id; //其他和上一節(jié)代碼一樣 }
然后寫(xiě)一個(gè)PersonRepository ,繼承CrudRepository,是不是也和JPA差不多?
//泛型第二個(gè)參數(shù)是id的數(shù)據(jù)類(lèi)型 public interface PersonRepository extends CrudRepository<Person, String> { // 繼承CrudRepository,獲取基本的CRUD操作 }
CrudRepository默認(rèn)為我們提供了下面的這么多方法,我們直接調(diào)用就可以了。
在項(xiàng)目入口方法上加上注解@EnableRedisRepositories(筆者測(cè)試,在比較新的版本中這個(gè)注解已經(jīng)不需要添加了,默認(rèn)支持),然后進(jìn)行下面的測(cè)試
@SpringBootTest public class RedisRepositoryTest { @Resource PersonRepository personRepository; @Test public void test(){ Person rand = new Person("zimug", "漢神"); rand.setAddress(new Address("杭州", "中國(guó)")); personRepository.save(rand); //存 Optional<Person> op = personRepository.findById(rand.getId()); //取 Person p2 = op.get(); personRepository.count(); //統(tǒng)計(jì)Person的數(shù)量 personRepository.delete(rand); //刪除person對(duì)象rand } }
測(cè)試結(jié)果:需要注意的是RedisRepository在存取對(duì)象數(shù)據(jù)的時(shí)候,實(shí)際上使用了redis的2種數(shù)據(jù)類(lèi)型
第一種是Set類(lèi)型,用于保存每一個(gè)存入redis的對(duì)象(Person)的id。我們可以利用這個(gè)Set實(shí)現(xiàn)person對(duì)象集合類(lèi)的操作,比如說(shuō):count()統(tǒng)計(jì),統(tǒng)計(jì)redis數(shù)據(jù)庫(kù)中一共保存了多少個(gè)person。注意:下圖中set集合的key名稱,就是通過(guò)上文代碼中@RedisHash("people")
指定的。
第二種是Hash類(lèi)型,是用來(lái)保存Java對(duì)象的,id是RedisRepository幫我們生成的,這個(gè)id和上圖中set集合中保存的id是一致的。
到此這篇關(guān)于springboot使用RedisRepository操作數(shù)據(jù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springboot RedisRepository操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編程實(shí)現(xiàn)的模擬行星運(yùn)動(dòng)示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)的模擬行星運(yùn)動(dòng),涉及java基于swing組建繪制動(dòng)態(tài)效果及數(shù)值運(yùn)算相關(guān)操作技巧,并總結(jié)分析了java面向?qū)ο蟮南嚓P(guān)特性,需要的朋友可以參考下2018-04-04SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題
這篇文章主要介紹了SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)-動(dòng)態(tài)權(quán)限,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Java進(jìn)階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程
Java進(jìn)階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程...2006-12-12IntelliJ IDEA設(shè)置Tabs實(shí)現(xiàn)同時(shí)打開(kāi)多個(gè)文件且分行顯示
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA設(shè)置Tabs實(shí)現(xiàn)同時(shí)打開(kāi)多個(gè)文件且分行顯示,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10java 進(jìn)程是如何在Linux服務(wù)器上進(jìn)行內(nèi)存分配的
這篇文章主要介紹了java 進(jìn)程是如何在Linux服務(wù)器上進(jìn)行內(nèi)存分配的,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11新手了解java 數(shù)組基礎(chǔ)知識(shí)
這篇文章主要介紹了Java 數(shù)組分析及簡(jiǎn)單實(shí)例的相關(guān)資料,在Java中它就是對(duì)象,一個(gè)比較特殊的對(duì)象,需要的朋友可以參考下,希望可以對(duì)你有所幫助2021-07-07Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10