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

Redis中Hash函數(shù)的12種用法詳解

 更新時(shí)間:2025年09月09日 09:39:37   作者:墨夶  
在Redis中,Hash(哈希)類(lèi)型 是存儲(chǔ)對(duì)象屬性的黃金方案,無(wú)論是用戶(hù)信息、商品庫(kù)存,還是配置參數(shù),Hash都能以 O(1) 的時(shí)間復(fù)雜度 實(shí)現(xiàn)高效讀寫(xiě),本文將通過(guò) 12種Hash函數(shù),結(jié)合 Java代碼+Redis命令,帶你從零到精通,需要的朋友可以參考下

為什么Redis Hash是開(kāi)發(fā)者的“瑞士軍刀”?

在Redis中,Hash(哈希)類(lèi)型 是存儲(chǔ)對(duì)象屬性的黃金方案。無(wú)論是用戶(hù)信息、商品庫(kù)存,還是配置參數(shù),Hash都能以 O(1) 的時(shí)間復(fù)雜度 實(shí)現(xiàn)高效讀寫(xiě)。

但你真的掌握它的全部潛力了嗎?

  • 你知道 HSETHMSET 的區(qū)別嗎?
  • 為什么 HGETALL 在大字段時(shí)可能成為“定時(shí)炸彈”?
  • 如何用 HINCRBY 實(shí)現(xiàn)原子計(jì)數(shù)?

本文將通過(guò) 12種Hash函數(shù),結(jié)合 Java代碼+Redis命令,帶你從零到精通!

一、Hash函數(shù)的底層原理:為何如此高效?

Redis Hash底層基于 哈希表(Hash Table) 實(shí)現(xiàn),使用 MurmurHash2 算法 映射字段名到存儲(chǔ)位置,并通過(guò) 鏈地址法 解決沖突。

核心優(yōu)勢(shì)

  • 原子操作:?jiǎn)未尾僮髦苯佣ㄎ蛔侄危瑹o(wú)需遍歷。
  • 緊湊編碼:小字段自動(dòng)使用 ziplist 壓縮存儲(chǔ)。
  • 靈活擴(kuò)展:支持動(dòng)態(tài)增刪字段,無(wú)需預(yù)分配空間。

二、12種Hash函數(shù)詳解與實(shí)戰(zhàn)

1. HSET:設(shè)置單個(gè)字段

功能:設(shè)置字段的值,若字段已存在則更新。

Java示例

import redis.clients.jedis.Jedis;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        // 設(shè)置用戶(hù)信息
        String key = "user:1001";
        String field = "username";
        String value = "Alice";
        
        // 使用HSET設(shè)置單個(gè)字段
        long result = jedis.hset(key, field, value); // 返回新增字段數(shù)(1)
        System.out.println("HSET result: " + result);
        
        jedis.close();
    }
}

Redis命令

HSET user:1001 username Alice

場(chǎng)景:初始化用戶(hù)屬性,如注冊(cè)時(shí)設(shè)置用戶(hù)名。

2. HMSET:批量設(shè)置字段

功能:一次設(shè)置多個(gè)字段-值對(duì)。

Java示例

import redis.clients.jedis.Jedis;
import java.util.Map;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        Map<String, String> fields = Map.of(
            "age", "25",
            "email", "alice@example.com"
        );
        
        // 批量設(shè)置字段
        jedis.hmset(key, fields);
        
        System.out.println("User data set successfully!");
        jedis.close();
    }
}

Redis命令

HMSET user:1001 age 25 email alice@example.com

場(chǎng)景:一次性初始化用戶(hù)對(duì)象的多個(gè)屬性。

3. HGET:獲取單個(gè)字段值

功能:獲取指定字段的值。

Java示例

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        String field = "username";
        
        // 獲取字段值
        String value = jedis.hget(key, field);
        System.out.println("Username: " + value); // 輸出: Alice
        
        jedis.close();
    }
}

Redis命令

HGET user:1001 username

場(chǎng)景:讀取用戶(hù)信息,如登錄時(shí)驗(yàn)證用戶(hù)名。

4. HMGET:批量獲取字段值

功能:一次獲取多個(gè)字段的值。

Java示例

import redis.clients.jedis.Jedis;
import java.util.List;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        String[] fields = {"username", "age"};
        
        // 批量獲取字段值
        List<String> values = jedis.hmget(key, fields);
        for (String v : values) {
            System.out.println("Field value: " + v);
        }
        
        jedis.close();
    }
}

Redis命令

HMGET user:1001 username age

場(chǎng)景:快速讀取用戶(hù)的核心信息,如展示用戶(hù)資料。

5. HGETALL:獲取所有字段和值

功能:獲取Hash中所有字段及值。

Java示例

import redis.clients.jedis.Jedis;
import java.util.Map;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        
        // 獲取所有字段和值
        Map<String, String> allFields = jedis.hgetAll(key);
        allFields.forEach((field, value) -> 
            System.out.println(field + ": " + value)
        );
        
        jedis.close();
    }
}

Redis命令

HGETALL user:1001

警告

  • 若字段過(guò)多(如萬(wàn)級(jí)以上),可能導(dǎo)致 阻塞Redis線(xiàn)程
  • 替代方案:使用 HSCAN 漸進(jìn)式遍歷。

6. HDEL:刪除字段

功能:刪除一個(gè)或多個(gè)字段。

Java示例

import redis.clients.jedis.Jedis;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        
        // 刪除字段
        long deletedCount = jedis.hdel(key, "email");
        System.out.println("Deleted fields: " + deletedCount);
        
        jedis.close();
    }
}

Redis命令

HDEL user:1001 email

場(chǎng)景:用戶(hù)注銷(xiāo)時(shí)清除敏感信息。

7. HEXISTS:判斷字段是否存在

功能:檢查字段是否存在于Hash中。

Java示例

import redis.clients.jedis.Jedis;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        String field = "age";
        
        // 檢查字段是否存在
        boolean exists = jedis.hexists(key, field);
        System.out.println("Field exists? " + exists); // 輸出: true
        
        jedis.close();
    }
}

Redis命令

HEXISTS user:1001 age

場(chǎng)景:避免重復(fù)設(shè)置字段,如冪等性校驗(yàn)。

8. HINCRBY:字段值自增

功能:對(duì)字段值進(jìn)行整數(shù)自增(原子操作)。

Java示例

import redis.clients.jedis.Jedis;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "counter:visits";
        String field = "total";
        
        // 自增訪問(wèn)次數(shù)
        long newValue = jedis.hincrBy(key, field, 1);
        System.out.println("New value: " + newValue);
        
        jedis.close();
    }
}

Redis命令

HINCRBY counter:visits total 1

場(chǎng)景:統(tǒng)計(jì)網(wǎng)站訪問(wèn)量、庫(kù)存扣減等并發(fā)場(chǎng)景。

9. HINCRBYFLOAT:浮點(diǎn)數(shù)自增

功能:對(duì)字段值進(jìn)行浮點(diǎn)數(shù)自增。

Java示例

import redis.clients.jedis.Jedis;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        String field = "balance";
        
        // 自增余額
        double newBalance = jedis.hincrByFloat(key, field, 100.5);
        System.out.println("New balance: " + newBalance);
        
        jedis.close();
    }
}

Redis命令

HINCRBYFLOAT user:1001 balance 100.5

場(chǎng)景:電商訂單金額計(jì)算、金融交易。

10. HKEYS:獲取所有字段名

功能:返回Hash中所有字段名。

Java示例

import redis.clients.jedis.Jedis;
import java.util.Set;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        
        // 獲取所有字段名
        Set<String> fields = jedis.hkeys(key);
        fields.forEach(System.out::println);
        
        jedis.close();
    }
}

Redis命令

HKEYS user:1001

警告

  • 大字段時(shí)可能導(dǎo)致 內(nèi)存爆增。
  • 替代方案:使用 HSCAN 遍歷。

11. HVALS:獲取所有字段值

功能:返回Hash中所有字段的值。

Java示例

import redis.clients.jedis.Jedis;
import java.util.List;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        
        // 獲取所有字段值
        List<String> values = jedis.hvals(key);
        values.forEach(System.out::println);
        
        jedis.close();
    }
}

Redis命令

HVALS user:1001

場(chǎng)景:批量導(dǎo)出數(shù)據(jù),但需注意性能問(wèn)題。

12. HSCAN:漸進(jìn)式遍歷Hash

功能:分頁(yè)遍歷Hash,避免阻塞。

Java示例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanResult;

public class HashDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        
        String key = "user:1001";
        String cursor = "0";
        
        // 漸進(jìn)式遍歷
        do {
            ScanResult<Map.Entry<String, String>> result = jedis.hscan(key, cursor);
            for (Map.Entry<String, String> entry : result.getResult()) {
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }
            cursor = result.getCursor();
        } while (!cursor.equals("0"));
        
        jedis.close();
    }
}

Redis命令

HSCAN user:1001 0

場(chǎng)景:處理超大規(guī)模Hash,如日志分析。

三、性能優(yōu)化與最佳實(shí)踐

1. 小Hash優(yōu)化

  • ziplist編碼:字段數(shù) < 512 且字段長(zhǎng)度 < 64 字節(jié)時(shí),Redis自動(dòng)壓縮存儲(chǔ)。
  • 適用場(chǎng)景:用戶(hù)信息、商品屬性等小對(duì)象。

2. 大Hash處理

  • 避免HGETALL/HKEYS/HVALS:可能導(dǎo)致阻塞。
  • 推薦方案:使用 HSCAN 分頁(yè)遍歷。

3. 原子操作

  • HINCRBY/HINCRBYFLOAT:保證并發(fā)下的數(shù)據(jù)一致性。

4. 鍵設(shè)計(jì)規(guī)范

  • 命名約定業(yè)務(wù)類(lèi)型:ID:字段,如 user:1001:profile。
  • 避免冗余:字段名盡量簡(jiǎn)潔,如 age 而非 user_age。

四、 案例:電商系統(tǒng)的用戶(hù)信息管理

需求

  • 存儲(chǔ)用戶(hù)信息(姓名、年齡、郵箱、積分)。
  • 支持積分增減、字段查詢(xún)、刪除敏感信息。

代碼實(shí)現(xiàn)

import redis.clients.jedis.Jedis;
import java.util.Map;

public class UserManagement {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        String key = "user:1001";
        
        // 1. 設(shè)置用戶(hù)信息
        Map<String, String> userInfo = Map.of(
            "username", "Alice",
            "age", "25",
            "email", "alice@example.com",
            "points", "100"
        );
        jedis.hmset(key, userInfo);
        
        // 2. 查詢(xún)用戶(hù)積分
        String points = jedis.hget(key, "points");
        System.out.println("Current points: " + points); // 輸出: 100
        
        // 3. 積分自增
        jedis.hincrBy(key, "points", 50); // 新積分: 150
        
        // 4. 刪除郵箱字段
        jedis.hdel(key, "email");
        
        // 5. 漸進(jìn)式遍歷用戶(hù)信息
        String cursor = "0";
        do {
            ScanResult<Map.Entry<String, String>> result = jedis.hscan(key, cursor);
            for (Map.Entry<String, String> entry : result.getResult()) {
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }
            cursor = result.getCursor();
        } while (!cursor.equals("0"));
        
        jedis.close();
    }
}

五、 Hash函數(shù)的“黃金法則”

函數(shù)時(shí)間復(fù)雜度適用場(chǎng)景
HSET/HMSETO(1)/O(N)初始化對(duì)象屬性
HGET/HMGETO(1)/O(N)讀取特定字段
HGETALLO(N)小字段全量讀取
HDELO(N)刪除敏感信息
HINCRBYO(1)原子計(jì)數(shù)(庫(kù)存、積分)
HSCANO(1)大字段漸進(jìn)式遍歷

以上就是Redis中Hash函數(shù)的12種用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis Hash函數(shù)用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • redis中RedissonLock如何實(shí)現(xiàn)等待鎖的

    redis中RedissonLock如何實(shí)現(xiàn)等待鎖的

    本文主要介紹了redis中RedissonLock如何實(shí)現(xiàn)等待鎖的,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Redis高并發(fā)場(chǎng)景下秒殺超賣(mài)解決方案(秒殺場(chǎng)景)

    Redis高并發(fā)場(chǎng)景下秒殺超賣(mài)解決方案(秒殺場(chǎng)景)

    早起的12306購(gòu)票,剛被開(kāi)發(fā)出來(lái)使用的時(shí)候,12306會(huì)經(jīng)常出現(xiàn)超賣(mài) 這種現(xiàn)象,也就是說(shuō)車(chē)票只剩10張了,卻被20個(gè)人買(mǎi)到了,這種現(xiàn)象就是超賣(mài),今天通過(guò)本文給大家介紹Redis高并發(fā)場(chǎng)景下秒殺超賣(mài)解決方案,感興趣的朋友一起看看吧
    2022-04-04
  • Redis中鍵的過(guò)期刪除策略深入講解

    Redis中鍵的過(guò)期刪除策略深入講解

    這篇文章主要給大家介紹了關(guān)于Redis中鍵的過(guò)期刪除策略的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • redis實(shí)現(xiàn)分布式session的解決方案

    redis實(shí)現(xiàn)分布式session的解決方案

    session存放在服務(wù)器,關(guān)閉瀏覽器不會(huì)失效,本文主要介紹了redis實(shí)現(xiàn)分布式session的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    這篇文章主要介紹了Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值需要的朋友可以參考下
    2020-04-04
  • Redis安裝及基本數(shù)據(jù)類(lèi)型

    Redis安裝及基本數(shù)據(jù)類(lèi)型

    這篇文章主要介紹了Redis安裝及基本數(shù)據(jù)類(lèi)型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Redis自增生成id的方法實(shí)踐

    Redis自增生成id的方法實(shí)踐

    在使用Redis時(shí),常常需要用到自增ID的功能,主要介紹了Redis自增生成id的方法實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Redis?整數(shù)集合的具體使用(intset)

    Redis?整數(shù)集合的具體使用(intset)

    對(duì)于集合,STL?的?set?相信大家都不陌生,本文主要介紹了整數(shù)集合,又稱(chēng)為?intset,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Redis3.2.11在centos9安裝與卸載過(guò)程詳解

    Redis3.2.11在centos9安裝與卸載過(guò)程詳解

    這篇文章主要介紹了Redis3.2.11在centos9安裝與卸載過(guò)程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Redis RDB與AOF持久化方式詳細(xì)講解

    Redis RDB與AOF持久化方式詳細(xì)講解

    Redis是基于內(nèi)存的數(shù)據(jù)結(jié)構(gòu)服務(wù)器,保存了大量的鍵值對(duì)數(shù)據(jù),所以持久化到磁盤(pán)是非常必要的,Redis提供了兩種持久化的方式,分別是RDB和AOF。下面我們看下這兩種持久化方式的具體實(shí)現(xiàn)原理
    2022-11-11

最新評(píng)論

廉江市| 阳山县| 珲春市| 云和县| 大渡口区| 吴江市| 内江市| 东海县| 紫云| 方正县| 油尖旺区| 佛山市| 开江县| 区。| 淄博市| 龙岩市| 湟中县| 遂川县| 兴文县| 西宁市| 商南县| 容城县| 南和县| 星子县| 翁牛特旗| 滨海县| 中山市| 洪江市| 古浪县| 道孚县| 册亨县| 开阳县| 启东市| 汾阳市| 天台县| 连平县| 苍山县| 个旧市| 时尚| 游戏| 合川市|