1. 程式人生 > >SpringBoot入門 (七) Redis訪問操作

SpringBoot入門 (七) Redis訪問操作

ring 復制 一個隊列 多個 boot 人員 入門 left 大連

本文記錄學習在SpringBoot中使用Redis。

一 什麽是Redis

  Redis 是一個速度非常快的非關系數據庫(Non-Relational Database),它可以存儲鍵(Key)與 多種不同類型的值(Value)之間的映射(Mapping),可以將存儲在內存的鍵值對數據持久化到硬盤,可以使用復制特性來擴展讀性能,還可以使用客戶端分片來擴展寫性能。Redis主要有以下幾個優點:

  1 性能極高,它每秒可執行約 100,000 個 Set 以及約 100,000 個 Get 操作;

  2 豐富的數據類型,Redis 對大多數開發人員已知的大多數數據類型提供了原生支持,這使得各種問題得以輕松解決;

  3 原子性,因為所有 Redis 操作都是原子性的,所以多個客戶端會並發地訪問一個 Redis 服務器,獲取相同的更新值;

  4 豐富的特性,Redis 是一個多效用工具,有非常多的應用場景,包括緩存、消息隊列(Redis 原生支持發布/訂閱)、短期應用程序數據(比如 Web 會話、Web 頁面命中計數)等。

  目前我們常用的Value的數據類型有String(字符串),Hash(哈希),List(列表),Set(集合),Zset(有序集合)。

二 SpringBoot集成Redis

  SpringBoot提供了對Redis的集成的模塊,包是spring-boot-starter-data-redis,它依賴於 spring-data-redis 和 lettuce,lettuce是一個線程安全的redis客戶端。

  在pom.xml中引入依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>  

  在application.properties中配置Redis的連接信息

# redis 配置
## redis數據庫索引(默認0)
spring.redis.database=0
## redis 服務器地址
spring.redis.host=localhost
## redis 服務器端口
spring.redis.port=6379
## redis數據庫密碼(默認為空)
spring.redis.password=
## redis連接池最大連接數(使用負數表示沒有顯示,默認8)
spring.redis.lettuce.pool.max-active=8
## 連接池最大阻塞等待時間(使用負值表示沒有限制,默認-1)
spring.redis.lettuce.pool.max-wait=-1
## 連接池中的最大空閑連接 默認 8
spring.redis.lettuce.pool.max-idle=8
## 連接池中的最小空閑連接 默認 0
spring.redis.lettuce.pool.min-idle=0

  有了上邊這兩個步驟之後,我們啟動服務後,SpringBoot就會幫我們連接到Redis服務器,並給我們提供了一個RedisTemplate類供我們使用操作Redis。我們在需要用的地方註入RedisTemplate就可以輕松完成操作。

三 測試

  使用Junit做測試,在我們的單元測試類中註入RedisTemplate

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

}

  String字符串操作,value是一個字符串,通過delete(key)刪除

@Test
    public void testString() throws InterruptedException {
        //字符串
        ValueOperations strOps = redisTemplate.opsForValue();
        strOps.set("name", "梓&藝");
        System.out.println("字符串結果name:"+strOps.get("name"));
        //刪除key
        redisTemplate.delete("name");
}

  對象操作,value是一個對象

@Test
    public void testObject() throws InterruptedException {
        ValueOperations objOps = redisTemplate.opsForValue();
        City city = new City(1, "X`A", "西安");
        objOps.set("city", city);
        System.out.println(objOps.get("city").toString());
        redisTemplate.delete("city");
}

  設置key的過期時間,在set時加上過期時間,通過hasKey(key)來判斷key是否還存在

@Test
public void testExpire(){
  //過期
        ValueOperations objOps1 = redisTemplate.opsForValue();
        City city1 = new City(1, "BJ", "北京");
        objOps1.set("expire", city1, 2000, TimeUnit.MILLISECONDS);
        System.out.println(objOps1.get("expire").toString());
        Thread.sleep(2000);
        System.out.println(redisTemplate.hasKey("expire"));  
}

  hash哈希操作

@Test
    public void testHash() {
        HashOperations hashOps = redisTemplate.opsForHash();
        hashOps.put("hash","hashKey","hashValue");
        System.out.println(hashOps.get("hash", "hashKey"));
    }

  在上邊的代碼中可以看出,Hash Set的時候就是在哈希表 Key 中的域(Field)的值設為 value。如果 Key 不存在,一個新的哈希表被創建並進行 Hash set 操作;如果域(Field)已經存在於哈希表中,舊值將被覆蓋。

  List列表操作

@Test
    public void testList() {
        ListOperations<String, String> listOps = redisTemplate.opsForList();
        listOps.leftPush("list","梓");
        listOps.leftPush("list","&");
        listOps.leftPush("list","藝");
        System.out.println(listOps.leftPop("list"));
    }

  列表操作時我們通過 leftPush 或者 rightPush 來將數據存入列表中,通過 leftPop 或者rightPop將數據取出來,我們可以利用它來實現一個隊列。

  Set集合操作

@Test
    public void testSet() {
        SetOperations<String, String> setOps = redisTemplate.opsForSet();
        setOps.add("set","梓");
        setOps.add("set","&");
        setOps.add("set","&");
        setOps.add("set","藝");
        System.out.println(setOps.members("set"));
    }

  Set是一個沒有順序的集合,key相同時,如果value已經存在了,後邊進入的會把前邊的覆蓋掉

  ZSet有序集合操作

@Test
    public void testZSet() {
        ZSetOperations zSetOps = redisTemplate.opsForZSet();
        zSetOps.add("zSet", "梓", 1);
        zSetOps.add("zSet", "&", 2);
        zSetOps.add("zSet", "藝", 3);
        zSetOps.add("zSet", "zi", 1);
        zSetOps.add("zSet", "yi", 3);
        System.out.println(zSetOps.rangeByScore("zSet", 1, 3));
    }

  add 方法的3個參數分別是key,value,數據插入位置。ZSet中存儲的數據都是有順序的,輸出時順序按照存儲時設置的從小到大,如果遇到key相同,Value和順序一樣的,後邊的會把前邊的覆蓋掉,range方法後邊的2個參數時插入的位置。如上的輸出

技術分享圖片

SpringBoot入門 (七) Redis訪問操作