【Redis】string

String 字符串

字符串類型是 Redis 最基礎的數據類型,關于字符串需要特別注意:

  • 首先 Redis 中所有的鍵的類型都是字符串類型,而且其他幾種數據結構也都是在字符串的基礎上構建的。
  • 字符串類型的值實際可以是字符串,包含一般格式的字符串或者類似 JSON、XML 格式的字符串;數字,可以是整型或者浮點型;甚至是二進制流數據,例如圖片、音頻、視頻等。不過一個字符串的最大值不能超過 512 MB。

由于 Redis 內部存儲字符串完全是按照二進制流的形式保存的,所以 Redis 是不處理字符集編碼問題的,客戶端傳入的命令中使用的是什么字符集編碼,就存儲什么字符集編碼。

在這里插入圖片描述

常見命令

SET

將 string 類型的 value 設置到 key 中。如果 key 之前存在,則覆蓋,無論原來的數據類型是什么。之前關于此 key 的 TTL 也全部失效。
語法:

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]

命令有效版本:1.0.0 之后
時間復雜度:O(1)
選項:

  • EX seconds —— 使用秒作為單位設置 key 的過期時間。
  • PX milliseconds —— 使用毫秒作為單位設置 key 的過期時間。
  • NX —— 只在 key 不存在時才進行設置,即如果 key 之前已經存在,設置不執行。
  • XX —— 只在 key 存在時才進行設置,即如果 key 之前不存在,設置不執行。
    注意:由于帶選項的 SET 命令可以被 SETNX、SETEX、PSETEX 等命令代替,所以之后的版本中,Redis 可能進行合并。
    返回值:
  • 如果設置成功,返回 OK。
  • 如果由于 SET 指定了 NX 或者 XX 但條件不滿足,SET 不會執行,并返回 (nil)。
    示例:
redis> EXISTS mykey
(integer) 0
redis> SET mykey "Hello"
OK
redis> GET mykey
"Hello"
redis> SET mykey "World" NX
(nil)
redis> DEL mykey
(integer) 1
redis> EXISTS mykey
(integer) 0
redis> SET mykey "World" XX
(nil)
redis> GET mykey
(nil)
redis> SET mykey "World" NX
OK
redis> GET mykey
"World"
redis> SET mykey "Will expire in 10s" EX 10
OK
redis> GET mykey
"Will expire in 10s"
# 10秒之后
redis> GET mykey
(nil)

GET

獲取 key 對應的 value。如果 key 不存在,返回 nil。如果 value 的數據類型不是 string,會報錯。
語法:

GET key

命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:key 對應的 value,或者 nil 當 key 不存在。
示例:

redis> GET nonexisting
(nil)
redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"
redis> DEL mykey
(integer) 1
redis> EXISTS mykey
(integer) 0
redis> HSET mykey name Bob
(integer) 1
redis> GET mykey
(error) WRONGTYPE Operation against a key holding the wrong kind of value

MGET

一次性獲取多個 key 的值。如果對應的 key 不存在或者對應的數據類型不是 string,返回 nil。
語法:

MGET key [key ...]

命令有效版本:1.0.0 之后
時間復雜度:O(N) N 是 key 數量
返回值:對應 value 的列表
示例:

redis> SET key1 "Hello"
OK
redis> SET key2 "World"
OK
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

MSET

一次性設置多個 key 的值。
語法:

MSET key value [key value ...]

命令有效版本:1.0.1 之后
時間復雜度:O(N) N 是 key 數量
返回值:永遠是 OK
示例:

redis> MSET key1 "Hello" key2 "World"
OK
redis> GET key1
"Hello"
redis> GET key2
"World"

在這里插入圖片描述

如上圖所示,使用 mget 由于可以有效地減少網絡時間,所以性能相對更高。假設網絡耗時 1 毫秒,命令執行 1 毫秒,那么執行時間如下表所示。

100 次 get 和 1 次 mget 100 個鍵對比

操作時間
100 次 get100 x 1 + 100 x 0.1 = 110 毫秒
1 次 mget 100 個鍵1 x 1 + 100 x 0.1 = 101 毫秒

學會使用批量操作,可以有效提高業務處理效率,但是要注意,每次批量操作所發送的鍵的數量也不是無節制的,否則可能造成單一命令執行時間過長,導致 Redis 阻塞。

SETNX

設置 key-value 但只允許在 key 之前不存在的情況下。
語法:

SETNX key value

命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:1 表示設置成功。0 表示沒有設置。
示例:

redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"
  • set key value :判斷 key 是否存在,存在或不存在均設置成功。
  • set key value xx :判斷 key 是否存在,存在則設置成功,不存在則設置失敗。
  • set key value nx 或者 setnx key value :判斷 key 是否存在,存在則設置失敗,不存在則設置成功。

計數命令

INCR

將 key 對應的 string 表示的數字加一。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是一個整型或者范圍超過了 64 位有符號整型,則報錯。
語法:

INCR key

命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:integer 類型的加完后的數值。
示例:

redis> EXISTS mykey
(integer) 0
redis> INCR mykey
(integer) 1
redis> SET mykey "10"
OK
redis> INCR mykey
(integer) 11
redis> SET mykey "2342934823904890489209348230948"
OK
redis> INCR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> INCR mykey
(error) value is not an integer or out of range

INCRBY

將 key 對應的 string 表示的數字加上對應的值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是一個整型或者范圍超過了 64 位有符號整型,則報錯。
語法:

INCRBY key decrement

命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:integer 類型的加完后的數值。
示例:

redis> EXISTS mykey
(integer) 0
redis> INCRBY mykey 3
(integer) 3
redis> SET mykey "10"
OK
redis> INCRBY mykey 3
(integer) 13
redis> INCRBY mykey "not a number"
(error) value is not an integer or out of range
redis> SET mykey "2342934823904890489209348230948"
OK
redis> INCRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> INCRBY mykey 3
(error) value is not an integer or out of range

DECR

將 key 對應的 string 表示的數字減一。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是一個整型或者范圍超過了 64 位有符號整型,則報錯。
語法:

DECR key

命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:integer 類型的減完后的數值。
示例:

redis> EXISTS mykey
(integer) 0
redis> DECR mykey
(integer) -1
redis> SET mykey "10"
OK
redis> DECR mykey
(integer) 9
redis> SET mykey "2342934823904890489209348230948"
OK
redis> DECR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> DECR mykey
(error) value is not an integer or out of range

DECRBY

將 key 對應的 string 表示的數字減去對應的值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是一個整型或者范圍超過了 64 位有符號整型,則報錯。
語法:

DECRBY key decrement

命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:integer 類型的減完后的數值。
示例:

redis> EXISTS mykey
(integer) 0
redis> DECRBY mykey 3
(integer) -3
redis> SET mykey "10"
OK
redis> DECRBY mykey 3
(integer) 7
redis> DECRBY mykey "not a number"
(error) value is not an integer or out of range
redis> SET mykey "2342934823904890489209348230948"
OK
redis> DECRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> DECRBY mykey 3
(error) value is not an integer or out of range

INCRBYFLOAT

將 key 對應的 string 表示的浮點數加上對應的值。如果對應的值是負數,則視為減去對應的值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的不是 string,或者不是一個浮點數,則報錯。允許采用科學計數法表示浮點數。
語法:
INCRBYFLOAT key increment
命令有效版本:2.6.0 之后
時間復雜度:O(1)
返回值:加/減完后的數值。
示例:

redis> SET mykey 10.50
OK
redis> INCRBYFLOAT mykey 0.1
"10.6"
redis> INCRBYFLOAT mykey -5
"5.6"
redis> SET mykey 5.0e3
OK
redis> INCRBYFLOAT mykey 2.0e2
"5200"

很多存儲系統和編程語言內部使用 CAS 機制實現計數功能,會有一定的 CPU 開銷,但在 Redis 中完全不存在這個問題,因為 Redis 是單線程架構,任何命令到了 Redis 服務端都要順序執行。

其他命令

APPEND

如果 key 已經存在并且是一個 string,命令會將 value 追加到原有 string 的后邊。如果 key 不存在,則效果等同于 SET 命令。

  • 語法:APPEND KEY VALUE
  • 命令有效版本:2.0.0 之后
  • 時間復雜度:O(1),追加的字符串一般長度較短,可視為 O(1)
  • 返回值:追加完成之后 string 的長度
  • 示例
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> GET mykey
"Hello"
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"

GETRANGE

返回 key 對應的 string 的子串,由 start 和 end 確定(左閉右閉)。可以使用負數表示倒數,-1 代表倒數第一個字符,-2 代表倒數第二個,其他的與此類似。超過范圍的偏移量會根據 string 的長度調整成正確的值。

  • 語法:GETRANGE key start end
  • 命令有效版本:2.4.0 之后
  • 時間復雜度:O(N),N 為 [start, end] 區間的長度,由于 string 通常較短,可視為 O(1)
  • 返回值:string 類型的子串
  • 示例
redis> SET mykey "This is a string"
OK
redis> GETRANGE mykey 0 3
"This"
redis> GETRANGE mykey -3 -1
"ing"
redis> GETRANGE mykey 0 -1
"This is a string"
redis> GETRANGE mykey 10 100
"string"

SETRANGE

覆蓋字符串的一部分,從指定的偏移開始。

  • 語法:SETRANGE key offset value
  • 命令有效版本:2.2.0 之后
  • 時間復雜度:O(N),N 為 value 的長度,由于一般給的 value 較短,通常視為 O(1)
  • 返回值:替換后的 string 的長度
  • 示例
redis> SET key1 "Hello World"
OK
redis> SETRANGE key1 6 "Redis"
(integer) 11
redis> GET key1
"Hello Redis"

STRLEN

獲取 key 對應的 string 的長度。當 key 存放的類似不是 string 時,報錯。

  • 語法:STRLEN key
  • 命令有效版本:2.2.0 之后
  • 時間復雜度:O(1)
  • 返回值:string 的長度。或者當 key 不存在時,返回 0
  • 示例
redis> SET mykey "Hello world"
OK
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0

命令小結

命令執行效果時間復雜度
set key value [key value…]設置 key 的值是 valueO(k),k 是鍵個數
get key獲取 key 的值O(1)
del key [key …]刪除指定的 keyO(k),k 是鍵個數
mset key value [key value …]批量設置指定的 key 和 valueO(k),k 是鍵個數
mget key [key …]批量獲取 key 的值O(k),k 是鍵個數
incr key指定的 key 的值 +1O(1)
decr key指定的 key 的值 -1O(1)
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +n(浮點數運算)O(1)
append key value指定的 key 的值追加 valueO(1)
strlen key獲取指定 key 的值的長度O(1)
setrange key offset value覆蓋指定 key 的從 offset 開始的部分值O(n),n 是字符串長度,通常視為 O(1)
getrange key start end獲取指定 key 的從 start 到 end 的部分值O(n),n 是字符串長度,通常視為 O(1)

內部編碼

字符串類型的內部編碼有 3 種:

  • emb:8 個字節的長整型。
  • embstr:小于等于 39 個字節的字符串。
  • raw:大于 39 個字節的字符串。
    Redis 會根據當前值的類型和長度動態決定使用哪種內部編碼實現。
  • 整型示例
127.0.0.1:6379> set key 6379
OK
127.0.0.1:6379> object encoding key
"int"
  • 短字符串示例
# 小于等于 39 個字節的字符串
127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> object encoding key
"embstr"
  • 長字符串示例
# 大于 39 個字節的字符串
127.0.0.1:6379> set key "one string greater than 39 bytes ......."
OK
127.0.0.1:6379> object encoding key
"raw"

典型使用場景

  • 緩存(Cache)功能
  • 計數(Counter)功能
  • 共享會話(Session)
  • ?機驗證碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82972.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于ELK的分布式日志實時分析與可視化系統設計

目錄 一、ELK平臺介紹 1.ELK概述 2.Elasticsearch 3.Logstash 4.Kibana 二、部署ES群集 1.資源清單 2.基本配置 3.安裝Elasticsearch(elk1上、elk2上、elk3上) 4.安裝logstash(elk1上) 5.Filebeat 6.安裝Kibana&#x…

電機控制選 STM32 還是 DSP?技術選型背后的現實博弈

現在搞電機控制,圈里人都門兒清 —— 主流方案早就被 STM32 這些 Cortex-M 單片機給拿捏了。可要是撞上系統里的老甲方,技術認知還停留在諾基亞砸核桃的年代,非揪著 DSP 不放,咱也只能賠笑臉:“您老說的對,…

【案例分享】藍牙紅外線影音遙控鍵盤:瑞昱RTL8752CJF

藍牙紅外線影音遙控鍵盤 Remotec的無線控制鍵盤采用瑞昱藍牙RTL8752CJF解決方案,透過藍牙5.0與手機配對后,連線至 Remotec 紅外 code server 取得對應影音視覺設備的紅外 code后,即可控制多達2個以上的影音視覺設備,像是智能電視…

PostgreSQL如何更新和刪除表數據

這節說下怎樣更新和刪除表數據,當然認識命令了,可以問AI幫忙寫。 接上節先看下天氣表weather的數據,增加了杭州和西安的數據: 一.UPDATE更新命令 用UPDATE命令更新現有的行。 假設所有 杭州 5月12日的溫度低了兩度,用…

簡單三步FastAdmin 開源框架的安裝

簡單三步FastAdmin 開源框架的安裝 第一步:新建站點1,在寶塔面板中,創建一個新的站點,并填寫項目域名。 第二步:上傳框架1,框架下載2,上傳解壓縮 第三步:配置并安裝1,進入…

使用 pytesseract 構建一個簡單 OCR demo

簡介 pytesseract 庫是 Google Tesseract OCR (光學字符識別)引擎的一個 Python 封裝庫,使用廣泛且功能強大。 構建 使用 pytesseract 構建一個簡單 OCR demo。 步驟一:安裝必要的庫 您需要在您的 Python 環境中安裝 pytessera…

十三: 神經網絡的學習

這里所說的“學習”是指從訓練數據中自動獲取最優權重參數的過程。為了使神經網絡能進行學習,將導入損失函數這一指標。而學習的目的就是以該損失函數為基準,找出能使它的值達到最小的權重參數。為了找出盡可能小的損失函數的值,我們將介紹利…

AWS 創建VPC 并且添加權限控制

AWS 創建VPC 并且添加權限控制 以下是完整的從0到1在AWS中創建VPC并配置權限的步驟(包含網絡配置、安全組權限和實例訪問): 1. 創建VPC 步驟: 登錄AWS控制臺 訪問 AWS VPC控制臺,點擊 創建VPC。 配置基礎信息 名稱…

ICASSP2025丨融合語音停頓信息與語言模型的阿爾茲海默病檢測

阿爾茲海默病(Alzheimers Disease, AD)是一種以認知能力下降和記憶喪失為特征的漸進性神經退行性疾病,及早發現對于其干預和治療至關重要。近期,清華大學語音與音頻技術實驗室(SATLab)提出了一種將停頓信息…

C# 導出word 插入公式問題

最近遇到了一個問題,下載一個文檔時需要下載word可編輯的公式。找了很久終于找到了一種解決辦法。下面是以C#代碼來實現在Word中插入公式的功能。 目錄 一、引入dll程序集文件1、通過 NuGet 引入dll(2種方法)的方法:2、手動添加d…

智匯云舟攜最新無人機2D地圖快速重建技術亮相廣西國際礦業展覽會

5月22至25日,廣西國際礦業展覽會(以下簡稱 “礦業展”)在南寧國際會展中心成功舉辦。智匯云舟與合作伙伴廣西空馭數智信息技術有限公司攜無人機 2D地圖快速重建技術,以及視頻孿生智慧礦山解決方案參會,為礦山行業數字化…

OpenSSL 簽名驗證詳解:PKCS7* p7、cafile 與 RSA 驗簽實現

OpenSSL 簽名驗證詳解:PKCS7* p7、cafile 與 RSA 驗簽實現 摘要 本文深入剖析 OpenSSL 中 PKCS7* p7 數據結構和 cafile 的作用及相互關系,詳細講解基于 OpenSSL 的 RSA 驗簽字符串的 C 語言實現,涵蓋簽名解析、證書加載、驗證流程及關鍵要…

9:OpenCV—模板匹配

模版匹配 1、模板匹配概念 模板匹配是一項在一副圖像中尋找與另一幅模板圖像最匹配(相似)部分的技術。模板匹配不是基于直方圖的,而是通過在輸入圖像上滑動圖像塊(模板)同時對比相似度,來對模板和輸入圖像…

Composer 常規操作說明與問題處理

目錄 一、 Composer 簡介,安裝二、全局配置三、項目配置(composer.json)3.1 composer.json 文件1. 基礎字段信息2. **require(生產環境依賴)**3. **require-dev(開發環境依賴)** 3.2 composer.l…

Spring Boot 3.0與Java 17:企業級應用開發的新范式

引言 隨著Spring Boot 3.0和Java 17的正式發布,企業級應用開發迎來了新的技術范式。這兩項技術的結合不僅帶來了性能提升,還引入了眾多現代化的編程特性,為開發者提供了更強大、更高效的開發體驗。本文將深入探討Spring Boot 3.0與Java 17的…

Vue 組件 - 指令

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue指令 目錄 指令寫法 自定義指令 簡單封裝指令 指令傳遞字符串 update事件 指令應用 指令實現輪播 指令函數簡寫 指令函數列表 bind inserted update componentUpdated unbind Vue3指令輪播 nextick 總結 指…

5.28 后端面經

為什么golang在并發環境下更有優勢 Go語言(Golang)在并發環境下的優勢主要源自其設計哲學和內置的并發機制,這些機制在語言層面提供了高效、簡潔且安全的并發編程工具。以下是其核心優勢的詳細分析: 1. Goroutine:輕量…

Linux線程入門

目錄 Linux線程概念 什么是線程 重新理解進程 線程的優點 線程的缺點 線程的異常 線程用途 Linux線程概念 什么是線程 在一個程序里的一個執行路線就叫做線程(thread)。更準確的定義是:線程是“一個進程內部的控制序列”。一切進程至…

通信應用高速模數轉換器ADC

在5G通信、醫療成像、航空航天及工業自動化等關鍵領域,高速ADC模數轉換器作為信號鏈的“心臟”,其性能直接決定了系統的精度與效率。然而,如何精確測試高速ADC的動態參數、優化設計驗證流程、應對復雜應用場景的挑戰,始終是工程師…

PostgreSQL 中 JSONB 數據類型的深度解析以及如何使用

一、JSONB 核心特性解析 1. 存儲結構與優勢 ??二進制存儲??:將 JSON 數據解析為二進制格式(分解鍵值對,去除空格和重復鍵)??高效查詢??:支持 GIN/GiST 索引,查詢速度比 JSON 類型快 10 倍??數據…