初识Redis · C++客户端set和zset

打印 上一主题 下一主题

主题 1597|帖子 1597|积分 4791

目次
媒介:
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:
  1. void test_1(Redis &redis)
  2. {
  3.     redis.flushall();
  4.     redis.sadd("key","1");
  5.     redis.sadd("key",{"2", "3"});
  6.     std::vector<std::string> vec{"4","5"};
  7.     redis.sadd("key",vec.begin(), vec.end());
  8.     bool ans = redis.sismember("key", "3");
  9.     if(ans) std::cout << "is member" << std::endl;
  10.     else std::cout << "not member" << std::endl;
  11.     auto iter = std::inserter(vec, vec.end());
  12.     redis.smembers("key", iter);
  13.    
  14.     for(auto e : vec)
  15.         std::cout << e << " ";
  16.     std::cout << std::endl;
  17. }
复制代码

spop scard

我们仍然要留意一个点是,set的删除是随即删除的,以是我们删除的时间是没有办法指定的,对于scard,它就是一个用来计数的,代码如下:
  1. void test_2(Redis &redis)
  2. {
  3.     redis.flushall();
  4.     redis.sadd("key","1");
  5.     redis.sadd("key",{"2", "3"});
  6.    
  7.     auto ans = redis.spop("key");
  8.     if(ans) std::cout << ans.value() << std::endl;
  9.     else std::cout << "set is empty" << std::endl;
  10.    
  11.     long long res = redis.scard("key");
  12.     std::cout << res << std::endl;
  13. }
复制代码

sinter sinterstore

在命令行中,使用sinter是直接返回交集的结果,在redis-plus-plus中,我们可以将结果存储到一个容器里面,sinterstore是可以将结果存储到另一个key中,不过是存储的位置不同罢了。
  1. void test_3(Redis &redis)
  2. {
  3.     redis.flushall();
  4.     redis.sadd("key", "1");
  5.     redis.sadd("key", {"2", "3"});
  6.     redis.sadd("key1", {"1", "2", "4"});
  7.    
  8.     std::vector<std::string> vec;
  9.     auto iter = std::back_inserter(vec);
  10.     redis.sinter({"key", "key1"}, iter);
  11.     for(auto e : vec)
  12.         std::cout << e << " ";
  13.     std::cout << std::endl;
  14. }
复制代码

  1. void test_4(Redis &redis)
  2. {
  3.     redis.flushall();
  4.     redis.sadd("key", "1");
  5.     redis.sadd("key", {"2", "3"});
  6.     redis.sadd("key1", {"1", "2", "4"});
  7.    
  8.     long long n = redis.sinterstore("key2", {"key", "key1"});
  9.     std::cout << n << std::endl;
  10.    
  11.     std::vector<std::string> vec;
  12.     auto iter = std::back_inserter(vec);
  13.     redis.smembers("key2", iter);
  14.     for(auto e : vec)
  15.         std::cout << e << " ";
  16.     std::cout << std::endl;
  17. }
复制代码

对于set的交集并集差集都是一样的,以是这里我们就使用交集来先容了,其他的两个我们完全可以依次类推。

zset

对于zset来说,相对就要麻烦一点,因为它的查询,就会带着两种风格举行查询,一种是带着score的,一种是不带着score的,并且因为分数的存在,就还可以引入排名,虽然是分数的附属品,但是也为zset的难度增加了一点。
zadd zrange zcard

  1. void test_1(Redis &redis)
  2. {
  3.     redis.flushall();
  4.     redis.zadd("key", "zhangsan",10);
  5.     redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});
  6.     std::vector<std::pair<std::string, double>> vec{
  7.         std::make_pair("zhaoliu",40),
  8.         std::make_pair("tianqi",50)
  9.     };
  10.     redis.zadd("key", vec.begin(), vec.end());
  11.     std::vector<std::pair<std::string, double>> ans;
  12.     auto res = std::back_inserter(ans);
  13.     redis.zrange("key", 0, -1, res);
  14.     for(auto e : ans)
  15.         std::cout << e.first  << ":" << e.second<< std::endl;
  16.     std::cout << redis.zcard("key") << std::endl;
  17. }
复制代码

不过大家把这段代码放在自己的机器上跑可能会出题目,因为对于zrange来说,旧版本的redis是可以直接不消参数,直接带分数返回的,但是新版本的必要带上第五个参数true。
zrem zrank zscore

对于zrem来说,就是删除元素,不过它和set不同的是它可以指定元素删除,对于zrank就是返回排名,对于zscore来说就是返回对应的分数:
  1. void test_2(Redis &redis)
  2. {
  3.     redis.flushall();
  4.     redis.zadd("key", "zhangsan",10);
  5.     redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});
  6.     redis.zrem("key", "zhangsan");
  7.     long long n = redis.zcard("key");
  8.     std::cout << n << std::endl;
  9.     auto ans = redis.zscore("key", "lisi");
  10.     if(ans) std::cout << ans.value() << std::endl;
  11.     else std::cout << "not exist" << std::endl;
  12.     auto res = redis.zrank("key", "lisi");
  13.     if(res) std::cout << res.value() << std::endl;
  14.     else std::cout << "not exist" << std::endl;
  15. }
复制代码

固然了,zset的操作远不止于此,不过很多类似的操作我们已经通过string list等其他先容过了,好比zadd的NX和XX,我们自己清楚就行,用到的时间着实忘了,咱们再看也不迟~~
那么,基本的命令部分,我们就算是正式完结啦!
gogogo , 进入到原理部分咯~

感谢阅读!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表