Redis常用命令——String篇

? 前面我們講解了一些 Redis 的全局命令(Redis常用基本全局命令)。所謂全局命令,就是可以匹配任意一個數據結構進行使用。但是不同的數據結構,也有自己的操作命令。本篇文章主要講解的是 String 的操作命令,希望會對你有所幫助。

文章目錄

一、簡單介紹

二、常用命令

2、1 常見命令

set

get

MGET 和 MSET

SETNX、SETEX

2、2 計數命令

INCR 和 INCRBY

DECR 和 DECRBY

INCRBYFLOAT

2、3 其他命令

APPEND

?GETRANGE

SETRANGE

STRLEN

三、小結


🙋?♂??作者:@Ggggggtm?🙋?♂?

👀?專欄:Redis 👀

💥?標題: Redis命令——String篇 💥

????寄語:與其忙著訴苦,不如低頭趕路,奮路前行,終將遇到一番好風景???

一、簡單介紹

? 我們再次強調:redis 所有的key都是字符串(String)類型,value的類型是存在差異的!而我們本篇文章講解的 String 的命令操作,也是針對 value 的。

??Redis 中的字符串,直接就是按照字節數組(二進制數據)的方式存儲的!不會做任何的編碼轉換,存的是啥,取出來就還是啥!不僅僅可以存儲文本數據,還支持存儲整數、文本、JSON、二進制數據等。

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

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

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

? 下面我們就來看一下String的操作命令。

二、常用命令

2、1 常見命令

set

? 前面文章中我們講解過set命令的使用。在此我們再次詳細解釋一下 set 命令的使用。首先,get、set都是針對 String 的命令,也是最為重要和基礎的兩個命令!set 語法格式:

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

? 下面是對 set 命令參數的詳細解釋:

  • key:指定要設置值的鍵。
  • value: 要存儲的值。
  • [expiration EX seconds | PX milliseconds]: 可選參數,用于設置鍵的過期時間。可以使用EX參數和以秒為單位的時間來設置過期時間,或者使用PX參數和以毫秒為單位的時間來設置過期時間。過期后會自動刪除!具體實例如下:
  • [NX|XX]: 可選參數,用于指定設置操作的行為。NX——只在key不存在時才進行設置,即如果key之前已經存在,設置不執行。XX——只在key存在時才進行設置,即如果key之前不存在,設置不執行。具體實例如下:

? 注意,redis文檔給出的語法格式說明:

  • [?] 相當于一個獨立的單元,表示可選項(可有可無的);
  • 其中 | 表示 "或者" 的意思,多個只能出現一個;
  • [ ] 和 [ ] 之間,是可以同時存在的。

get

? get命令沒什么好解釋的,也是只支持字符串(String)類型的value。如果不匹配,則直接會報錯提示。具體如下:

? 語法也很簡單:

get key

? 直接使用即可,這里不再做過多解釋!需要學習的可以參看此篇文章:Redis常用基本全局命令。

MGET 和 MSET

??在Redis中,MGET和MSET是用于批量獲取和設置多個鍵值對的命令。之前我們也說明了Redis是一個基于網絡的客戶端/服務器的中間件。為了減少網絡IO的次數,那么就出現了MGET 和 MSET 指令。類似的Redis都有很多命令都是可以支持一次操作多個鍵值對的。其目的就是為了提高效率。

? 我們先來看一下MGET 命令語法:

MGET key [key ...]

? 理解并不難,我們直接看實例:

? ?我們再來看一下MSET 的語法:

 MSET key value [key value ...]

? 我們直接看實例:

? 兩者的時間復雜度均為O(n),這里的 n 并不是指的redis中所有的key,而是我們所設置的key的個數。即使mset 和 mget 指令可以一次操作多個鍵值對,但是并不會一次設置或者獲取 太對的鍵值對。因為我一次設置假設10w個鍵值對,有可能把redis 給阻塞住了!導致其他的命令不能夠被執行,引起連鎖反應!

SETNX、SETEX

? SETNX、SETEX其實就是把set 中的nx 和 ex選項結合成為一個命令了。這里再簡單解釋一下。

? SETNX 命令用于在 Redis 中設置一個 key 的值,如果這個 key 不存在的話。如果設置成功,返回 1;如果 key 已經存在,則不做任何操作,返回 0。具體實例如下:

? SETEX 命令用于在 Redis 中設置一個 key 的值,并指定該 key 在指定的秒數后過期。如果設置成功,返回 OK。這里要說明一下其語法:

SETEX key seconds value

? 我們直接看一個實例:

2、2 計數命令

INCR 和 INCRBY

? 在 Redis 中,INCR 和 INCRBY 命令都用于對存儲在指定 key 中的值進行增量操作。

  1. INCR 命令用于將存儲在指定 key 的值遞增 1。如果 key 不存在,則先將其設置為 0,然后再執行遞增操作。語法:INCR key。
  2. INCRBY 命令用于將存儲在指定 key 的值遞增指定的增量值。如果 key 不存在,則先將其設置為 0,然后再執行遞增操作。語法:INCRBY key increment。

? 注意:如果INCR 和 INCRBY key對應的string 不是一個整型或者范圍超過了64位有符號整型,則報錯。我們來看一下實例:

DECR 和 DECRBY

??在 Redis 中,DECR 和 DECRBY 命令與 INCR 和 INCRBY 命令相反,用于對存儲在指定 key 中的值進行減量操作。

  1. DECR 命令用于將存儲在指定 key 的值遞減 1。如果 key 不存在,則先將其設置為 0,然后再執行遞減操作。語法:DECR key。
  2. DECRBY 命令用于將存儲在指定 key 的值遞減指定的減量值。如果 key 不存在,則先將其設置為 0,然后再執行遞減操作。語法:DECRBY key decrement。

??注意:如果DECR 和 DECRBY key對應的string 不是一個整型或者范圍超過了64位有符號整型,則報錯

INCRBYFLOAT

??INCRBYFLOAT是 Redis 中用于對存儲在指定鍵中的浮點數值進行增加或減少操作的命令。下面是關于 INCRBYFLOAT 命令語法:

INCRBYFLOAT key increment

功能描述:

  • INCRBYFLOAT?命令用于在指定鍵存儲的值為浮點數時,將這個值增加(或減少)指定的浮點數增量。
  • 如果鍵不存在,那么在執行命令前,會先將鍵的值設置為 0,再執行增加操作。
  • 如果鍵包含的值不是浮點數,命令將返回錯誤。
  • 增量參數可以是正數也可以是負數,用來增加或減少存儲在鍵中的浮點數值。

? 注意:并沒有DECRBYFLOAT,我們可以通過INCRBYFLOAT key 負數 來實現對 key 的減法操作。這里就不再舉例了,大家可以自己操作一下。

2、3 其他命令

APPEND

? append 顧名思義就是追加嘛!如果key已經存在并且是一個string,命令會將value追加到原有string的后邊。如果key不存在,會先將鍵的值設置為空字符串再進行追加操作,則效果等同于SET命令。最終返回值為追加后字符串的長度。其語法如下:

 APPEND KEY VALUE

? 具體實例如下:

? 可不可以追加漢字呢?是可以的。具體如下:

??append返回值,長度的單位是字節。但是為什么會是6個字節呢?redis的字符串不會對字符編碼做任何處理(redis 不認識字符,只認識字節)。當前咱們的xshell終端,默認的字符編碼是utf8,在終端中輸入漢字之后,也就是按照utf8編碼的。一個漢字在utf8字符集中通常是3個字節的。

? 我們通過get 獲取value時,發現并不是我們所想的到的漢字,而是一堆二進制。因為存儲進去時,并沒有指定編碼格式,那么存儲的就是二進制,并且是以utf8所對應的編碼方式的二進制存儲進去的。所以我們得到的就是一堆二進制。

??在啟動redis客戶端的時候,加上一個--raw這樣的選項。就可以使redis客戶端能夠自動的把二進制數據嘗試翻譯。具體如下:

?GETRANGE

? GETRANGE 命令用于獲取指定鍵對應值的子字符串(根據指定的起始位置和結束位置)。語法:

GETRANGE key start end

? 返回key對應的string的子串,由start和 end確定(左閉右閉),并且起始位置為0。可以使用負數表示倒數。-1代表倒數第一個字符(len - 1),-2代表倒數第二個(len - 2),其他的與此類似。超過范圍的偏移量會根據string的長度調整成正確的值。具體實例如下:

??

? 如果字符串中保存的是漢字,此時進行子串切分,很可能切出來的就不是完整的漢字了!如下:

??上述的代碼,是強行切出了中間的四個字節。隨便這么一切,切出的結果在utf8碼表上不知道能查出啥了。

SETRANGE

? SETRANGE 命令用于替換指定鍵對應值的字符串中的部分內容。語法:

SETRANGE key offset value

? offset 為偏移量,表示從哪個位置開始替換字符串內容(以 0 表示)。value就是覆蓋指定位置的值。注意:setrange 是用來覆蓋替換的,并不是插入!具體實例如下:

??setrange針對不存在的key也是可以操作的.不過會把 offset之前的內容填充成0x00.具體如下:

STRLEN

??STRLEN 命令用于獲取存儲在指定鍵中的字符串值的長度。當key存儲的value不是string時,直接報錯。或者當 key 不存在時,返回 0。語法:

STRLEN key

? 具體實例如下:

三、小結

? 上述命令總結出如下表格,根據不同場景可以做出不同選擇。具體如下:

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

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

相關文章

ClickHouse課件

列式存儲數據庫:hbase clickhouse 簡介 ClickHouse入門 ClickHouse是俄羅斯的Yandex于2016年開源的列式存儲數據庫(DBMS),使用C語言編寫,主要用于在線分析處理查詢(OLAP),能夠使用…

2024年電工杯B題論文首發+問題一論文代碼分享

問題一論文代碼鏈接:https://pan.baidu.com/s/1kDV0DgSK3E4dv8Y6x7LExA 提取碼:sxjm --來自百度網盤超級會員V5的分享 基于數據分析的大學生平衡膳食食譜的優化設計及評價 摘要 大學時期不僅是學術學習和身體成長的關鍵階段,更是青年學生…

supermind讀寫自選股的功能來了

python custom_sector() # 返回所有板塊的dataframecustom_sector(板塊1) # 返回 板塊1 的屬性和股票custom_sector(板塊1, append, [000001.SZ]) # 增加板塊1的股票列表custom_sector(板塊1, pop, [000001.SZ]) # 移除板塊1的股票custom_sector(板塊1, remove) # 刪除板塊1zxg…

Hsql每日一題 | day03

前言 就一直向前走吧,沿途的花終將綻放~ 題目:打折日期交叉問題 如下為平臺商品促銷數據:字段為品牌,打折開始日期,打折結束日期 brand stt edt oppo,2021-06-05,2021-06-09 oppo,2021-06-11,2021-06-21 vivo,…

Java中流的概念細分

按流的方向分類: 輸入流:數據流向是數據源到程序(以InputStream、Reader結尾的流)。 輸出流:數據流向是程序到目的地(以OutputStream、Writer結尾的流)。 按處理的數據單元分類: 字…

PVE 虛擬機環境下刪除 local-lvm分區

1、刪除邏輯卷 lvremote pve/data 2、擴展邏輯卷 lvextend -l 100%FREE -r pve/root 3、 修改存儲目錄內容 點擊 Datacenter - Storage (1)刪除local-lvm分區 (2)編輯local分區,在內容一項中勾選所有可選項。

mysql 兩個不同字段的表導入數據

下面這個場景就是A表的字段和B表的字段不一樣,但是現在我想把b表中的數據導入到A表里面,下面是導入公式如下: 語法: 將SYS_ORG表中的數據導入到sys_depart,但是這兩個表的字段不一樣,在()里面填寫要新增數據…

Spring Boot 3.3 正式發布,王炸級更新,應用啟動速度直接起飛!

最新消息,Spring Boot 一次性發布了 3 個版本: 3.3.0 3.2.6 3.1.13 Spring Boot 3.3 正式發布了,3.1.x 在前幾天也停止維護了。 最新的支持版本如下: 從路線圖可以看到每個版本的終止時間,每個版本的生命周期只有…

安徽大學數學科學學院教授陳昌昊

男,本(2005-2009)、碩(2009-2012)學位都在湖北大學獲得,博士學位在芬蘭獲得(2012-2016),博士后分別在澳大利亞(2016-2019)、香港(2020…

vue3中el-form表單校驗,再點擊提交按鈕的時候通過校驗才進行提交

vue3中el-form表單校驗&#xff0c;再點擊提交按鈕的時候通過校驗才進行提交 一、前言1、案例 一、前言 在 Vue 3 中&#xff0c;可以使用 Element UI 的 <el-form> 組件配合 <el-form-item> 來實現表單的必填項校驗&#xff0c;并在提交時根據校驗結果來決定是否…

clickhouse 中的數組(array)和元組(Tuple)—— clickhouse 基礎篇(二)

文章目錄 數組判斷是否為空計算數組長度獲取數組元素判斷某個元素是否存在數組切片數組元素展開數組元素去重刪除連續重復元素連接多個數組數組倒序數組拍平數組元素映射數組元素過濾數組聚合分析計算數組交集計算數組并集計算數組差集SQL 子查詢進行集合操作 元組創建元組獲取…

LeetCode刷題之HOT100之二叉樹的直徑

2024/5/25 陰天。這幾天睡眠質量都非常好&#xff0c;一切似乎都在慢慢上升。先把題做了 1、題目描述 2、邏輯分析 題目要求就是給一個二叉樹&#xff0c;求出兩個節點之間的最大長度即為二叉樹的直徑。怎么做呢&#xff1f;我想不出來。看一下題解吧。題解給出的解法是深度優…

Swagger2 和 Swagger3 的不同

Swagger2 和 Swagger3 的不同 SpringBoot 整合 Swagger3 和 Swagger2 的主要區別如下&#xff1a; 區別一&#xff1a;引入不同的依賴 如果使用的是 Swagger 3 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter<…

Linux——Docker容器虛擬化平臺

安裝docker 安裝 Docker | Docker 從入門到實踐https://vuepress.mirror.docker-practice.com/install/ 不需要設置防火墻 docker命令說明 docker images #查看所有本地主機的鏡像 docker search 鏡像名 #搜索鏡像 docker pull 鏡像名 [標簽] #下載鏡像&…

學習java第八十天

ApplicationContext有哪些常見實現&#xff1f; FileSystemXmlApplicationContext容器從XML文件加載bean的定義。XML bean配置文件的完整路徑必須提供給構造函數。 ClassPathXmlApplicationContext容器也從XML文件加載bean的定義。這里&#xff0c;你需要正確設置classpath因…

mybatis-plus 優雅的寫service接口中方法(3)

多表聯查 上文講過了自定義sql &#xff0c;和wrapper的使用&#xff0c;但是我們可以發現 我們查詢的都是數據庫中的一張表&#xff0c;那么怎么進行多表聯查呢&#xff0c;當然也是用自定義sql來進行實現 比如說 查詢 id 為 1 2 4 的用戶 并且 地址在北京 的 用戶名稱 普…

Elasticsearch不刪原有jdk8導致的系列安裝和啟動問題

以前在空機器直接裝elasticsearch&#xff0c;沒有遇到什么問題。今天在現有JDK上安裝&#xff0c;遇到的問題記錄一下&#xff1a; 1. JDK的環境變量配置與我原有的不一致報如下錯誤&#xff1a; [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

python-數據分析與可視化基礎

1、data1.csv中的B、C、D和E列數據分別是日期、權重、A企業的銷售額、B企業的銷售額。讀取C、D、E列數據,并統計E列數據的算術平均數、加權平均值(權值為C列數據)、方差、中位數、最小值、最大值。并繪制E列數據的直方圖。 &#xff08;1&#xff09;源代碼&#xff1a; impo…

JavaScript異步編程:理解和使用Promise、Async/Await

JavaScript是一種單線程語言&#xff0c;這意味著它一次只能執行一個任務。然而&#xff0c;在Web開發中&#xff0c;我們經常需要處理異步操作&#xff0c;例如網絡請求、定時器、事件監聽等。JavaScript提供了多種方式來處理異步編程&#xff0c;包括回調函數、Promise、Asyn…

什么生信流程語言讓你極度爽?

生信流程搭建有多難&#xff1f;行業為解決這一問題提出了各種各樣的配方&#xff0c;有你熟悉的嗎&#xff1f; 一、困境 - 亂 無數機構投入大量人力物力&#xff0c;以期獲得一條條可用的生信流程。而有些流程&#xff0c;由于種種原因&#xff0c;存在著巨大的缺陷&#xf…