tft每日頭條

 > 科技

 > redis字符串的實現機制

redis字符串的實現機制

科技 更新时间:2024-11-11 13:05:09
概述

redis一般用來做緩存,可能很多朋友都沒有深入去學習redis的相關命令,隻是涉及到安裝部署而已,所以今天主要總結介紹一下redis字符串的一些命令。


SET

語法:SET key value [EX seconds] [PX milliseconds] [NX|XX]

将字符串值 value 關聯到 key 。

如果 key 已經持有其他值, SET 就覆寫舊值, 無視類型。

當 SET 命令對一個帶有生存時間(TTL)的鍵進行設置之後, 該鍵原有的 TTL 将被清除。

ps:因為 SET 命令可以通過參數來實現 SETNX 、 SETEX 以及 PSETEX 命令的效果, 所以 Redis 将來的版本可能會移除并廢棄 SETNX 、 SETEX 和 PSETEX 這三個命令。

返回值

在 Redis 2.6.12 版本以前, SET 命令總是返回 OK 。

從 Redis 2.6.12 版本開始, SET 命令隻在設置操作成功完成時才返回 OK ; 如果命令使用了 NX或者 XX 選項, 但是因為條件沒達到而造成設置操作未執行, 那麼命令将返回空批量回複(NULL Bulk Reply)。

實例:

對不存在的鍵進行設置:

redis字符串的實現機制(全網都在找的redis字符串命令)1

對已存在的鍵進行設置

redis字符串的實現機制(全網都在找的redis字符串命令)2


SETNX key value

隻在鍵 key 不存在的情況下, 将鍵 key 的值設置為 value 。

若鍵 key 已經存在, 則 SETNX 命令不做任何動作。

SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡寫。

返回值

命令在設置成功時返回 1 , 設置失敗時返回 0 。

實例:

redis字符串的實現機制(全網都在找的redis字符串命令)3


SETEX key seconds value

将鍵 key 的值設置為 value , 并将鍵 key 的生存時間設置為 seconds 秒鐘。

如果鍵 key 已經存在, 那麼 SETEX 命令将覆蓋已有的值。

SETEX 命令的效果和以下兩個命令的效果類似:

SET key value EXPIRE key seconds # 設置生存時間

SETEX 和這兩個命令的不同之處在于 SETEX 是一個原子(atomic)操作, 它可以在同一時間内完成設置值和設置過期時間這兩個操作, 因此 SETEX 命令在儲存緩存的時候非常實用。

返回值

命令在設置成功時返回 OK 。 當 seconds 參數不合法時, 命令将返回一個錯誤。

實例

在鍵 key 不存在的情況下執行 SETEX:

redis字符串的實現機制(全網都在找的redis字符串命令)4

鍵 key 已經存在, 使用 SETEX 覆蓋舊值

redis字符串的實現機制(全網都在找的redis字符串命令)5


PSETEX key milliseconds value

這個命令和 SETEX 命令相似, 但它以毫秒為單位設置 key 的生存時間, 而不是像 SETEX 命令那樣以秒為單位進行設置。

返回值:命令在設置成功時返回 OK

實例:

redis字符串的實現機制(全網都在找的redis字符串命令)6


GET key

返回與鍵 key 相關聯的字符串值。

返回值

如果鍵 key 不存在, 那麼返回特殊值 nil ; 否則, 返回鍵 key 的值。

如果鍵 key 的值并非字符串類型, 那麼返回一個錯誤, 因為 GET 命令隻能用于字符串值。

實例

對不存在的鍵 key 或是字符串類型的鍵 key 執行 GET 命令

redis字符串的實現機制(全網都在找的redis字符串命令)7

對不是字符串類型的鍵 key 執行 GET 命令

redis字符串的實現機制(全網都在找的redis字符串命令)8


GETSET key value

将鍵 key 的值設為 value , 并返回鍵 key 在被設置之前的舊值。

返回值

返回給定鍵 key 的舊值。

如果鍵 key 沒有舊值, 也即是說, 鍵 key 在被設置之前并不存在, 那麼命令返回 nil 。

當鍵 key 存在但不是字符串類型時, 命令返回一個錯誤。

實例

redis字符串的實現機制(全網都在找的redis字符串命令)9


STRLEN key

返回鍵 key 儲存的字符串值的長度。

返回值

STRLEN 命令返回字符串值的長度。

當鍵 key 不存在時, 命令返回 0 。

當 key 儲存的不是字符串值時, 返回一個錯誤。

實例

獲取字符串值的長度

redis字符串的實現機制(全網都在找的redis字符串命令)10


APPEND key value

如果鍵 key 已經存在并且它的值是一個字符串, APPEND 命令将把 value 追加到鍵 key 現有值的末尾。

如果 key 不存在, APPEND 就簡單地将鍵 key 的值設為 value , 就像執行 SET key value 一樣。

返回值

追加 value 之後, 鍵 key 的值的長度。

實例

對不存在的 key 執行 APPEND :

redis字符串的實現機制(全網都在找的redis字符串命令)11

對已存在的字符串進行 APPEND

redis字符串的實現機制(全網都在找的redis字符串命令)12


SETRANGE key offset value

從偏移量 offset 開始, 用 value 參數覆蓋(overwrite)鍵 key 儲存的字符串值。

不存在的鍵 key 當作空白字符串處理。

SETRANGE 命令會确保字符串足夠長以便将 value 設置到指定的偏移量上, 如果鍵 key 原來儲存的字符串長度比偏移量小(比如字符串隻有 5 個字符長,但你設置的 offset 是 10 ), 那麼原字符和偏移量之間的空白将用零字節(zerobytes, "\x00" )進行填充。

因為 Redis 字符串的大小被限制在 512 兆(megabytes)以内, 所以用戶能夠使用的最大偏移量為 2^29-1(536870911) , 如果你需要使用比這更大的空間, 可以考慮使用多個 key 。

注意:當生成一個很長的字符串時, Redis 需要分配内存空間, 該操作有時候可能會造成服務器阻塞(block)。 在2010年出産的Macbook Pro上, 設置偏移量為 536870911(512MB 内存分配)将耗費約 300 毫秒, 設置偏移量為 134217728(128MB 内存分配)将耗費約 80 毫秒, 設置偏移量 33554432(32MB 内存分配)将耗費約 30 毫秒, 設置偏移量為 8388608(8MB 内存分配)将耗費約 8 毫秒。

返回值

SETRANGE 命令會返回被修改之後, 字符串值的長度。

實例

對非空字符串執行 SETRANGE 命令

redis字符串的實現機制(全網都在找的redis字符串命令)13


GETRANGE key start end

返回鍵 key 儲存的字符串值的指定部分, 字符串的截取範圍由 start 和 end 兩個偏移量決定 (包括 start 和 end 在内)。

負數偏移量表示從字符串的末尾開始計數, -1 表示最後一個字符, -2 表示倒數第二個字符, 以此類推。

GETRANGE 通過保證子字符串的值域(range)不超過實際字符串的值域來處理超出範圍的值域請求。

返回值

GETRANGE 命令會返回字符串值的指定部分。

實例

redis字符串的實現機制(全網都在找的redis字符串命令)14


INCR key

為鍵 key 儲存的數字值加上一。

如果鍵 key 不存在, 那麼它的值會先被初始化為 0 , 然後再執行 INCR 命令。

如果鍵 key 儲存的值不能被解釋為數字, 那麼 INCR 命令将返回一個錯誤。

本操作的值限制在 64 位(bit)有符号數字表示之内。

返回值

INCR 命令會返回鍵 key 在執行加一操作之後的值。

實例

redis字符串的實現機制(全網都在找的redis字符串命令)15


INCRBY key increment

為鍵 key 儲存的數字值加上增量 increment 。

如果鍵 key 不存在, 那麼鍵 key 的值會先被初始化為 0 , 然後再執行 INCRBY 命令。

如果鍵 key 儲存的值不能被解釋為數字, 那麼 INCRBY 命令将返回一個錯誤。

本操作的值限制在 64 位(bit)有符号數字表示之内。

返回值

在加上增量 increment 之後, 鍵 key 當前的值。

實例

鍵存在,并且值為數字:

redis字符串的實現機制(全網都在找的redis字符串命令)16

鍵不存在

redis字符串的實現機制(全網都在找的redis字符串命令)17


INCRBYFLOAT key increment

為鍵 key 儲存的值加上浮點數增量 increment 。

如果鍵 key 不存在, 那麼 INCRBYFLOAT 會先将鍵 key 的值設為 0 , 然後再執行加法操作。

如果命令執行成功, 那麼鍵 key 的值會被更新為執行加法計算之後的新值, 并且新值會以字符串的形式返回給調用者。

無論是鍵 key 的值還是增量 increment , 都可以使用像 2.0e7 、 3e5 、 90e-2 那樣的指數符号(exponential notation)來表示, 但是, 執行 INCRBYFLOAT 命令之後的值總是以同樣的形式儲存, 也即是, 它們總是由一個數字, 一個(可選的)小數點和一個任意長度的小數部分組成(比如 3.14 、 69.768 ,諸如此類), 小數部分尾随的 0 會被移除, 如果可能的話, 命令還會将浮點數轉換為整數(比如 3.0 會被保存成 3 )。

此外, 無論加法計算所得的浮點數的實際精度有多長, INCRBYFLOAT 命令的計算結果最多隻保留小數點的後十七位。

返回值

在加上增量 increment 之後, 鍵 key 的值。

實例

redis字符串的實現機制(全網都在找的redis字符串命令)18


DECR key

為鍵 key 儲存的數字值減去一。

如果鍵 key 不存在, 那麼鍵 key 的值會先被初始化為 0 , 然後再執行 DECR 操作。

如果鍵 key 儲存的值不能被解釋為數字, 那麼 DECR 命令将返回一個錯誤。

本操作的值限制在 64 位(bit)有符号數字表示之内。

關于遞增(increment) / 遞減(decrement)操作的更多信息, 請參見 INCR 命令的文檔。

返回值

DECR 命令會返回鍵 key 在執行減一操作之後的值。

實例

對儲存數字值的鍵 key 執行 DECR 命令:

redis字符串的實現機制(全網都在找的redis字符串命令)19

對不存在的鍵執行 DECR 命令

redis字符串的實現機制(全網都在找的redis字符串命令)20


DECRBY key decrement

将鍵 key 儲存的整數值減去減量 decrement 。

如果鍵 key 不存在, 那麼鍵 key 的值會先被初始化為 0 , 然後再執行 DECRBY 命令。

如果鍵 key 儲存的值不能被解釋為數字, 那麼 DECRBY 命令将返回一個錯誤。

本操作的值限制在 64 位(bit)有符号數字表示之内。

關于更多遞增(increment) / 遞減(decrement)操作的更多信息, 請參見 INCR 命令的文檔。

返回值

DECRBY 命令會返回鍵在執行減法操作之後的值。

實例

redis字符串的實現機制(全網都在找的redis字符串命令)21


MSET key value [key value …]

同時為多個鍵設置值。

如果某個給定鍵已經存在, 那麼 MSET 将使用新值去覆蓋舊值, 如果這不是你所希望的效果, 請考慮使用 MSETNX 命令, 這個命令隻會在所有給定鍵都不存在的情況下進行設置。

MSET 是一個原子性(atomic)操作, 所有給定鍵都會在同一時間内被設置, 不會出現某些鍵被設置了但是另一些鍵沒有被設置的情況。

返回值

MSET 命令總是返回 OK 。

實例

同時對多個鍵進行設置:

redis字符串的實現機制(全網都在找的redis字符串命令)22

覆蓋已有的值:

redis字符串的實現機制(全網都在找的redis字符串命令)23


MSETNX key value [key value …]

當且僅當所有給定鍵都不存在時, 為所有給定鍵設置值。

即使隻有一個給定鍵已經存在, MSETNX 命令也會拒絕執行對所有鍵的設置操作。

MSETNX 是一個原子性(atomic)操作, 所有給定鍵要麼就全部都被設置, 要麼就全部都不設置, 不可能出現第三種狀态。

返回值

當所有給定鍵都設置成功時, 命令返回 1 ; 如果因為某個給定鍵已經存在而導緻設置未能成功執行, 那麼命令返回 0 。

實例

對不存在的鍵執行 MSETNX 命令

redis字符串的實現機制(全網都在找的redis字符串命令)24

對某個已經存在的鍵進行設置

redis字符串的實現機制(全網都在找的redis字符串命令)25


MGET key [key …]

返回給定的一個或多個字符串鍵的值。

如果給定的字符串鍵裡面, 有某個鍵不存在, 那麼這個鍵的值将以特殊值 nil 表示。

返回值

MGET 命令将返回一個列表, 列表中包含了所有給定鍵的值。

實例

redis字符串的實現機制(全網都在找的redis字符串命令)26


後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注下!

redis字符串的實現機制(全網都在找的redis字符串命令)27

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved