redis 系列10 字元串對象

来源:https://www.cnblogs.com/MrHSR/archive/2018/11/14/9957253.html
-Advertisement-
Play Games

一. 字元串對象編碼 Redis中字元串可以存儲3種類型,分別是位元組串(byte string)、整數、浮點數。在上章節中講到字元串對象的編碼可以是int, raw,embstr。 如果一個字元串對象保存的是整數值,那麼對象RedisObject結構的ptr 屬性裡面將void*轉換成long,字元 ...


一. 字元串對象編碼

  Redis中字元串可以存儲3種類型,分別是位元組串(byte string)、整數、浮點數在上章節中講到字元串對象的編碼可以是int, raw,embstr。 如果一個字元串對象保存的是整數值,那麼對象RedisObject結構的ptr 屬性裡面將void*轉換成long,字元串對象的編碼設置為int。

  例1: 使用set命令,創建一個int編碼的字元串對象。

    127.0.0.1:6379> set num1 10086
    OK
    127.0.0.1:6379> object encoding num1
    "int"

  RedisObject結構中ptr指向一個long值,參考圖如下所示:

  例2: 使用set命令,創建一個raw編碼的字元串對象。這個字元串值的長度大於32位元組。

    127.0.0.1:6379> set story3 "long long long long long long long long long ..."
    OK
    127.0.0.1:6379> strlen story3
    (integer) 48
    127.0.0.1:6379> object encoding story3
    "raw"

    RedisObject結構中ptr指向SDS的sdshdr結構, 參考圖如下所示:

  例3: 使用set命令,創建一個embstr編碼的字元串對象, 這個字元串值的長度小於等於32位元組。

    127.0.0.1:6379> set story4 "long long long long long lon"
    OK
    127.0.0.1:6379> strlen story4
    (integer) 28
    127.0.0.1:6379> object encoding story4
    "embstr"

    embstr編碼是專門用於保存短字元串的一種優化編碼方式,這種編碼和raw編碼一樣,都使用RedisObject結構和sdshdr結構來表示字元串對象。使用embstr編碼的字元串對象來保存短字元串值有以下好處: 

(1) embstr編碼將創建字元串對象所需的記憶體分配次數從raw編碼的兩次降低為一次。

(2) 釋放embstr編碼的字元串對象只需要調用一次記憶體釋放函數。而raw編碼的為二次。

(3) embstr編碼的字元串對象的所有數據都保存在一塊連續的記憶體中,能更好的帶來緩存優勢。

  例4: 使用set命令,創建一個浮點數,也是作為字元串保存,屬於embstr編碼的字元串對象。

    127.0.0.1:6379> set pi 3.14
    OK
    127.0.0.1:6379> object encoding pi
    "embstr"

    最後:總結字元串對象保存各類型值的編碼方式

字元串對象值 編碼
可以用long類型保存的整數 int
可以用long double類型保存的浮點數 Embstr或者raw
值長度太長而沒辦法用long類型表示的整數,或者浮點數。 Embstr或者raw
值的長度大於32位元組 raw
長度小於32位元組 Embstr

二. key命令  

 -- del命令 刪除存在的key, 如果沒有存在的key返回0。
        127.0.0.1:6379> del msg
        (integer) 1
-- dump命令 序列化給定 key, 如果 key 不存在, 那麼返回 nil,否則返回序列化之後的值。 127.0.0.1:6379> dump msg "\x00\x05hello\b\x00\xda_3\xc9\xcc-\xaa2"
-- EXISTS命令 用於檢查給定 key 是否存在, 若 key 存在返回 1 ,否則返回 0127.0.0.1:6379> exists msg (integer) 1
-- Expire 命令用於設置 key 的過期時間。key 過期後將不再可用。設置成功返回1。下麵設置了過期時間為 1 分鐘,1分鐘後該鍵會自動刪除。 127.0.0.1:6379> expire msg 60 (integer) 1
-- pattern 命令用於查找所有符合給定模式,返回符合給定模式的 key 列表 (Array)。 127.0.0.1:6379> set msg1 1 OK 127.0.0.1:6379> set msg2 2 OK 127.0.0.1:6379> set msg3 3 OK 127.0.0.1:6379> keys msg* 1) "msg2" 2) "msg1" 3) "msg3"
-- PERSIST 命令用於移除給定 key 的過期時間,使得 key 永不過期。 -- Pttl 命令以毫秒為單位返回 key 的剩餘過期時間。 -- ttl 命令以秒為單位返回 key 的剩餘過期時間。 127.0.0.1:6379> expire msg1 60 (integer) 1 127.0.0.1:6379> ttl msg1 (integer) 49 127.0.0.1:6379> persist msg1 (integer) 1 127.0.0.1:6379> ttl msg1 (integer) -1
-- RANDOMKEY 命令從當前資料庫中隨機返回一個 key 127.0.0.1:6379> RANDOMKEY "fruit-price"
-- Rename 命令用於修改 key 的名稱 127.0.0.1:6379> rename msg1 msg1new OK
-- Renamenx 命令修改 key名稱,新的key沒有存已有資料庫中時,修改成功.返回1. 127.0.0.1:6379> get msg2 "2" 127.0.0.1:6379> get msg3 "3" 127.0.0.1:6379> renamenx msg2 msg3 (integer) 0 127.0.0.1:6379> renamenx msg2 msg4 (integer) 1 

其它:
  MOVE key db 將當前資料庫的 key 移動到給定的資料庫 db 當中。
  -- type 命令用於返回 key 所儲存的值的類型
  none (key不存在),string (字元串),list (列表),set (集合),zset (有序集),hash (哈希表)

 

三.字元串對象命令

 --  set命令指定 key 的值
 --  get 命令獲取指定 key 的值
 --  GETRANGE返回 key 中字元串值的子字元
    127.0.0.1:6379> set msg "hello"
    OK
    127.0.0.1:6379> getrange msg 0 2
    "hel"

 --  getset 命令將給定 key 的值重新設置 value ,並返回 key 的舊值(old value)
    127.0.0.1:6379> getset msg "hi"
    "hello"
    127.0.0.1:6379> get msg
    "hi"

 --  MGET 命令獲取所有(一個或多個)給定 key 的值
    127.0.0.1:6379> mget msg msg3
    1) "hi"
    2) "3"

 -- setex 將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)
    127.0.0.1:6379> setex message 10 "hello"
    OK
    127.0.0.1:6379> get message
    "hello"
    127.0.0.1:6379> get message
    (nil)   10秒後

 -- setnx命令 只有在 key 不存在時設置 key 的值, 下麵msg鍵存在,設置失敗返回0,msg1鍵不存在,設置成功,返回1
    127.0.0.1:6379> setnx msg "hello"
    (integer) 0
    127.0.0.1:6379> setnx msg1 "hello"
    (integer) 1

-- setrange 命令用value參數覆寫給定 key 所儲存的字元串值,從偏移量 offset 開始。
    127.0.0.1:6379> set msg "hello"
    OK
    127.0.0.1:6379> setrange msg 1 "i..."
    (integer) 5
    127.0.0.1:6379> get msg
    "hi..."

-- strlen 命令返回 key 所儲存的字元串值的長度。
    127.0.0.1:6379> strlen msg
    (integer) 5

-- mset 命令同時設置一個或多個 key-value 對。
    127.0.0.1:6379> mset msg "hi" msg2 "hi"
    OK
    127.0.0.1:6379> mget msg msg2
    1) "hi"
    2) "hi"

-- msetnx命令同時設置一個或多個 key-value 對,所有給定 key 都必須不存在, 只要存在一個已有的key,所有添加失敗。
    127.0.0.1:6379> msetnx msg6 "hello" msg5 "hello"
    (integer) 1
    127.0.0.1:6379> mget msg6 msg5
    1) "hello"
    2) "hello"

-- psetex命令 它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。
    127.0.0.1:6379> psetex msg5 5000 "hi"
    OK
    127.0.0.1:6379> get msg5
    "hi"
    127.0.0.1:6379> get msg5
    (nil)  5秒後

--  Incr 命令將 key 中儲存的數字值增一。
    127.0.0.1:6379> set num  1
    OK
    127.0.0.1:6379> incr num
    (integer) 2
    127.0.0.1:6379> get num
    "2"

-- Incrby 命令將 key 中儲存的數字加上指定的增量值。在值為2是加10。
    127.0.0.1:6379> incrby num 10
    (integer) 12
    127.0.0.1:6379> get num
    "12"
    
-- Decrby 命令將 key 所儲存的值減去指定的減量值。將值為12 減去10。
    127.0.0.1:6379> decrby num 10
    (integer) 2
    127.0.0.1:6379> get num
    "2"

 --  Append 命令用於為指定的 key 追加值。
    127.0.0.1:6379> set msg "hello"
    OK
    127.0.0.1:6379> append msg "world"
    (integer) 10
    127.0.0.1:6379> get msg
    "helloworld"

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "[amc" ](https://cloud.tencent.com/developer/user/1024461?fromSource=waitui)發表於 "雲+社區專欄" 在 C 語言的動態申請記憶體技術中,相比起 /` ...
  • Linux下find命令在目錄結構中搜索文件,並執行指定的操作。Linux下find命令提供了相當多的查找條件,功能很強大。由於find具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來瞭解一下。即使系統中含有網路文件系統( NFS),find命令在該文件系統中同樣有效,只你具有相 ...
  • 1 #!/bin/bash 2 # coding: utf-8 3 # Copyright (c) 2018 4 5 set -e #返回值為非0時,退出腳本 6 7 echo "0. 系統的一些配置" 8 setenforce 0 || true 9 systemctl stop iptables... ...
  • 我一直比較推薦一些Linux新手使用Deepin Linux,因為我認為這種儘量的follow Windows的系統至少對於新手來說是比較的友好的,而且預裝了QQ 火狐瀏覽器中文版,甚至還移植了像360安全瀏覽器這些,自帶的應用商店等等,去掉了很多至少對於一般的Linux用戶,初學者這些用不到的組件 ...
  • 一、Tomcat安裝 1.下載jdk,Tomcat,解壓到/usr/local/ 2.配置jdk環境:# vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_171 export PATH=$JAVA_HOME/bin:$PATH export ...
  • Linux使用MySQL Yum存儲庫上安裝MySQL 5.6,適用於Oracle Linux,Red Hat Enterprise Linux和CentOS系統。 一、全新安裝MySQL 1、添加MySQL Yum存儲庫 將MySQL Yum存儲庫添加到系統的存儲庫列表中。這是一次性操作,可以通過 ...
  • --資料庫操作前的準備-- 創建資料庫-- create database python_test_1 charset=utf8; -- 使用資料庫-- use python_test_1; -- students表-- create table students(-- id int unsigne ...
  • 一 . MQ:message queue 消息隊列的作用: 1 通信解耦 2 高峰限流 原理分析: 一開始,認證系統是強耦合的,A系統傳遞認證系統消息接收計算結果的過程中 1 傳給認證系統 2 認證系統計算 3 返回計算結果 4 讀取A系統邏輯 只要當前計算沒有完成,對於認證系統來講消耗線程資源.並 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...