目錄
Redis
1、 新增redis依賴
2、設定檔
3、操作redis API
RedisTemplate<Object, Object> 看起來比StringRedisTemplate 更『牛逼』一些,因為它不強求鍵和值的型別必須是String 。
若springboot中沒有引入spring-boot-starter-web依賴,則需要加jackson 的依賴。
a、鍵過期
首頁 資料庫 Redis Java SpringBoot操作Redis的方法是什麼

Java SpringBoot操作Redis的方法是什麼

Jun 03, 2023 pm 06:01 PM
java redis springboot

    Redis

    1、 新增redis依賴

    spring Boot 提供了對Redis 整合的元件包: spring-boot-starter-data-redis,它依賴spring-data-redis 和lettuce 。

    另外,這裡還有兩個小細節:

    • Spring Boot 1.x 時代,spring-data-redis 底層使用的是Jedis;2.x 時代換成了Lettuce 。

    • Lettuce依賴commons-pool2

    <!-- springboot整合redis--> 
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- 使用 lettuce 时要加这个包;使用 jedis 时则不需要。-->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
    </dependency>
    登入後複製

    2、設定檔

    ## Redis 服务器地址
    spring.redis.host=localhost
    ## Redis 服务器连接端口
    spring.redis.port=6379
    ## Redis 数据库索引(默认为 0)
    spring.redis.database=0
    
    ## 以下非必须,有默认值
    ## Redis 服务器连接密码(默认为空)
    spring.redis.password=
    ## 连接池最大连接数(使用负值表示没有限制)默认 8
    spring.redis.lettuce.pool.max-active=8
    ## 连接池最大阻塞等待时间(使用负值表示没有限制)默认 -1
    spring.redis.lettuce.pool.max-wait=-1
    ## 连接池中的最大空闲连接 默认 8
    spring.redis.lett	uce.pool.max-idle=8
    ## 连接池中的最小空闲连接 默认 0
    spring.redis.lettuce.pool.min-idle=0
    登入後複製

    3、操作redis API

    在這個單元測試中,我們使用redisTemplate 儲存了一個字串 "Hello Redis" 。

    Spring Data Redis 針對api 進行了重新歸類與封裝,將相同類型的操作封裝為 Operation 介面:

    專有操作說明ValueOperationsstring 類型的資料運算
    ##ListOperations list 類型的資料操作
    SetOperations

    set 類型資料操作

    ZSetOperations

    # zset 類型資料操作

    HashOperations
    map 類型的資料操作

    //解决中文乱码问题
    @Configuration
    public class RedisConfig {
        
        @Bean
        public RedisTemplate redisTemplateInit(RedisConnectionFactory redisConnectionFactory) {
    
            RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
    
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            //设置序列化Key的实例化对象
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            //设置序列化Value的实例化对象
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
            /**
             *
             * 设置Hash类型存储时,对象序列化报错解决
             */
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
            return redisTemplate;
        }
    }
    登入後複製

    4、RedisTemplate 和StringRedisTemplate

    RedisTemplate 看起來比StringRedisTemplate 更『牛逼』一些,因為它不強求鍵和值的型別必須是String 。

    但是很顯然,這和 Redis 的實際情況是相違背的:在最小的儲存單元層面,Redis 本質上只能存字串,不可能存其它的類型。這麼看來,StringRedisTemplate 更貼合 Redis 的儲存本質。 RedisTemplate是如何透過對值序列化來支援任何型別的呢?。

    而使用RedisTemplate 儲存物件時會把物件的位址保存起來,以便反序列化,這樣就大大浪費儲存空間,解決這個問題使用StringRedisTemplate ,認為手動對對想序列化與反序化

     Users users = new Users();
     users.setId(2);
     users.setUsername("李四2");
     redisTemplate.opsForValue().set("user:2", JSON.toJSONString(users)); //存的时候序列化对象
     String u = redisTemplate.opsForValue().get("user:2");  //redis 只能返回字符串
     System.out.println("u="+ JSON.parseObject(u,Users.class));  //使用JSON工具反序化成对象
    登入後複製

    若springboot中沒有引入spring-boot-starter-web依賴,則需要加jackson 的依賴。

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
    </dependency>
    登入後複製

    5、SpringBoot操作String字串

    a、鍵過期

    key的自動過期問題,Redis 在存入每個資料的時候都可以設定一個超時間,過了這個時間就會自動刪除資料。

    ###常用的redis時間單位#########MINUTES###:分鐘#########SECONDS###:秒######## DAYS###: 天###
    //给user对象设置10分钟过期时间
    redisTemplate.opsForValue().set("user:1", JSON.toJSONString(users),10,TimeUnit.MINUTES );
    登入後複製
    ###b、刪除資料###
     //删除键
     redisTemplate.delete(key);
     //判断键是否存在
     boolean exists = redisTemplate.hasKey(key);
    登入後複製
    ###6、SpringBoot操作Hash(雜湊)######一般我們儲存一個鍵,很自然的就會使用get/set 去存儲,實際上這並不是很好的做法。 Redis 儲存一個 key 會有一個最小內存,不管你存的這個鍵多小,都不會低於這個內存,因此合理的使用 Hash 可以幫我們節省很多內存。 ###
    	@Test
        public void testHash() {
            String key = "tom";
            HashOperations<String, Object, Object> operations = redisTemplate.opsForHash();
            operations.put(key, "name", "tom");
            operations.put(key, "age", "20");
            String value= (String) operations.get(key,"name");
            System.out.println(value);
        }
    登入後複製
    ###根據上述測試案例發現,Hash set 的時候需要傳入三個參數,第一個為 key,第二個為 field,第三個為儲存的值。一般情況下 Key 代表一組數據,field 為 key 相關的屬性,而 value 就是屬性對應的值。 ######7、SpringBoot操作List集合類型######Redis List 的應用場景非常多,也是 Redis 最重要的資料結構之一。使用 List 可以輕鬆的實作一個佇列, List 典型的應用程式場景就是訊息佇列,可以利用 List 的 Push 操作,將任務存在 List 中,然後工作執行緒再用 POP 操作將任務取出執行。 ###
    /**
         * 测试List
         * leftPush 将数据添加到key对应的现有数据的左边,也就是头部
         * leftPop  取队列最左边数据(从数据库移除)
         * rightPush 将数据添加到key对应的现有数据的右边,也就是尾部
         */
        @Test
        public void testList() {
            final String key = "list";
            ListOperations<String,Object> list = redisTemplate.opsForList();
            list.leftPush(key, "hello");
            list.leftPush(key, "world");
            list.leftPush(key, "goodbye");
          
            Object mete = list.leftPop("list");
            System.out.println("删除的元素是:"+mete); //删除 goodbye 
            String value = (String) list.leftPop(key);
    
            System.out.println(value.toString());
            
            // range(key, 0, 2) 从下标0开始找,找到2下标
            List<Object> values = list.range(key, 0, 2);
            for (Object v : values) {
                System.out.println("list range :" + v);
            }
        }
    }
    登入後複製
    ###Redis List 的實現為雙向鍊錶,即可以支援反向查找和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,Redis 內部的許多實現,包括發送緩衝隊列等也都是用的這個資料結構。 ######8、SpringBoot操作Set集合類型######Redis Set 對外提供的功能與List 類似,是一個清單的功能,特殊之處在於Set 是可以自動排重的,當你需要儲存一個列表數據,而且不希望出現重複數據時,Set 是一個很好的選擇,而Set 提供了判斷某個成員是否在一個Set 集合內的重要接口,這個也是List 所不能提供的。 ###
     /**
         * 测试Set
         */
        @Test
        public void testSet() {
            final String key = "set";
            SetOperations<String,Object> set = redisTemplate.opsForSet();
            set.add(key, "hello");
            set.add(key, "world");
            set.add(key, "world");
            set.add(key, "goodbye");
            Set<Object> values = set.members(key);
            for (Object v : values) {
                System.out.println("set value :" + v);
            }
           
            Boolean exist = set.isMember(key,"hello") //判断是否存在某个元素
            operations.move("set", "hello", "setcopy"); //把set集合中的hello元素放到setcopy 中
     
        }
    }
    登入後複製
    ###9、SpringBoot操作ZSet集合類型######Redis ZSet 的使用場景與Set 類似,差異在於Set 不是自動有序的,而ZSet 可以透過使用者額外提供一個優先權(Score )的參數來為成員排序,並且是插入有序,即自動排序。 ###
    	/**
         * 测试ZSet
         * range(key, 0, 3) 从开始下标到结束下标,score从小到大排序
         * reverseRange  score从大到小排序
         * rangeByScore(key, 0, 3); 返回Score在0至3之间的数据
         */
        @Test
        public void testZset() {
            final String key = "lz";
            ZSetOperations<String,Object> zset = redisTemplate.opsForZSet();
            zset.add(key, "hello", 1);
            zset.add(key, "world", 6);
            zset.add(key, "good", 4);
            zset.add(key, "bye", 3);
    
            Set<Object> zsets = zset.range(key, 0, 3);
            for (Object v : zsets) {
                System.out.println("zset-A value :"+v);
            }
            
            System.out.println("=======");
            Set<Object> zsetB = zset.rangeByScore(key, 0, 3);
            for (Object v : zsetB) {
                System.out.println("zset-B value :"+v);
            }
        }
    }
    登入後複製

    以上是Java SpringBoot操作Redis的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱門文章

    <🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系統,解釋
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Java教學
    1665
    14
    CakePHP 教程
    1424
    52
    Laravel 教程
    1322
    25
    PHP教程
    1270
    29
    C# 教程
    1249
    24
    如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

    Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

    REDIS的角色:探索數據存儲和管理功能 REDIS的角色:探索數據存儲和管理功能 Apr 22, 2025 am 12:10 AM

    Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

    Spring Boot中OAuth2Authorization對象Redis緩存失敗怎麼辦? Spring Boot中OAuth2Authorization對象Redis緩存失敗怎麼辦? Apr 19, 2025 pm 08:03 PM

    SpringBoot中使用Redis緩存OAuth2Authorization對像在SpringBoot應用中,使用SpringSecurityOAuth2AuthorizationServer...

    REDIS:了解其架構和目的 REDIS:了解其架構和目的 Apr 26, 2025 am 12:11 AM

    Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

    使用RedisTemplate進行批量查詢時,為什麼返回值會為空? 使用RedisTemplate進行批量查詢時,為什麼返回值會為空? Apr 19, 2025 pm 10:15 PM

    使用RedisTemplate進行批量查詢時為何返回值為空?在使用RedisTemplate進行批量查詢操作時,可能會遇到返回的結果�...

    為什麼redisTemplate.opsForList().leftPop()方法不支持傳入參數來一次性彈出多個值? 為什麼redisTemplate.opsForList().leftPop()方法不支持傳入參數來一次性彈出多個值? Apr 19, 2025 pm 10:27 PM

    關於RedisTemplate.opsForList().leftPop()不支持傳個數的原因在使用Redis時,很多開發者會遇到一個問題:為什麼redisTempl...

    在多節點環境下,如何確保Spring Boot的@Scheduled定時任務只在一個節點上執行? 在多節點環境下,如何確保Spring Boot的@Scheduled定時任務只在一個節點上執行? Apr 19, 2025 pm 10:57 PM

    SpringBoot定時任務在多節點環境下的優化方案在開發Spring...

    作曲家:通過AI的幫助開發PHP 作曲家:通過AI的幫助開發PHP Apr 29, 2025 am 12:27 AM

    AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

    See all articles