初識Redis · C++客戶端set和zset

目錄

前言:

set

sadd sismember smembers

spop scard

sinter sinterstore

zset

zadd zrange zcard

zrem zrank zscore


前言:

前文我們已經介紹了string list hash在Redis-plus-plus的使用,本文我們開始介紹set和zset在redis-plus-plus的使用。

本文作為Redis初階的一個收尾,介紹完對應的使用之后,我們就可以進入到Redis的底層原理了。


set

sadd sismember smembers

對于sadd來說,它就是set add的意思嘛,在命令行中,我們可以直接sadd key v1 v2 v3,在這里,我們可以單次插入,也可以是初始化列表,也可以是迭代器,它的討論和前面的list幾乎是一樣的。對于sismember來說,就是判斷value是否在key里面,命令行的用法是sismember key member,這里其實用法也是,不過我們需要用bool類型接受而已。對于smembers來說,就是用來得到所有的member的,按照之前的套路,我們需要用一個迭代器來帶出對應的member:

void test_1(Redis &redis)
{redis.flushall();redis.sadd("key","1");redis.sadd("key",{"2", "3"});std::vector<std::string> vec{"4","5"};redis.sadd("key",vec.begin(), vec.end());bool ans = redis.sismember("key", "3");if(ans) std::cout << "is member" << std::endl;else std::cout << "not member" << std::endl;auto iter = std::inserter(vec, vec.end());redis.smembers("key", iter);for(auto e : vec)std::cout << e << " ";std::cout << std::endl;}

spop scard

我們仍然要注意一個點是,set的刪除是隨即刪除的,所以我們刪除的時候是沒有辦法指定的,對于scard,它就是一個用來計數的,代碼如下:

void test_2(Redis &redis)
{redis.flushall();redis.sadd("key","1");redis.sadd("key",{"2", "3"});auto ans = redis.spop("key");if(ans) std::cout << ans.value() << std::endl;else std::cout << "set is empty" << std::endl;long long res = redis.scard("key");std::cout << res << std::endl;}

sinter sinterstore

在命令行中,使用sinter是直接返回交集的結果,在redis-plus-plus中,我們可以將結果存儲到一個容器里面,sinterstore是可以將結果存儲到另一個key中,不過是存儲的位置不同罷了。

void test_3(Redis &redis)
{redis.flushall();redis.sadd("key", "1");redis.sadd("key", {"2", "3"});redis.sadd("key1", {"1", "2", "4"});std::vector<std::string> vec;auto iter = std::back_inserter(vec);redis.sinter({"key", "key1"}, iter);for(auto e : vec)std::cout << e << " ";std::cout << std::endl;}

void test_4(Redis &redis)
{redis.flushall();redis.sadd("key", "1");redis.sadd("key", {"2", "3"});redis.sadd("key1", {"1", "2", "4"});long long n = redis.sinterstore("key2", {"key", "key1"});std::cout << n << std::endl;std::vector<std::string> vec;auto iter = std::back_inserter(vec);redis.smembers("key2", iter);for(auto e : vec)std::cout << e << " ";std::cout << std::endl;
}

對于set的交集并集差集都是一樣的,所以這里我們就使用交集來介紹了,其他的兩個我們完全可以依次類推。


zset

對于zset來說,相對就要麻煩一點,因為它的查詢,就會帶著兩種風格進行查詢,一種是帶著score的,一種是不帶著score的,并且因為分數的存在,就還可以引入排名,雖然是分數的附屬品,但是也為zset的難度增加了一點。

zadd zrange zcard

void test_1(Redis &redis)
{redis.flushall();redis.zadd("key", "zhangsan",10);redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});std::vector<std::pair<std::string, double>> vec{std::make_pair("zhaoliu",40),std::make_pair("tianqi",50)};redis.zadd("key", vec.begin(), vec.end());std::vector<std::pair<std::string, double>> ans;auto res = std::back_inserter(ans);redis.zrange("key", 0, -1, res);for(auto e : ans)std::cout << e.first  << ":" << e.second<< std::endl;std::cout << redis.zcard("key") << std::endl;
}

不過大家把這段代碼放在自己的機器上跑可能會出問題,因為對于zrange來說,舊版本的redis是可以直接不用參數,直接帶分數返回的,但是新版本的需要帶上第五個參數true。

zrem zrank zscore

對于zrem來說,就是刪除元素,不過它和set不同的是它可以指定元素刪除,對于zrank就是返回排名,對于zscore來說就是返回對應的分數:

void test_2(Redis &redis)
{redis.flushall();redis.zadd("key", "zhangsan",10);redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});redis.zrem("key", "zhangsan");long long n = redis.zcard("key");std::cout << n << std::endl;auto ans = redis.zscore("key", "lisi");if(ans) std::cout << ans.value() << std::endl;else std::cout << "not exist" << std::endl;auto res = redis.zrank("key", "lisi");if(res) std::cout << res.value() << std::endl;else std::cout << "not exist" << std::endl;
}

當然了,zset的操作遠不止于此,不過很多類似的操作我們已經通過string list等其他介紹過了,比如zadd的NX和XX,我們自己清楚就行,用到的時候實在忘了,咱們再看也不遲~~

那么,基本的命令部分,我們就算是正式完結啦!

gogogo , 進入到原理部分咯~


感謝閱讀!

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

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

相關文章

sed命令筆記250419

sed命令筆記250419 sed&#xff08;Stream Editor&#xff09;是 Linux/Unix 系統中強大的流編輯器&#xff0c;主要用于對文本進行過濾和轉換&#xff08;按行處理&#xff09;。它支持正則表達式&#xff0c;適合處理文本替換、刪除、插入等操作。以下是 sed 的詳細解析&…

ubuntu-24.04.2-live-server-arm64基于cloud-init實現分區自動擴容(LVM分區模式)

1. 環境 虛擬機鏡像ISO&#xff1a;ubuntu-24.04.2-live-server-arm64.iso 2. 定制cloud-init鏡像 2.1 安裝OS 基于ubuntu-24.04.2-live-server-arm64.iso&#xff0c;通過virt-manager安裝操作系統&#xff0c;語言建議選擇英文&#xff0c;分區選擇基于LVM的自動分區&…

vue3專題1------父組件中更改子組件的屬性

理解 Vue 3 中父組件如何引用子組件的屬性是一個很重要的概念。 這里涉及到 defineExpose 和 ref 這兩個關鍵點。 方法&#xff1a;使用 defineExpose 在子組件中暴露屬性&#xff0c;然后在父組件中使用 ref 獲取子組件實例并訪問暴露的屬性。 下面我將詳細解釋這個過程&…

數據倉庫分層架構解析:從理論到實戰的完整指南??

數據倉庫分層是構建高效數據體系的核心方法論。本文系統闡述ODS、DWD、DWS、ADS四層架構的設計原理&#xff0c;結合電商用戶行為分析場景&#xff0c;詳解各層功能及協作流程&#xff0c;并給出分層設計的原則與避坑指南&#xff0c;幫助讀者掌握分層架構的落地方法。 一、為什…

從零搭建一套前端開發環境

一、基礎環境搭建 1.NVM(Node Version Manager)安裝 簡介 nvm&#xff08;Node Version Manager&#xff09; 是一個用于管理多個 Node.js 版本的工具&#xff0c;允許開發者在同一臺機器上輕松安裝、切換和使用不同版本的 Node.js。它特別適合需要同時維護多個項目&#xff…

計算機組成原理筆記(十六)——4.1基本算術運算的實現

計算機中最基本的算術運算是加法運算&#xff0c;加、減、乘、除運算最終都可以歸結為加法運算。 4.1.1加法器 一、加法器的基本單元 加法器的核心單元是 全加器&#xff08;Full Adder, FA&#xff09;&#xff0c;而所有加法器都由 半加器&#xff08;Half Adder, HA&…

利用Qt創建一個模擬問答系統

界面&#xff1a; 添加了聊天顯示區域&#xff08;QTextEdit&#xff09; 添加了發送按鈕和清空對話按鈕 優化了布局和窗口大小添加了時間戳顯示 2、功能&#xff1a; 支持實時對話可以清空對話歷史 支持按回車發送消息 添加了簡單的關鍵詞匹配響應系統 交互體驗&#x…

神經光子渲染:物理級真實感圖像生成——從麥克斯韋方程到深度學習

一、技術背景與核心突破 2025年&#xff0c;神經光子渲染&#xff08;Photonic Neural Rendering, PNR&#xff09;技術通過物理光學方程與神經輻射場的深度融合&#xff0c;在AIGC檢測工具&#xff08;如GPTDetector 5.0&#xff09;的識別準確率從98%降至12%。該技術突破性地…

Linux中手動安裝7-Zip軟件文檔

7zip位于EPEL源中&#xff0c;如果服務器可以聯網或者配置了本地EPEL源則可以直接安裝 yum install p7zip p7zip-plugins -y對于無法聯網且沒有配置本地EPEL源的服務器&#xff0c;可以通過官網下載安裝包后&#xff0c;上傳至服務器&#xff0c;手動安裝 ## 下載地址&#x…

[密碼學基礎]GM/T 0018-2023 密碼設備應用接口規范深度解析:技術革新與開發者實踐

GM/T 0018-2023 密碼設備應用接口規范深度解析&#xff1a;技術革新與開發者實踐 GM/T 0018-2023《密碼設備應用接口規范》是中國密碼行業的重要標準&#xff0c;于2023年12月4日發布&#xff0c;2024年6月1日正式實施&#xff0c;替代了2012年版標準。該標準旨在規范密碼設備…

8.QT-按鈕類控件|Push Button|Radio Button|Check Box|Tool Button(C++)

Push Button 使? QPushButton 表??個按鈕.這也是當前我們最熟悉的?個控件了. QPushButton 繼承? QAbstractButton .這個類是?個抽象類.是其他按鈕的?類 在Qt Designer中也能夠看到這?的繼承關系 屬性說明text按鈕中的?本icon按鈕中的圖標iconSize按鈕中圖標的尺?sh…

CFIS-YOLO:面向邊緣設備的木材缺陷檢測輕量級網絡解析

論文地址:https://arxiv.org/pdf/2504.11305 目錄 一、論文核心貢獻 二、創新點詳解 2.1 CARAFE動態上采樣 工作原理 優勢對比 2.2 C2f_FNB輕量模塊 計算效率 2.3 Inner-SIoU損失函數 三、實驗驗證 3.1 消融實驗 3.2 對比實驗 四、應用部署 4.1 邊緣設備部署流程…

BUUCTF PWN刷題筆記(1-9)

才知道&#xff0c;由于棧對齊&#xff0c;直接動調看棧估計會錯&#xff0c;用cyclic看 1.test_your_nc NC連接一下&#xff0c;這個網站似乎直接訪問是不中的&#xff0c;懷疑是沒開啟web的端口。NC鏈接輸入cat flag就OK了&#xff0c;應該只是讓我這樣的小菜鳥培養自信用的…

C#處理網絡傳輸中不完整的數據流

1、背景 在讀取byte數組的場景&#xff08;例如&#xff1a;讀取文件、網絡傳輸數據&#xff09;中&#xff0c;特別是網絡傳輸的場景中&#xff0c;非常有可能接收了不完整的byte數組&#xff0c;在將byte數組轉換時&#xff0c;因字符的缺失/增多&#xff0c;轉為亂碼。如下…

PostgreSQL 用戶資源管理

PostgreSQL 用戶資源管理 PostgreSQL 提供了多種機制來管理和限制用戶對數據庫資源的使用&#xff0c;以下是全面的資源管理方法&#xff1a; 1 連接限制 1.1 限制最大連接數 -- 在 postgresql.conf 中設置 max_connections 100 -- 全局最大連接數-- 為特定用戶設置連接限…

新書速覽|OpenCV計算機視覺開發實踐:基于Qt C++

《OpenCV計算機視覺開發實踐:基于Qt C》 本書內容 OpenCV是計算機視覺領域的開發者必須掌握的技術。《OpenCV計算機視覺開發實踐:基于Qt C》基于 OpenCV 4.10與Qt C進行編寫&#xff0c;全面系統地介紹OpenCV的使用及實戰案例&#xff0c;并配套提供全書示例源碼、PPT課件與作…

【上位機——MFC】消息映射機制

消息映射機制 Window消息分類消息映射機制的使用代碼示例 MFC框架利用消息映射機制把消息、命令與它們的處理函數映射起來。具體實現方法是在每個能接收和處理消息的類中&#xff0c;定義一個消息和消息函數指針對照表&#xff0c;即消息映射表。 在不重寫WindowProc虛函數的大…

docker學習筆記2-最佳實踐

一、在容器中啟動mysql的最佳實踐 &#xff08;一&#xff09;查找目錄 1、mysql的配置文件路徑 /etc/mysql/conf.d 2、mysql的數據目錄 /var/lib/mysql 3、環境變量 4、端口 mysql的默認端口3306。 &#xff08;二&#xff09;啟動命令 docker run -d -p 3306:3306 …

Vue3核心源碼解析

/packages/complier-core 定位??&#xff1a;??編譯時核心??&#xff0c;處理 Vue 模板的編譯邏輯。??核心功能??&#xff1a; ??模板解析??&#xff1a;將 .vue 文件的模板語法&#xff08;HTML-like&#xff09;解析為 ??抽象語法樹 (AST)??。??轉換優化…

n8n 中文系列教程_05.如何在本機部署/安裝 n8n(詳細圖文教程)

n8n 是一款強大的開源工作流自動化工具&#xff0c;可幫助你連接各類應用與服務&#xff0c;實現自動化任務。如果你想快速體驗 n8n 的功能&#xff0c;本機部署是最簡單的方式。本教程將手把手指導你在 Windows 或 MacOS 上通過 Docker 輕松安裝和運行 n8n&#xff0c;無需服務…