Redis命令使用

Redis是以鍵值對進行數據存儲的,添加數據和查找數據最常用的2個指令就是setget

  • set:set指令用來添加數據。把key和value存儲進去。
  • get:get指令用來查找相應的鍵所對應的值。根據key來取value。
    首先,我們先進入到redis客戶端。然后使用setget
    請添加圖片描述

對于這里的key和value,不需要加上引號,就可以表示字符串的類型。如果要是給key和value加上引號也是可以的(單引號或雙引號都可以)。redis中的命令不區分大小寫。
如果get到一個不存在的key,那么就會顯示(nil),這個意思與NULL一樣,表示找不到,為空。
請添加圖片描述

Redis全局命令

Redis支持很多種數據結構,整體來說,Redis是鍵值對結構,key只能是字符串,value實際上有很多種類型,比如說,字符串、哈希表、列表、集合、有序集合等等,操作不同的數據結構就會有不同的命令。
所以,全局命令,就是能夠搭配任意一個數據結構來使用的命令。

keys

  • keys:返回所有滿足樣式(pattern)的 key。?持如下統配樣式。
    語法:KEYS pattern
  1. h?llo匹配hellohallohxllo。匹配任意一個字符
  2. h*llo 匹配 hllo 和 heeeello。匹配0個或多個任意字符
  3. h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo。即匹配包含a或e的鍵
  4. h[^e]llo 匹配 hallo , hbllo , … 但不匹配 hello。即除了包含e的不符合,其它都符合。
  5. h[a-b]llo 匹配 hallo 和 hbllo。匹配a到b這個范圍內的字符,包含兩側邊界。

命令有效版本:1.0.0 之后
時間復雜度: O ( N ) O(N) O(N)
返回值:匹配 pattern 的所有 key。
示例:

// 創建key
redis 127.0.0.1:6379> SET runoob1 redis
OK
redis 127.0.0.1:6379> SET runoob2 mysql
OK
redis 127.0.0.1:6379> SET runoob3 mongodb
OK// 查找以 runoob 為開頭的 key:
redis 127.0.0.1:6379> KEYS runoob*
6) "runoob3"
7) "runoob1"
8) "runoob2"//獲取 redis 中所有的 key 可用使用 *。
redis 127.0.0.1:6379> KEYS *
9) "runoob3"
10) "runoob1"
11) "runoob2"

在生產環境中,一般都會禁止使用keys命令,尤其是keys *:查詢redis中所有的key。

EXISTS

這個命令是判斷某個值是否存在。
語法:EXISTS key [key ...]
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:key 存在的個數。
示例:

127.0.0.1:6379> set hello 111
OK
127.0.0.1:6379> set hallo 222
OK
127.0.0.1:6379> set haxxllo 333
OK
127.0.0.1:6379> keys *
1) "hello"
2) "hallo"
3) "school"
4) "car"
5) "haxxllo"
6) "test"
127.0.0.1:6379> exists hello car
(integer) 2
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists car
(integer) 1

exists判斷的時候,一次判斷和分開判斷時是有區別的。因為redis是一個客戶端、服務器結構的程序。客戶端和服務器之間通過網絡來進行通信。一次判斷完的話,只會產生一次請求和響應。而用兩次判斷的話,會多增加一次請求和響應。分開的寫法,會產生更多輪次的網絡通信。所以能一次查找最好。

DEL

刪除指定的 key。
語法:DEL key [key ...]
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:刪除掉的 key 的個數。
示例:

127.0.0.1:6379> keys *
1) "hello"
2) "hallo"
3) "school"
4) "car"
5) "haxxllo"
6) "test"
127.0.0.1:6379> del car
(integer) 1
127.0.0.1:6379> del hallo
(integer) 1
127.0.0.1:6379> keys *
1) "hello"
2) "school"
3) "haxxllo"
4) "test"

EXPIRE

為指定的 key 添加秒級的過期時間(Time To Live TTL)
語法:EXPIRE key seconds
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:1 表示設置成功。0 表示設置失敗。
這個的場景會用在驗證碼或者優惠券在指定時間之前有效等等。
示例:

127.0.0.1:6379> keys *
1) "hello"
2) "school"
3) "haxxllo"
4) "test"
127.0.0.1:6379> expire hello 10
(integer) 1
127.0.0.1:6379> get hello
"111"
127.0.0.1:6379> get hello
"111"
127.0.0.1:6379> get hello
"111"
127.0.0.1:6379> get hello
(nil)

TTL

獲取指定 key 的過期時間,秒級。
語法:TTL key
命令有效版本:1.0.0 之后
時間復雜度:O(1)
返回值:剩余過期時間。-1 表示沒有關聯過期時間,-2 表示 key 不存在。
示例:

127.0.0.1:6379> keys *
1) "school"
2) "haxxllo"
3) "test"
127.0.0.1:6379> expire school 10
(integer) 1
127.0.0.1:6379> ttl school
(integer) 6
127.0.0.1:6379> ttl school
(integer) 3
127.0.0.1:6379> ttl school
(integer) -2

[!note] 注意
EXPIRE 和 TTL 命令都有對應的支持毫秒為單位的版本:PEXPIRE 和 PTTL,詳細?法就不再介紹了。

TYPE

返回 key 對應的值的數據類型。
語法:TYPE key
命令有效版本:1.0.0 之后
比特就業課時間復雜度:O(1)
返回值: none , string , list , set , zset , hash 和stream(用于消息隊列和日志存儲,支持消息的持久化和時間排序) 。
示例:

 redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set

FLUSHALL

這個命令用于清除所有的鍵,相當于MySQL中的drop dataname,這個命令不能隨便使用。開玩笑來說這個命令是“刪庫跑路”。
語法:flushall

127.0.0.1:6379> keys *
1) "key1"
2) "key2"
3) "key3"
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)

數據類型與內部編碼

Redis 針對每種數據結構都有??的底層內部編碼實現,而且是多種實現,這樣 Redis 會在合適的場景選擇合適的內部編碼。

數據類型說明
string(字符串)基本的數據存儲單元,可以存儲字符串、整數或者浮點數
hash(哈希)一個鍵值對的集合,可以存儲多個字段
list(列表)一個簡單的列表,可以存儲一系列的字符串元素
set(集合)一個無序集合,可以存儲不重復的字符串元素
zset(有序集合)類似于集合,但是每個元素都有一個分數(權重)與之關聯
Bitmaps(位圖)基于字符串類型,可以對每個位進行操作
Stream(流)用于消息隊列和日志存儲,支持消息的持久化和時間排序

還有其它的數據類型,不過最常用的就是前5種。其它的數據類型也某些特定的場景下才會用到。
Redis在底層實現上述數據結構的時候,會在源碼層面,針對上述實現進行特定的優化,來節省時間/空間的效果,其中特定的優化就是編碼方式
另外Redis承諾,我這個哈希表,你在進行查詢、插入、刪除操作的時候,保證時間復雜度為O(1),但是這個背后的實現,不一定就是一個標準的哈希表。可能在特定的場景下,使用別的數據結構實現,但是仍然保證時間復雜度符合承諾。
每種數據類型,都可能會有多種實現方式,Redis稱其為編碼方式,常見編碼方式如下表:

數據類型內部編碼
stringraw
int
embstr
hashhashtable
ziplist
listlinkedlist
ziplist
sethashtable
intset
zsetskiplist
ziplist
  1. string
    • int:存儲的字符串是一個可以用64位有符號整數表示的數字時,會用int編碼。
    • raw:存儲的字符串長度超過44字節時,會使用raw編碼。raw編碼需要兩次內存分配,分別用于存儲Redis對象頭和字符串數據。
    • embstr:存儲的字符串長度小于等于44字節時,會使用embstr編碼。embstr編碼將redis對象頭和字符串數據連續存儲在一塊內存中,避免了多次內存分配,提高了內存使用效率和操作性能。
  2. hash
    • hashtable:是一種標準的哈希表數據結構,支持快速的查找。插入和刪除操作,適合存儲大規模的哈希對象。
    • ziplist:同時滿足2個條件,才會使用ziplist編碼。第一,哈希對象保存到鍵值對數量小于hash-max-ziplist-entries(默認值是512);第二,哈希對象保存的所有鍵值對的鍵和值的字符串長度都小于hash - max - ziplist - value(默認值為 64)。ziplist是一種緊湊的、連續的內存數據結構,適合存儲小的哈希對象,可以節省內存
  3. list
    • linkedlist:是一種雙向鏈表數據結構,支持在列表的兩端快速插入和刪除元素,但內存開銷較大。
  4. set
    • intset:當集合對象同時滿足以下兩個條件時,Redis 會使用intset編碼。第一,集合對象保存的所有元素都是整數值。第二,集合對象保存的元素數量小于set - max - intset - entries(默認值為 512)。 intset是一種緊湊的整數集合數據結構,適合存儲整數集合,可以節省內存
    • hashtable:當集合對象不滿足intset編碼的條件時,Redis 會使用hashtable編碼。hashtable的鍵用于存儲集合元素,值都為NULL,支持快速的查找、插入和刪除操作。
  5. zset
    • ziplist:ziplist編碼的有序集合將成員和分數依次存儲在ziplist中,并且按照分數從小到大排序,適合存儲小的有序集合。
    • skiplist:skiplist是一種跳躍表數據結構,它結合了鏈表和二分查找的思想,支持快速的插入、刪除和查找操作,同時還可以按照分數范圍進行快速遍歷。在 Redis 中,skiplist還會和hashtable結合使用,hashtable用于快速查找成員的分數,skiplist用于維護元素的有序性。

示例:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist"

可以通過 object encoding 命令查詢內部編碼:


為什么可以看到每種數據結構都有至少兩種以上的內部編碼實現?Redis 這樣設計有兩個好處:

  1. 可以改進內部編碼,而對外的數據結構和命令沒有任何影響,這樣?旦開發出更優秀的內部編碼,?需改動外部數據結構和命令,例如 Redis 3.2 提供了 quicklist,結合了 ziplist 和 linkedlist 兩者的優勢,為列表類型提供了?種更為優秀的內部編碼實現,而對用戶來說基本無感知。
  2. 多種內部編碼實現可以在不同場景下發揮各自的優勢,例如 ziplist 比較節省內存,但是在列表元素比較多的情況下,性能會下降,這時候 Redis 會根據配置選項將列表類型的內部實現轉換為linkedlist,整個過程?戶同樣無感知。

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

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

相關文章

Linux打開.img鏡像文件

kparkx 可以查看和修改img文件的內容 1.安裝kparkx 1.安裝 kpartx sudo apt-get update sudo apt-get install kpartx2.使用kpartx映射鏡像文件 假設鏡像文件名為 example.img ,以下命令會將其分區映射到 dev/mapper/ sudo kpartx -av example.img? -a表示添加…

6.4 計算機網絡面試題

HTTP到底是不是無狀態的? 無狀態即每個請求都是獨立的,服務器不會在多個請求間保存關于客戶端狀態的信息。 HTTP雖然是無狀態的,但是可以通過一些機制保存狀態,如使用cookies session跟蹤用戶狀態。 攜帶Cookie的HTTP請求是有狀…

基于千帆大模型的AI體檢報告解讀系統實戰:使用OSS與PDFBox實現PDF內容識別

目錄 說明 前言 需求 流程說明 表結構說明 整體流程 百度智能云 注冊和實名認證 創建應用 費用說明 大模型API說明 集成大模型 設計Prompt 上傳體檢報告 讀取PDF內容 功能實現 智能評測 抽取大模型工具 功能實現 總結 說明 AI體檢報告解讀、病例小結或者…

湖北理元理律師事務所:債務優化中的生活保障實踐

在債務壓力與生活質量失衡的普遍困境中,法律服務的價值不僅在于解決債務問題,更在于幫助債務人重建生活秩序。湖北理元理律師事務所通過其債務優化服務,探索出一條“法律生活”的雙軌路徑。 債務規劃的核心矛盾:還款能力與生存需…

無人機智能識別交通目標,AI視覺賦能城市交通治理新高度

在城市化快速發展的當下,如何實現對道路交通的智能化管理、保障出行安全,成為城市治理的重要命題。傳統的交通監控往往依賴地面攝像頭,受限于固定視角與安裝環境。而今,隨著人工智能與無人機技術的深度融合,一種更高效…

unity UI Rect Transform“高”性能寫法

🎯 Unity UI 性能優化終極指南 — RectTransform篇 🧩 RectTransform 是什么? Unity UI中每一個UI元素的必備組件繼承自 Transform,但專門用于 2D 布局負責定義UI的位置、大小、錨點、旋轉、縮放 ?? 特別注意:所有…

JDK21深度解密 Day 8:Spring Boot 3與虛擬線程整合

【JDK21深度解密 Day 8】Spring Boot 3與虛擬線程整合 引言:Spring Boot 3遇上JDK21虛擬線程 在本系列的第8天,我們將聚焦于Spring Boot 3與JDK21虛擬線程的整合實踐。作為全網首套完整的JDK21特性解析,我們不僅會探討虛擬線程如何顛覆傳統Java并發模型,還會通過完整的Sp…

【STM32F407 PWM配置和應用指南 】

PWM基本概念 PWM(脈沖寬度調制)是一種通過快速開關數字信號來控制模擬電路的技術,通過改變脈沖的占空比來控制平均電壓。STM32F407的定時器外設可以生成PWM信號。 STM32F407 PWM配置步驟 1. 定時器時鐘使能 首先需要使能定時器的時鐘&…

鴻蒙【HarmonyOS 5】 (React Native)的實戰教程

一、環境配置 ?安裝鴻蒙專屬模板? bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ?配置 ArkTS 模塊路徑? 在 entry/src/main/ets 目錄下創建原生模塊&…

MYSQL MGR高可用

1,MYSQL MGR高可用是什么 簡單來說,MySQL MGR 的核心目標就是:確保數據庫服務在部分節點(服務器)發生故障時,整個數據庫集群依然能夠繼續提供讀寫服務,最大限度地減少停機時間。 2. 核心優勢 v…

(18)混合云架構部署

文章目錄 🚀 混合云架構部署:Java應用的云原生之旅🌩? 混合云架構簡介? Java應用云原生部署五大核心技術1?? 容器化與編排技術2?? 服務網格與API網關3?? CI/CD自動化流水線4?? 多云管理平臺5?? 云原生Java框架與運行時 &#x1f…

虛擬現實教育終端技術方案——基于EFISH-SCB-RK3588的全場景國產化替代

一、VR教育終端技術挑戰與替代價值 ?實時交互性能瓶頸? 賽揚N100/N150僅支持3DOF渲染(延遲>25ms),動態手勢識別幀率≤15FPS,難以滿足6DOF教學場景需求RK3588 Mali-G610 GPU支持6DOF空間渲染(延遲≤12ms&…

pikachu靶場通關筆記14 XSS關卡10-XSS之js輸出(五種方法滲透)

目錄 一、源碼分析 1、進入靶場 2、代碼審計 二、滲透實戰 1、根據提示輸入tmac 2、XSS探測 3、注入Payload1 4、注入Payload2 5、注入Payload3 6、注入Payload4 7、注入Payload5 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關)滲透集合&#x…

PARADISE:用于新生兒缺氧缺血性腦病(HIE)疾病識別與分割的個性化和區域適應性方法|文獻速遞-深度學習醫療AI最新文獻

Title 題目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE:用于新生兒缺氧缺血性腦病(HIE)疾病識別與分割的個性化和區域適應性方法 1 文獻速遞介紹 缺氧缺血性腦病&…

OpenCV C++ 心形雨動畫

?? OpenCV C 心形雨動畫 ?? 本文將引導你使用 C 和 OpenCV 庫創建一個可愛的心形雨動畫。在這個動畫中,心形會從屏幕頂部的隨機位置落下,模擬下雨的效果。使用opencv定制自己的專屬背景 目錄 簡介先決條件核心概念實現步驟 創建項目定義心形結構…

【記錄】Python|Python支持if 1<a<2、if not a、if a is None這三種寫法

今天讓AI幫我寫代碼&#xff0c;突然發現寫出來一句類似1<a<2&#xff0c;我頓感疑惑&#xff1a;不是只能用and連接嗎&#xff1f; 一試發現真行&#xff0c;那我辛辛苦苦寫了好幾年的 (條件1) and (條件2) 算什么&#xff1f;算我勤快嗎&#xff1f;&#x1f62d; 常…

Matlab | MATLAB 中的插值詳解

MATLAB 中的插值詳解 插值是數值分析中的核心技術,用于在已知數據點之間估計未知點的值。MATLAB 提供了完整的插值函數庫,涵蓋一維到高維數據,支持多種插值方法。以下從基礎到高級全面解析: 一、插值核心概念 1. 數學本質 給定數據點 ( x i , y i ) (x_i, y_i) (<

正則表達式檢測文件類型是否為視頻或圖片

// 配置化文件類型檢測&#xff08;集中管理支持的類型&#xff09; const FILE_TYPE_CONFIG {video: {extensions: [mp4, webm, ogg, quicktime], // 可擴展支持更多格式regex: /^video\/(mp4|webm|ogg|quicktime)$/i // 自動生成正則},image: {extensions: [jpeg, jpg, png,…

Redis最佳實踐——熱點數據緩存詳解

Redis在電商熱點數據緩存中的最佳實踐 一、熱點數據定義與識別 1. 熱點數據特征 高頻訪問&#xff08;QPS > 1000&#xff09;數據規模適中&#xff08;單條 < 10KB&#xff09;數據變化頻率低&#xff08;更新間隔 > 5分鐘&#xff09;業務關鍵性高&#xff08;直接…

8088單板機C語言sprintf()格式化串口輸出---Prj04

#include "tiny_stdarg.h" // 使用自定義可變參數實現#define ADR_273 0x0200 #define ADR_244 0x0400 #define LED_PORT 0x800 #define PC16550_THR 0x1f0 #define PC16550_LSR 0x1f5 / //基本的IO操作函數 / char str[]"Hello World! 20250531 Ve…