最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis五種數(shù)據(jù)結(jié)構(gòu)在JAVA中如何封裝使用

 更新時間:2021年11月22日 17:31:41   作者:肝鐵俠  
本篇博文就針對Redis的五種數(shù)據(jù)結(jié)構(gòu)以及如何在JAVA中封裝使用做一個簡單的介紹。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

數(shù)據(jù)結(jié)構(gòu)

Redis有五種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),分別為:

1、string(字符串)

2、list(列表)

3、hash(字典)

4、set(集合)

5、zset(有序集合)

接下來我們就來具體看看每種數(shù)據(jù)結(jié)構(gòu)的簡介和常用指令,以及在JAVA中如何封裝使用吧!

string字符串

string字符串簡介

字符串的結(jié)構(gòu)使用非常的廣泛,常見的用途就是緩存用戶信息。比如說博主的《雜貨鋪實戰(zhàn)專欄》中的雜貨鋪項目,郵箱驗證時生成的郵箱驗證碼等等。

我們將要存儲的對象信息使用JSON序列化成字符串,然后將序列化后的字符串使用Redis進行緩存。在取存儲信息的時候進行一次反序列化操作就可以了。

Redis的字符串與Java的字符串有所不同的就是,Java中的String是final類型的字符串,而Redis的字符串是動態(tài)字符串,是可以修改的字符串,內(nèi)部實現(xiàn)結(jié)構(gòu)類似于Java的ArrayList,采用預(yù)分配冗余空間來減少內(nèi)存的頻繁分配。

既Redis會分配比實際字符串大的capacity(空間),擴容的時候就擴容加倍現(xiàn)有的空間。但是字符串的最大長度為512MB。

一些普通的操作比如set、get、exists、del如下:

當然也可以通過mset、mget批量讀寫:

我們都知道,有些數(shù)據(jù)我們是不會讓它長久存儲在緩存里的,所以要設(shè)置對應(yīng)的過期時間,可以通過expire、setex來設(shè)置,并且可以通過sexnx來判斷key值是否存在不存在就創(chuàng)建:

當我們的value是一個整數(shù)的時候,還可以通過incr、decr、incrby、decrby進行增減操作,需要注意的是它的返回是介于signed long的最大值以及最小值之間的,一旦超出這個范圍,就會報錯:

string字符串在Java中的封裝

(注:以下只列舉string類型的工具類的完整寫法,其他數(shù)據(jù)結(jié)構(gòu)只列舉部分寫法)

在pom.xml引入依賴:

        <!-- redis依賴包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

你可以在yml文件中配置,或者在properties文件中配置,挑選一個你認為看著舒服的配置上就好:

# yml文件配置
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:
    jedis:
      pool:
        #連接池最大連接數(shù)(使用負值表示沒有限制)
        max-active: 20
        #連接池最大阻塞等待時間(使用負值表示沒有限制)
        max-wait: -1
        #連接池中的最大空閑連接
        max-idle: 20
        #連接池中的最小空閑連接
        min-idle: 2
    #連接超時時間(毫秒)
    timeout: 5000
# properties文件配置
#Redis服務(wù)器地址
spring.redis.host=127.0.0.1
#Redis服務(wù)器連接端口
spring.redis.port=6379
#Redis數(shù)據(jù)庫索引(默認為0)
spring.redis.database=0
#連接池最大連接數(shù)(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=50
#連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=3000
#連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=20
#連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=2
#連接超時時間(毫秒)
spring.redis.timeout=5000

然后編寫Redis的工具類:

package com.gantiexia.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author GanTieXia
 * @date 2021/11/21 18:07
 */

@Component
public class RedisUtils {

    /** 引入對應(yīng)的依賴后注入即可*/
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 讀取緩存
     *
     * @param key
     * @return
     */
    public String get(final String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 寫入緩存
     */
    public boolean set(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 帶失效時間key
     *
     * @param key
     * @param value
     * @param timeOut
     * @param timeUnit
     * @return
     */
    public boolean setKeyTimeOut(final String key,String value,long timeOut,TimeUnit timeUnit){
        boolean result = false;
        try {
            redisTemplate.opsForValue().set(key, value, timeOut, timeUnit);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 更新緩存
     */
    public boolean getAndSet(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().getAndSet(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 刪除緩存
     */
    public boolean delete(final String key) {
        boolean result = false;
        try {
            redisTemplate.delete(key);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

list列表

list列表簡介

Redis的列表相當于Java語言中的LinkedList,但是它是鏈表,而不是數(shù)組。那么這就意味著它的插入和刪除非???,而索引定位卻是比較慢的。

列表中的每個元素是使用雙向指針連接起來的,支持向前遍歷和向后遍歷。當列表彈出最后一個元素時,該數(shù)據(jù)結(jié)構(gòu)自動刪除,內(nèi)存被回收。

Redis的列表結(jié)構(gòu)可以用來做異步隊列使用。我們把需要延后處理的任務(wù)結(jié)構(gòu)序列化成字符串,存入Redis列表,再啟用另一個線程從列表中取得數(shù)據(jù)進行處理。

隊列

眾所周知,隊列是先進先出的數(shù)據(jù)結(jié)構(gòu),可用于我們常聽到的消息隊列,可確保元素的訪問順序性。

棧是一種先進后出的數(shù)據(jù)結(jié)果,跟我們常用的撤回是一個道理。

還可以通過lindex查找對應(yīng)位置上的元素,lrange 0 -1(-1代表最后一個元素,-2代表倒數(shù)第二個元素)獲取所有的元素,ltrim可以保留某個區(qū)間的元素,砍掉其他位置的元素。但是這些操作的時間復(fù)雜度為O(n),所以一般都不推薦使用。

list列表在Java中的封裝

(完整代碼參考上文string的封裝)

// 根據(jù)你的需要傳入相應(yīng)的參數(shù)
// set方法的主要語句
redisTemplate.opsForList(). ;  // .后面的方法根據(jù)你的應(yīng)用場景寫入

hash(字典)

hash字典簡介

Redis的字典相當于JAVA語言里的HashMap,它是一個無需字典,內(nèi)部存儲了很多鍵值對。

而針對HashMap的概念模型,在博主的JAVA進階篇——HashMap底層實現(xiàn)解析(一)一文中講解得很清晰了。

不同的是,Redis的字典的值只能是字符串,并且他們的rehash也是不一樣的。Java的HashMap在字典很大的時候,rehash是非常耗時的操作,得一次性全部rehash。而redis為了延續(xù)高性能,不產(chǎn)生堵塞,采用了漸進式的rehash策略。

漸進式rehash策略就是會在rehash的同時,保留新舊兩個hash結(jié)構(gòu),查詢時會同時查詢兩個hash結(jié)構(gòu),然后通過后續(xù)的定時任務(wù)以及hash操作指令中,將舊的hash結(jié)構(gòu)轉(zhuǎn)移到新的hash結(jié)構(gòu)中,在最后一個hash元素搬移之后,舊hash結(jié)構(gòu)刪除,內(nèi)存被回收。

hash的好處在哪呢,舉個例子,當我們存儲用戶信息的時候,string是將整條信息直接序列化后存儲,取出來以后還需要反序列化再獲取我們想要的信息。使用hash則可以對用戶結(jié)構(gòu)中的每一個單一字段進行存儲,比如我們要獲取用戶名的之后,就不用拿到一整條用戶信息了,這樣就可以節(jié)省網(wǎng)絡(luò)流量。

但美中不足的是,hash結(jié)構(gòu)的存儲消耗要高于單個字符串。

接下來我們來看看操作:

hash字典在Java中的封裝

(完整代碼參考上文string的封裝)

// 根據(jù)你的需要傳入相應(yīng)的參數(shù)
// set方法的主要語句
redisTemplate.opsForHash(). ;  // .后面的方法根據(jù)你的應(yīng)用場景寫入

set(集合)

set集合簡介

Redis的集合相當于Java中的HashSet,內(nèi)部的鍵值是無序的、唯一的,也就是在Java中我們所常用的使用Set去重。

Redis的集合內(nèi)部相當于一個特殊的字典,字典中每一個key的鍵值value都是NULL,同其他數(shù)據(jù)結(jié)構(gòu)一樣,最后一個元素被移除時,數(shù)據(jù)結(jié)構(gòu)刪除,內(nèi)存被回收。

接下來我們來看看操作指令:

set集合在Java中的封裝

(完整代碼參考上文string的封裝)

// 根據(jù)你的需要傳入相應(yīng)的參數(shù)
// set方法的主要語句
redisTemplate.opsForSet(). ;  //.后面的方法根據(jù)你的應(yīng)用場景寫入

zset(有序列表)

zset有序列表

zset也是一個set,它保證了內(nèi)部value的唯一性,并且給每一個value賦予一個score,代表value的排序權(quán)重。

zset可以用來干什么呢?比如粉絲列表,打開粉絲列表,value存儲用戶信息,score存儲關(guān)注時間,粉絲列表就可以以關(guān)注時間排序展示…等等這里就不做過多的闡述了。

下面我們來看看操作:

zset有序列表在Java中的封裝

(完整代碼參考上文string的封裝)

// 根據(jù)你的需要傳入相應(yīng)的參數(shù)
// set方法的主要語句
redisTemplate.opsForZSet(). ;  // .后面的方法根據(jù)你的應(yīng)用場景寫入

到此這篇關(guān)于Redis五種數(shù)據(jù)結(jié)構(gòu)在JAVA中如何封裝使用的文章就介紹到這了,更多相關(guān)Redis的內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實現(xiàn)和數(shù)據(jù)庫的數(shù)據(jù)同步

    Redis實現(xiàn)和數(shù)據(jù)庫的數(shù)據(jù)同步

    本文介紹了Redis與傳統(tǒng)數(shù)據(jù)庫數(shù)據(jù)同步的幾種常見方法,包括CacheAside、WriteThrough、WriteBehind,以及如何通過分布式事務(wù)、樂觀鎖、數(shù)據(jù)過期策略和消息隊列來解決數(shù)據(jù)一致性問題,每種方法都有其適用場景和優(yōu)缺點,需要根據(jù)具體需求進行選擇
    2025-01-01
  • Redis總結(jié)筆記(二):C#連接Redis簡單例子

    Redis總結(jié)筆記(二):C#連接Redis簡單例子

    這篇文章主要介紹了Redis總結(jié)筆記(二):C#連接Redis簡單例子,需要的朋友可以參考下
    2015-01-01
  • Redis的Python客戶端redis-py安裝使用說明文檔

    Redis的Python客戶端redis-py安裝使用說明文檔

    這篇文章主要介紹了Redis的Python客戶端redis-py安裝使用說明文檔,本文講解了安裝方法、入門使用實例、API參考和詳細說明,需要的朋友可以參考下
    2015-06-06
  • Redisson分布式鎖之加解鎖詳解

    Redisson分布式鎖之加解鎖詳解

    這篇文章主要為大家介紹了Redisson分布式鎖加解鎖的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 虛擬機linux安裝redis實現(xiàn)過程解析

    虛擬機linux安裝redis實現(xiàn)過程解析

    這篇文章主要介紹了虛擬機linux安裝redis實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 淺談Redis緩存有哪些淘汰策略

    淺談Redis緩存有哪些淘汰策略

    redis用做緩存是一種非常常見的手段,然而由于內(nèi)存大小的限制,會導(dǎo)致redis在內(nèi)存空間滿了以后需要處理繼續(xù)存入的數(shù)據(jù),所以就需要淘汰策略,本文就詳細的介紹一下
    2021-08-08
  • 將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫的使用方法

    將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫的使用方法

    這篇文章主要介紹了將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫的使用方法,原理其實只是將內(nèi)存虛擬作為磁盤,需要的朋友可以參考下
    2015-06-06
  • Redis配置外網(wǎng)可訪問(redis遠程連接不上)的方法

    Redis配置外網(wǎng)可訪問(redis遠程連接不上)的方法

    默認情況下,當我們在部署了redis服務(wù)之后,redis本身默認只允許本地訪問。Redis服務(wù)端只允許它所在服務(wù)器上的客戶端訪問,如果Redis服務(wù)端和Redis客戶端不在同一個機器上,就要進行配置。
    2022-12-12
  • Redis服務(wù)器優(yōu)化方式

    Redis服務(wù)器優(yōu)化方式

    文章分享了常見的Redis服務(wù)器優(yōu)化技巧和策略,主要包括內(nèi)存管理、持久化配置、連接配置和網(wǎng)絡(luò)優(yōu)化四個方面,內(nèi)存管理主要是設(shè)置maxmemory參數(shù)和選擇合適的內(nèi)存淘汰策略,持久化配置包括RDB持久化和AOF持久化
    2024-09-09
  • 使用redis實現(xiàn)附近的人功能

    使用redis實現(xiàn)附近的人功能

    這篇文章主要介紹了使用redis實現(xiàn)附近的人,實現(xiàn)諸如附近的人這類依賴于地理位置信息的功能,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-09-09

最新評論

马山县| 宁国市| 安乡县| 滨海县| 东安县| 澄迈县| 武清区| 台中市| 磐石市| 慈溪市| 瓮安县| 华阴市| 宝山区| 祁阳县| 资阳市| 临澧县| 罗田县| 来凤县| 淮滨县| 莆田市| 依兰县| 崇明县| 稻城县| 孟州市| 垦利县| 炎陵县| 南京市| 德州市| 丰县| 遂溪县| 奈曼旗| 洪洞县| 逊克县| 宁明县| 贡嘎县| 龙门县| 吉林省| 邵东县| 衡山县| 社旗县| 监利县|