SpringBoot集成Redis用法筆記
今天給大家整理一下SpringBoot集成Redis用法筆記,希望對(duì)大家能有所幫助!
一、Redis優(yōu)點(diǎn)介紹
1、速度快
不需要等待磁盤(pán)的IO,在內(nèi)存之間進(jìn)行的數(shù)據(jù)存儲(chǔ)和查詢(xún),速度非常快。當(dāng)然,緩存的數(shù)據(jù)總量不能太大,因?yàn)槭艿轿锢韮?nèi)存空間大小的限制。
2、支持多種數(shù)據(jù)庫(kù)類(lèi)型
豐富的數(shù)據(jù)結(jié)構(gòu) 除了string之外,還有l(wèi)ist、hash、set、sortedset,一共五種類(lèi)型。
3、單線(xiàn)程數(shù)據(jù)庫(kù)
單線(xiàn)程,避免了線(xiàn)程切換和鎖機(jī)制的性能消耗。
4、可持久化
支持RDB與AOF兩種方式,將內(nèi)存中的數(shù)據(jù)寫(xiě)入外部的物理存儲(chǔ)設(shè)備。
5、支持發(fā)布/訂閱。
6、支持Lua腳本。
7、支持分布式鎖
在分布式系統(tǒng)中,如果不同的節(jié)點(diǎn)需要訪(fǎng)同到一個(gè)資源,往往需要通過(guò)互斥機(jī)制來(lái)防止彼此干擾,并且保證數(shù)據(jù)的一致性。在這種情況下,需要使用到分布式鎖。分布式鎖和Java的鎖用于實(shí)現(xiàn)不同線(xiàn)程之間的同步訪(fǎng)問(wèn),原理上是類(lèi)似的。
8、支持原子操作和事務(wù)Redis事務(wù)是一組命令的集合。
一個(gè)事務(wù)中的命令要么都執(zhí)行,要么都不執(zhí)行。如果命令在運(yùn)行期間出現(xiàn)錯(cuò)誤,不會(huì)自動(dòng)回滾。
9、支持主從復(fù)制
支持主-從(Master-Slave)復(fù)制與高可用(Redis Sentinel)集群(3.0版本以上)
10、支持管道模式
支持管道Redis管道是指客戶(hù)端可以將多個(gè)命令一次性發(fā)送到服務(wù)器,然后由服務(wù)器一次性返回所有結(jié)果。管道技術(shù)的優(yōu)點(diǎn)是:在批量執(zhí)行命令的應(yīng)用場(chǎng)景中,可以大大減少網(wǎng)絡(luò)傳輸?shù)拈_(kāi)銷(xiāo),提高性能。
11、支持多種編程語(yǔ)言
二、示例
1、下載redis
大家可以在官網(wǎng)下載 :https://redis.io/ ,有需要的話(huà)也可以留言直接發(fā)給大家。
然后啟動(dòng)redis。
2、引入依賴(lài) pom.xml
- <!--redis依賴(lài)配置-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
3、增加配置
- redis:
- host: localhost
- database: 0
- port: 6379
- password:
- jedis:
- pool:
- max-active: 8
- max-wait: -1ms
- max-idle: 8
- min-idle: 0
- timeout: 3000ms
4、示例代碼
- package my.springboot.redis;
- import my.springboot.redis.entity.UserDO;
- import my.springboot.redis.service.IUserInfoService;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.data.redis.core.*;
- import org.springframework.test.context.junit4.SpringRunner;
- import java.util.*;
- import java.util.concurrent.TimeUnit;
- /**
- * 測(cè)試UserInfo用法
- **/
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class RedisTest {
- @Autowired
- private RedisTemplate redisTemplate;
- /*ValueOperations:簡(jiǎn)單K - V操作
- SetOperations:set類(lèi)型數(shù)據(jù)操作
- ZSetOperations:zset類(lèi)型數(shù)據(jù)操作
- HashOperations:針對(duì)map類(lèi)型的數(shù)據(jù)操作
- ListOperations:針對(duì)list類(lèi)型的數(shù)據(jù)操作*/
- @Test
- public void redisStrTest() {
- ValueOperations<String,Object> valueOperations = redisTemplate.opsForValue();
- valueOperations.set("name1","小明");
- valueOperations.set("name2","小李");
- System.out.println("刪除前:"+valueOperations.get("name1"));
- redisTemplate.delete("name1");
- //設(shè)置name1 60秒 過(guò)期
- redisTemplate.expire("name1",60, TimeUnit.SECONDS);
- System.out.println("刪除后:"+valueOperations.get("name1"));
- UserDO user= new UserDO();
- user.setId(1);
- user.setUserName("小明");
- user.setPassword("123456");
- valueOperations.set("user",user);
- UserDO user1= (UserDO) valueOperations.get("user");
- }
- @Test
- public void redisListTest() {
- ListOperations<String,List<String>> listOperations=redisTemplate.opsForList();
- List<String> list=new ArrayList<>();
- list.add("籃球");
- list.add("足球");
- listOperations.leftPushAll("list:str",list);
- List<String> ll=listOperations.range("list:str",0,-1).get(0);
- long size= listOperations.size("list:str");
- for (String item: ll ) {
- System.out.println(item);
- }
- // 移除操作
- redisTemplate.delete("list:str");
- List<String> aa=listOperations.leftPop("list:str");
- System.out.println(listOperations.leftPop("list:str"));
- }
- @Test
- public void redisHashTest() {
- HashOperations<String,Object,UserDO> hashOperations = redisTemplate.opsForHash();
- UserDO user= new UserDO();
- user.setId(1);
- user.setUserName("小明");
- user.setPassword("123456");
- hashOperations.put("user:hash",user.hashCode()+"",user);
- System.out.println(hashOperations.get("user:hash",user.hashCode()+"").getUserName());
- }
- @Test
- public void redisSettTest() {
- SetOperations<String,UserDO> sortOperations = redisTemplate.opsForSet();
- UserDO user= new UserDO();
- user.setId(1);
- user.setUserName("小明");
- user.setPassword("123456");
- UserDO user1= new UserDO();
- user1.setId(2);
- user1.setUserName("小張");
- user1.setPassword("888888");
- sortOperations.add("user:sort",user,user1);
- Set<UserDO> result = sortOperations.members("user:sort");
- for (UserDO item : result ) {
- System.out.println(item.getUserName());
- }
- redisTemplate.delete("user:sort");
- System.out.println(result);
- }
- @Test
- public void redisZSetTest() {
- redisTemplate.delete("ranking-list");
- ZSetOperations<String,String> zsortOperations = redisTemplate.opsForZSet();
- //向集合中插入元素,并設(shè)置分?jǐn)?shù)
- zsortOperations.add("ranking-list", "小明", 80);
- //向集合中插入多個(gè)元素
- DefaultTypedTuple<String> tuple1 = new DefaultTypedTuple<String>("小王", 100.0);
- DefaultTypedTuple<String> tuple2 = new DefaultTypedTuple<String>("小張", 90.0);
- zsortOperations.add("ranking-list", new HashSet<>(Arrays.asList(tuple1, tuple2)));
- System.out.println(zsortOperations.range("ranking-list",0,-1));
- }
- }
原文鏈接:https://programmerblog.xyz
本文轉(zhuǎn)載自微信公眾號(hào)「IT技術(shù)分享社區(qū)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系IT技術(shù)分享社區(qū)公眾號(hào)。