24-springboot操作redis



RedisTemplate放入對象的時候,對象應該序列化。取出對象的時候,也會自動進行反序列化
/
/
/
/
一、引入依賴

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

二、編寫配置文件

我們啟動springboot后,會自動給我們創建RedisTemplate和StringRedisTemplate,我們可以直接在工廠中使用他們。

三、編寫代碼
1、對stringRedisTemplate的測試

package com.study;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.*;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class SpringbootRedisApplicationTests {

    //注入StringRedisTemplate
    @Autowired
    private StringRedisTemplate stringRedisTemplate; //key 和 value都是字符串

    //操作redis中的key
    @Test
    public void testKey(){
        /*
        注意api與我們終端寫的不一樣,並且操作key不用在stringRedisTemplate后寫opsForKey
         */
        stringRedisTemplate.delete("name");//刪除一個key
        Boolean name = stringRedisTemplate.hasKey("name");//判斷一個key是否存在
        System.out.println(name);
        stringRedisTemplate.type("name");//判斷key所對應的類型
        stringRedisTemplate.keys("*");//獲取所有的key
        Long name1 = stringRedisTemplate.getExpire("name");//獲取key的超時時間 -1 永不超時 -2 key不存在
        System.out.println(name1);
        stringRedisTemplate.rename("age", "age1");//修改key的名字  要求key必須存在 不存在會報錯
        stringRedisTemplate.renameIfAbsent("age", "age1");//如果key存在才修改名字,否則不修改
        stringRedisTemplate.move("name", 1);//移動key到指定庫
    }


    //操作redis中字符串 opsForValue實際操作就是redis中的String類型
    @Test
    public void testString(){
        stringRedisTemplate.opsForValue().set("name", "小陳");//set用來設置一個key value
        String name = stringRedisTemplate.opsForValue().get("name");//用來獲取一個key對應的value
        System.out.println(name);

        stringRedisTemplate.opsForValue().set("code", "2357", 120, TimeUnit.SECONDS);//設置一個key的超時時間(我們短信驗證碼的超時時間就是用這個做的)

        stringRedisTemplate.opsForValue().append("name", "他是一個好人");//給key的value追加內容
    }


    //操作list   stringRedisTemplate.opsForList()
    @Test
    public void testList(){
//        stringRedisTemplate.opsForList().leftPush("names", "xiaochen");//創建列表,放入一個元素
//        stringRedisTemplate.opsForList().leftPushAll("names", "xiaowang", "xiaoming", "xiaohei");//放入多個元素

//        List<String> names = new ArrayList<>();
//        names.add("aaa");
//        names.add("bbb");
//        stringRedisTemplate.opsForList().leftPushAll("names", names);//創建一個列表,放入多個元素

        List<String> names = stringRedisTemplate.opsForList().range("names", 0, -1);//循環遍歷
        for (String name : names) {
            System.out.println(name);
        }

        stringRedisTemplate.opsForList().trim("names", 1, 3);


    }


    //操作set    stringRedisTemplate.opsForSet()
    @Test
    public void testSet(){
        stringRedisTemplate.opsForSet().add("sets", "zhangsan", "lisi", "wangwu");//創建set,並放入多個元素
        Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
        for (String name : sets) {
            System.out.println(name);
        }

        Long sets1 = stringRedisTemplate.opsForSet().size("sets");
        System.out.println(sets1);
    }

    //操作hash   stringRedisTemplate.opsForHash()
    @Test
    public void tetstHash(){
        stringRedisTemplate.opsForHash().put("maps", "name", "zhangsan");//創建一個hash類型

        Map<String, String> map = new HashMap<>();
        map.put("age", "12");
        map.put("bir", "2012-12-12");
        stringRedisTemplate.opsForHash().putAll("maps", map);

        stringRedisTemplate.opsForHash().get("maps", "name");//獲取hash中某個key的值

        stringRedisTemplate.opsForHash().values("maps");//獲取所有key的值

        stringRedisTemplate.opsForHash().keys("maps");//獲取所有keys

        stringRedisTemplate.opsForHash().multiGet("maps", Arrays.asList("name", "age"));//獲取多個key的value

        
    }

    //操作zset   stringRedisTemplate.opsForZSet()
    @Test
    public void testZset(){
        stringRedisTemplate.opsForZSet().add("zsets", "zhangsan", 100);//創建並放入元素
        stringRedisTemplate.opsForZSet().add("zsets", "lisi", 90);//創建並放入元素
        stringRedisTemplate.opsForZSet().add("zsets", "wangwu", 80);//創建並放入元素

//        Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);//獲取所有元素
//        for (String zset : zsets) {
//            System.out.println(zset);
//        }

        //獲取指定分數范圍的值
        Set<ZSetOperations.TypedTuple<String>> zsets = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets", 0, 100);
        for (ZSetOperations.TypedTuple<String> zset : zsets) {
            System.out.println(zset.getValue() + "::" + zset.getScore());
        }
    }


}

2、對RedisTemplate的測試
通過redisTemplate存入redis中的key和value都是經過序列化后的對象,如果我們存入的對象的實體類沒有實現序列化接口,那么就會報錯,如下



當我們實現序列化接口后,就可以正常存儲。

圈中就是序列化的標記,並且我們不能通過redis客戶端取,因為redis客戶端不能實現序列化。
/
/
/
/
/
/
/
/
存儲時不對key進行序列化

/
/
/
/
/
/
/
對於hash類型也要特殊處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM