Redis核心數據類型解析——string篇

Redis的常見數據類型

Redis 提供了 5 種數據結構,理解每種數據結構的特點對于 Redis 開發運維?常重要,同時掌握每
種數據結構的常?命令,會在使? Redis 的時候做到游刃有余。

預備

????????在正式介紹 5 種數據結構之前,了解?下 Redis 的?些全局命令、數據結構和內部編碼、單線程 命令處理機制是?分必要的,它們能為后?內容的學習打下?個良好的基礎。
主要體現在兩個方面
  1. Redis的命令有上百個,只是死記硬背比較困難,但是如何理解Redis的一些機制,會發現這些命令有很強的通用性。
  2. Redis不是萬金油,有些數據結構和命令必須在特定的場景下使用,一旦使用不當可能會對Redis自身造成致命傷害

全局命令

? ? ? ? Redis有5種數據結構,但是它們都是對值而言,不過對于鍵,倒是有一些通用的命令。

KEYS

返回所有滿足樣式的key。支持如下

? h?llo 匹配 hello , hallo 和 hxllo

? h*llo 匹配 hllo 和 heeeello

? h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo

? hello 匹配 hallo , hbllo , ... 但不匹配 hello

? h[a-b]llo 匹配 hallo和 hbllo

舉例如下

EXISTS

判斷某個key是否存在

舉個例子

DEL

刪除指定的key

舉個例子

EXPIRE
?????????為執行的key添加過期時間
舉個例子

TTL

獲取指定key的剩余時間

TYPE

返回key對應的數據類型

返回值: none , string , list , set , zset , hash and stream

數據結構和內部編碼

type 命令實際返回的就是當前鍵的數據結構類型,它們分別是:string(字符串)、list(列
表)、hash(哈希)、set(集合)、zset(有序集合),但這些只是 Redis 對外的數據結構

Redis的數據結構和內部編碼

數據結構內部編碼
stringraw
int
embstr
hashhashtable
ziplist
listlinkedlist
ziplist
sethashtable
intset
zsetskiplist
ziplist
可以看到每種數據結構都有?少兩種以上的內部編碼實現,例如 list 數據結構包含了 linkedlist 和
ziplist 兩種內部編碼。同時有些內部編碼,例如 ziplist,可以作為多種數據結構的內部實現,可以通過 object encoding 命令查詢內部編碼,舉例:

Redis這樣設計有很大的好處:

?1) 可以改進內部編碼,?對外的數據結構和命令沒有任何影響,這樣?旦開發出更優秀的內部編碼, ?需改動外部數據結構和命令,例如 Redis 3.2 提供了 quicklist,結合了 ziplist 和 linkedlist 兩者的優勢,為列表類型提供了?種更為優秀的內部編碼實現,?對??來說基本?感知

?2)多種內部編碼實現可以在不同場景下發揮各?的優勢,例如 ziplist ?較節省內存,但是在列表元素 ?較多的情況下,性能會下降,這時候 Redis 會根據配置選項將列表類型的內部實現轉換為 linkedlist,整個過程??同樣?感知。

單線程架構

????????Redis 使?了單線程架構來實現?性能的內存數據庫服務,本節?先通過多個客?端命令調?的例?說明 Redis 單線程命令處理機制,接著分析 Redis 單線程模型為什么性能如此之?,最終給出為什么理解單線程模型是使?和運維 Redis 的關鍵。
簡介
宏觀上同時要求服務的客戶端

微觀上客戶端發送命令的時間是有先后次序的

為什么單線程可以這么快
通常來講,單線程處理能?要?多線程差,例如有 10 000 公?貨物,每輛?的運載能?是每次
200 公?,那么要 50 次才能完成;但是如果有 50 輛?,只要安排合理,只需要依次就可以完成任務。那么為什么 Redis 使?單線程模型會達到每秒萬級別的處理能?呢?可以將其歸結為三點
  • 純內存訪問。Redis將所有的數據放在內存中,內存的響應時長大約是100ns,這是Redis達到每秒萬級別的重要基礎。
  • 非阻塞IO。Redis使用epoll作為IO多路復用技術的實現,在加上Redis自身的事件處理模型將epoll中的鏈接、讀寫、關閉都轉換成事件,不在網絡IO上浪費過多的事件。
  • 單線程避免了線程切換和競態產生的消耗。單線程可以簡化數據結構和算法的視線,讓程序模型更加簡單;其次避免了多線程中在線程競爭同一份共享資源時帶來的切換的等待消耗。

雖然單線程給 Redis 帶來很多好處,但還是有?個致命的問題:對于單個命令的執?時間都是有
要求的。如果某個命令執?過?,會導致其他命令全部處于等待隊列中,遲遲等不到響應,造成客戶端的阻塞,對于 Redis 這種?性能的服務來說是?常嚴重的,所以 Redis 是?向快速執?場景數據庫。
String字符串
字符串類型是 Redis 最基礎的數據類型,關于字符串需要特別注意:
  1. Redis中的所有的鍵的類型都是字符串類型,而且其他幾種數據類型也都是在字符串類似基礎上構建的。
  2. 字符串的值實際可以是字符串,包含一般格式的字符串或者類似JSON、XML格式的字符串,數字。可以使整型或者浮點型;甚至是二進制流數據

常見命令

set

將string類型的value設置到key中。如果key之前存在,就修改;不存在就創建。

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

SET命令支持多種選項來影響它的行為

  • EX seconds —— 使用秒為單位來設置key的過期時間
  • PX milliseconds——使用毫秒作為單位設置key的過期時間
  • NX——只有key不存在的時候才設置
  • XX——只有key存在的時候才設置

舉個例子

get

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

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

舉個例子

mset

一次性設置多個key的值

MSET key value [key value ...]

舉個例子

setnx

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

計數命令

incr

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

incrby

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

舉個例子

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

DECYBY
將 key 對應的 string 表?的數字減去對應的值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是?個整型或者范圍超過了 64 位有符號整型,則報錯。
DECRBY key decrement
INCRBYFLOAT
將 key 對應的 string 表?的浮點數加上對應的值。如果對應的值是負數,則視為減去對應的值。如果key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的不是 string,或者不是?個浮點數,則報錯。允許采?科學計數法表?浮點數。
INCRBYFLOAT key increment

其他命令

append

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

getrange

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

SETRANGE
覆蓋字符串的?部分,從指定的偏移開始。
SETRANGE key offset value

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

結算

內部編碼

字符串類型的內部編碼有 3 種:
  • int:8個字節的整型
  • embstr:小于等于39個字節的字符串
  • raw:大于39個字節的字符串
Redis 會根據當前值的類型和?度動態決定使?哪種內部編碼實現。

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

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

相關文章

爬蟲逆向--Day20Day21--扣JS逆向練習【案例4:深證信服務平臺】

一、案例【深證信數據服務平臺】案例地址鏈接:https://webapi.cninfo.com.cn/#/marketDataDate案例爬取鏈接:https://webapi.cninfo.com.cn/api/sysapi/p_sysapi10071.1、入口定位當進行入口定位時,我們首先需要進行查看響應、載荷、請求頭是…

ExcelJS實現導入轉換HTML展示(附源碼可直接使用)

目錄 簡介 開始實踐 難點 文件示例 效果預覽 具體實現 安裝 完整代碼 總結 簡介 在日常工作中,我們可能會遇到需要上傳并展示 Excel 文件的需求,實現文件內容的在線預覽。 這里給大家接收一個組件庫exceljs,這個組件庫進過實踐發現…

ECDH和數字簽名

文章目錄一、核心區別:目的完全不同二、協同工作關系:缺一不可的安全組合三、技術結合點:都基于ECC(橢圓曲線密碼學)ECDH(橢圓曲線迪菲-赫爾曼密鑰交換)和數字簽名(如ECDSA,橢圓曲線數字簽名算法…

withCredentials(簡單說:帶不帶憑證)

一、withCredentials是什么?withCredentials 是瀏覽器 XMLHttpRequest 或 Fetch API(以及 axios 等基于它們的庫)中的一個配置項,作用是控制跨域請求時是否攜帶 Cookie、HTTP 認證信息等憑證。用更通俗的方式解釋:二、…

window系統使用命令行來安裝OpenSSH服務器或客戶端

可以通過 PowerShell 命令行來安裝,這種方式更直接可靠:以管理員身份打開 PowerShell: 按下 Win S 搜索 “PowerShell”右鍵點擊 “Windows PowerShell”,選擇"以管理員身份運行"安裝 OpenSSH 客戶端: Add-…

vim中常見操作及命令

在 Vim 中為所有行的行首添加相同字符,可以使用以下方法: 方法1:使用 :%s 替換命令(推薦) vim :%s/^/要添加的字符/ 例如要在所有行首添加 #:vim :%s/^/#/ 方法2:使用塊選擇模式(可視…

開發使用mybatis是用混合模式還是全注解模式

在使用 MyBatis 開發項目時,Mapper 接口是為數據庫操作提供最直觀的方法,但在實現方式上,我們有兩種選擇:全注解模式和混合模式。那么,他們有什么區別,應該如何選擇?我們一起來討論一下。一、全…

WS2812燈帶效果設計器上位機

軟件使用方法介紹:bilibili地址 【免寫單片機代碼WS2812燈帶效果設計軟件-嗶哩嗶哩】 https://b23.tv/xFhxMGm

Docker 容器(二)

Docker四、Docker容器數據卷1.數據卷的主要特點2.卷的共享與繼承(1)卷的共享(Sharing)(2) 卷的繼承(Inheritance)3.數據卷運行實例五、Dockerfile1.Dockerfile2. 創建一個名為 myubuntu的自定義鏡像第 1 步…

PCB基礎細節--工藝篇

pcb基礎細節(工藝篇) 1. 孔與焊盤2. PCB各層之間的作用3. 阻抗匹配 3.1. 什么是傳輸線?我們只看特性阻抗,時延以后再說。 在畫原理圖時,我們把電阻,電容,電感是抽象成一個點了。兩邊加一個電壓&…

信創服務器總死機原因及解決辦法

哈嘍,你好啊,我是雷工!最近有個項目使用信創的服務器,總是出現死機的情況,聯系廠家檢查了一下,說是沐創網卡固件較低造成的,讓移除網卡或升級固件嘗試一下。記得5月份按廠家的說法處理過一臺&am…

03_網關ip和端口映射(路由器轉發)操作和原理

網關ip和端口映射(路由器轉發)操作和原理IP 與端口映射配置全指南:2 種方案搞定外網訪問內網一、先搞懂:為什么需要 IP 與端口映射?二、方案一:路由器端口映射(適合有公網 IP,長期穩…

「數據獲取」《安徽建設統計年鑒》(2002-2007)(2004、2006缺失)(獲取方式看綁定的資源)

01、數據簡介《安徽建設統計年鑒》是一部全方位反映安徽省建設事業發展變遷的重要統計資料著作。該書系統收集并精心整理了 2006 年度安徽省城鄉建設領域的核心統計數據,涵蓋城鄉建設固定資產投資、建筑業發展態勢、城鎮建設推進情況等多個關鍵方面,為政…

Python/JS/Go/Java同步學習(第一篇)格式化/隱藏參數一鍋端 四語言輸出流參數宇宙(附源碼/截圖/參數表/避坑指南/老板沉默術)

🤝 免罵聲明: 本文四語言輸出流參數經本蜀黎實戰整理,旨在提供快速參考指南📝因各語言版本迭代及不同系統環境差異,偶爾可能出現整理不全面之處,實屬正常?歡迎理性交流補充,噴子勿噴——畢竟你…

人工智能助力流感疫苗選擇:MIT 團隊推出 VaxSeer 系統

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

使用 qmake 生成 Makefile,Makefile 轉換為 Qt 的 .pro 文件

使用 qmake 生成 Makefile 的完整指南 qmake 是 Qt 提供的構建工具,用于從 .pro 項目文件生成 Makefile。以下是詳細的使用方法: 基本使用方法 1. 從 .pro 文件生成 Makefile bash qmake -o Makefile your_project.pro2. 直接運行 qmake(自動…

利用DeepSeek編寫驗證xlsx格式文件中是否啟用sharedStrings.xml對讀寫效率影響python程序

讓他分別用100*10000個單元格有100、1000、10000個不同的1-200字符長的大寫英文字母字符串測試. 一開始DeepSeek沒有找到啟用sharedStrings.xml的寫xlsx模塊,我自己找了pyxlsbwriter的例子告訴他才改好的。 import os import time import random import string impo…

【C++框架#2】gflags 和 gtest 安裝使用

spdlog 安裝和使用 1. 概述 介紹:spdlog 是一個高性能、超快速、零配置的 C 日志庫,它旨在提供簡潔的 API 和豐富的功能,同時保持高性能的日志記錄。它支持多種輸出目標、格式化選項、線程安全以及異步日志記錄。 github 鏈接:htt…

平衡掌控者-游戲數值戰斗設計

一、有效生命值1、計算公式有效生命生命值/(1-傷害減免率)/(1-閃避率)2、前搖和后搖對數值來說,戰斗由兩大模塊組成,一個是戰斗公式生效前的戰斗攻擊流程,一個是戰斗公式與自身流程。比如說&…

使用DataLoader加載本地數據 食物分類案例

目錄 一.食物分類案例 1..整合訓練集測試集文檔 2.導入相關的庫 3.設置圖片數據的格式轉換 3.數據處理 4.數據打包 5.定義卷積神經網絡 6.創建模型 7.訓練和測試方法定義 8.損失函數和優化器 9.訓練模型,測試準確率 10.測試模型 之前我們DataLoader加載…