摘要:前言兩個(gè)月沒(méi)更新原創(chuàng)了,實(shí)在慚愧。在實(shí)現(xiàn)方面,存儲(chǔ)代表空間中最大和最老的成員之一。支持?jǐn)?shù)據(jù)結(jié)構(gòu),如字符串,散列,列表,集和帶范圍查詢的有序集。所以我代碼里了兩個(gè)字符串,其實(shí)只了一個(gè)。另外,關(guān)注之后在發(fā)送可領(lǐng)取免費(fèi)學(xué)習(xí)資料。
微信公眾號(hào):一個(gè)優(yōu)秀的廢人。如有問(wèn)題,請(qǐng)后臺(tái)留言,反正我也不會(huì)聽(tīng)。前言
兩個(gè)月沒(méi)更新原創(chuàng)了,實(shí)在慚愧。沒(méi)有借口,就是因?yàn)樽约簯辛恕W罱戳恕缚桃鈱W(xué)習(xí)」,這本書(shū)談的是學(xué)習(xí)與行動(dòng)的關(guān)系,書(shū)中提到了「持續(xù)行動(dòng)」 這個(gè)概念,意思就是:我們要去實(shí)實(shí)在在地去做一些事情,而且是每天都做,才能稱之為「持續(xù)行動(dòng)」??赐赀@本書(shū)以后,我意識(shí)到我必須要做些什么,那就是寫(xiě)作。
Redis 簡(jiǎn)介Redis 是一個(gè)開(kāi)源的,基于內(nèi)存的鍵值數(shù)據(jù)存儲(chǔ),用作數(shù)據(jù)庫(kù),緩存和消息代理。在實(shí)現(xiàn)方面,Key-Value 存儲(chǔ)代表 NoSQL 空間中最大和最老的成員之一。Redis 支持?jǐn)?shù)據(jù)結(jié)構(gòu),如字符串,散列,列表,集和帶范圍查詢的有序集。數(shù)據(jù)類型
在 spring data redis 的框架,可以很容易地編寫(xiě),通過(guò)提供一個(gè)抽象的數(shù)據(jù)存儲(chǔ)使用 Redis 的鍵值存儲(chǔ)的 Spring 應(yīng)用程序。
非關(guān)系型數(shù)據(jù)庫(kù),基于內(nèi)存,存取數(shù)據(jù)的速度不是關(guān)系型數(shù)據(jù)庫(kù)所能比擬的
redis 是鍵值對(duì) (key-value) 的數(shù)據(jù)庫(kù)
字符串類型 string
散列類型 hash
列表類型 list
集合類型 set
有序集合類型 zset
其中,因?yàn)镾pringBoot 約定大于配置的特點(diǎn),只要我們加入了 spring-data-redis 依賴包并配置 Redis 數(shù)據(jù)庫(kù),SpringBoot 就會(huì)幫我們自動(dòng)配置一個(gè) RedisTemplate ,利用它我們就可以按照以下方式操作對(duì)應(yīng)的數(shù)據(jù)類型,在下面實(shí)戰(zhàn)中我將會(huì)對(duì)這五種數(shù)據(jù)進(jìn)行操作。
redisTemplate.opsForValue(); //操作字符串
redisTemplate.opsForHash(); //操作hash
redisTemplate.opsForList(); //操作list
redisTemplate.opsForSet(); //操作set
redisTemplate.opsForZSet(); //操作有序set
開(kāi)發(fā)環(huán)境SpringBoot 2.1.6 RELEASE
spring-data-redis 2.1.9 RELEASE
Redis 3.2
IDEA
JDK8
mysql
關(guān)于如何安裝 Redis 這里不再贅述,請(qǐng)自行搜索引擎搜索解決。
pom 依賴配置文件org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-redis mysql mysql-connector-java runtime org.projectlombok lombok true com.alibaba fastjson 1.2.58 org.springframework.boot spring-boot-starter-test test
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true username: root password: 123456 jpa: hibernate: ddl-auto: update #ddl-auto:設(shè)為 create 表示每次都重新建表 show-sql: true redis: host: localhost port: 6379 # Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0) database: 1 jedis: pool: #連接池最大連接數(shù) max-active: 8 #最小空閑連接 min-idle: 0 #最大阻塞等待時(shí)間,負(fù)值表示沒(méi)有限制 max-wait: -1ms #最大空閑連接 max-idle: 8 #連接超時(shí)時(shí)間(毫秒) timeout: 20ms # 無(wú)密碼可不寫(xiě) # password:為什么亂碼?
/** * 添加字符串 */ @Test public void setString(){ redisTemplate.opsForValue().set(USERKEY,"nasus"); redisTemplate.opsForValue().set(AGEKEY,24); redisTemplate.opsForValue().set(CITYKEY,"清遠(yuǎn)"); }
首先是添加字符串類型的數(shù)據(jù)。它的運(yùn)行結(jié)果如下:
我們可以看到插入的數(shù)據(jù)是亂碼的,這是因?yàn)?SpringBoot 自動(dòng)配置的這個(gè) RedisTemplate 是沒(méi)有設(shè)置數(shù)據(jù)讀取時(shí)的 key 及 value 的序列化方式的。所以,我們要寫(xiě)一個(gè)自己的 RedisTemplate 并設(shè)置 key 及 value 的序列化方式才可以正常操作 Redis。如下:
@Configuration public class RedisConfig { private final RedisTemplate redisTemplate; @Autowired public RedisConfig(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Bean @SuppressWarnings("unchecked") public RedisTemplateredisTemplate() { RedisSerializer stringSerializer = new StringRedisSerializer(); //RedisSerializer
這時(shí),再次運(yùn)行上面的單元測(cè)試,結(jié)果就正常了。
操作 List/** * 添加、獲取LIST */ @Test public void setList(){ Liststudents = studentService.findStudentList(); log.info("students size = {}", students.size()); //循環(huán)向 studentList 左添加值 students.forEach(value->redisTemplate.opsForList().leftPush(LISTKEY,value)); //向 studentList 右添加值 Student student = new Student(); student.setId(10); student.setAge(24); student.setName("rightPush"); redisTemplate.opsForList().rightPush(LISTKEY,student); // 獲取值 log.info("studentList->{}",redisTemplate.opsForList().range(LISTKEY,0,10)); }
這里需要說(shuō)一下,leftpush 和 rightpush 的區(qū)別,前者是在 key 對(duì)應(yīng) list 的頭部添加元素,也就是我們常說(shuō)的后來(lái)居上,List
獲取值,代碼這里獲取的是 0 到 10 行的數(shù)據(jù),控制臺(tái)打印結(jié)果:
[{"name":"優(yōu)秀","id":9,"age":22}, {"name":"馮某華","id":8,"age":25}, {"name":"藍(lán)某城","id":7,"age":25}, {"name":"優(yōu)秀","id":6,"age":22}, {"name":"馮某華","id":5,"age":25}, {"name":"藍(lán)某城","id":4,"age":25}, {"name":"馮某華","id":3,"age":25}, {"name":"藍(lán)某城","id":2,"age":25}, {"name":"廢人","id":1,"age":22}, {"name":"rightPush","id":10,"age":24}]
添加 List 結(jié)果:
這里注意 1 到 9 行的 id 值剛好是相反的,而正常情況下,我從 mysql 數(shù)據(jù)中查出來(lái)的值是這樣的:
因此,驗(yàn)證了 leftpush 和 rightpush 的區(qū)別。
/** * 添加和獲取Set */ @Test public void setAndGetSet(){ ListusernameList = new ArrayList<>(); usernameList.add("nasus"); usernameList.add("nasus"); usernameList.add("一個(gè)優(yōu)秀的廢人"); //循環(huán)向添加值 usernameList.forEach(value->redisTemplate.opsForSet().add(SETKEY,value)); log.info("取出usernameSet->{}",redisTemplate.opsForSet().members(SETKEY)); } /** * 刪除 Set */ @Test public void delSet(){ redisTemplate.opsForSet().remove(SETKEY,"nasus"); }
Redis 的 set 數(shù)據(jù)結(jié)構(gòu)跟 java 的 hashset 數(shù)據(jù)結(jié)構(gòu)一樣,也是無(wú)序且不重復(fù)。所以我代碼里 add 了兩個(gè) nasus 字符串,其實(shí)只 add 了一個(gè) nasus 。結(jié)果如下:
操作 hash分別作了 hash 的添加、刪除以及獲取,代碼如下:這里需要說(shuō)明一下的是,hash 的 hash 有兩個(gè)鍵可以設(shè)置,其中第一個(gè)是 redis 中的鍵,而第二個(gè)是具體每條數(shù)據(jù)的 hashkey。
/** * 添加 hash */ @Test public void setHash(){ Liststudents = studentService.findStudentList(); //添加 for (Student student : students){ redisTemplate.opsForHash().put(HASHKEY, student.getId().toString(), student); } } /** * 刪除 hash */ @Test public void delHash(){ Student student = studentService.findStudentById(0); // 刪除 redisTemplate.opsForHash().delete(HASHKEY,JSON.toJSONString(student)); } /** * 獲取 Hash */ @Test public void getHash(){ List students = redisTemplate.opsForHash().values(HASHKEY); log.info("values = {}", students); }
添加 hash 操作結(jié)果:
獲取 hash 操作結(jié)果:
源碼地址https://github.com/turoDog/Demo/tree/master/springboot_redis_demo
推薦閱讀SpringBoot | 自動(dòng)配置原理
后語(yǔ)如果本文對(duì)你哪怕有一丁點(diǎn)幫助,請(qǐng)幫忙點(diǎn)好看。你的好看是我堅(jiān)持寫(xiě)作的動(dòng)力。
另外,關(guān)注之后在發(fā)送 1024 可領(lǐng)取免費(fèi)學(xué)習(xí)資料。
資料詳情請(qǐng)看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/62116.html
摘要:引入了新的環(huán)境和概要信息,是一種更揭秘與實(shí)戰(zhàn)六消息隊(duì)列篇掘金本文,講解如何集成,實(shí)現(xiàn)消息隊(duì)列。博客地址揭秘與實(shí)戰(zhàn)二數(shù)據(jù)緩存篇掘金本文,講解如何集成,實(shí)現(xiàn)緩存。 Spring Boot 揭秘與實(shí)戰(zhàn)(九) 應(yīng)用監(jiān)控篇 - HTTP 健康監(jiān)控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
閱讀 2967·2021-11-11 16:55
閱讀 529·2021-09-27 13:36
閱讀 1104·2021-09-22 15:35
閱讀 2929·2019-08-30 12:46
閱讀 3137·2019-08-26 17:02
閱讀 1839·2019-08-26 11:56
閱讀 1305·2019-08-26 11:47
閱讀 434·2019-08-23 17:01