目錄
前言:
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 , 進入到原理部分咯~
感謝閱讀!