设为首页 收藏本站
查看: 820|回复: 0

[经验分享] redis:set数据类型与操作

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-12 12:20:59 | 显示全部楼层 |阅读模式
  set是集合。我们可以向一个集合中“插入”,“删除”元素,也可以计算两个集合的“交集”,“并集”,及“作差”。如:
  假设有集合A,B。
  其中,A={1,2,3,4,5},B={4,5,6,7,8}。
  那么,
  交集:inter(A,B)= {4,5}
  并集:union(A, B)= {1,2,3,4,5,6,7,8}
  差集:diff(A,B)= {1,2,3},即属于集合A,但不属于集合B的元素
  


  set的是通过hash table实现的,所以添加、删除和查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。需要注意的是调整hash table大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在sorted set中使用了。(引自:http://hb.qq.com/a/20111001/000022.htm)
  


  关于set数据类型的操作详见:http://redis.readthedocs.org/en/2.4/set.html
  下面结合redis c++接口,了解一下这些基本操作。

#include "redisclient.h"
#include "tests/functions.h"
#include <iostream>
#include <boost/date_time.hpp>
#define OUT(x) std::cout<<#x<<&quot; = &quot;<<x<<std::endl;
boost::shared_ptr<redis::client> init_non_cluster_client();
void output_set(redis::client::string_set & sset);
void test_set(redis::client & c);
int main(int argv, char* argc[])
{
boost::shared_ptr<redis::client> shared_c;
shared_c = init_non_cluster_client();
redis::client& c = *shared_c;
test_set(c);
return 0;
}
void test_set(redis::client & c)
{
test(&quot;test redis set type.&quot;);
test(&quot;sadd&quot;);
{
std::vector<std::string> vals;
for(size_t i=0; i<10; ++i) {
char ch = (char)('A'+i);
std::string tmp =&quot;&quot;;
tmp += ch;
vals.push_back(tmp);
}
std::vector<std::string>::iterator it;
c.sadd(&quot;set_a&quot;, vals.begin(), vals.end());
}
test(&quot;smembers&quot;);
{
redis::client::string_set out;
OUT(c.smembers(&quot;set_a&quot;, out));
output_set( out );
}
test(&quot;srem&quot;);
{
c.srem(&quot;set_a&quot;, &quot;A&quot;);
redis::client::string_set out;
OUT(c.smembers(&quot;set_a&quot;, out));
output_set( out );
}
test(&quot;sismember&quot;);
{
OUT( c.sismember(&quot;set_a&quot;, &quot;A&quot;) );
OUT( c.sismember(&quot;set_a&quot;, &quot;B&quot;) );
}
test(&quot;scard&quot;);
{
OUT( c.scard(&quot;set_a&quot;) );
}
test(&quot;smove&quot;);
{
c.smove(&quot;set_a&quot;, &quot;set_b&quot;, &quot;B&quot;);
redis::client::string_set out;
OUT(c.smembers(&quot;set_a&quot;, out));
output_set(out);
out.clear();
OUT(c.smembers(&quot;set_b&quot;, out));
output_set( out );
}
test(&quot;spop&quot;);
{
OUT( c.scard(&quot;set_a&quot;) );
OUT( c.spop(&quot;set_a&quot;) );
OUT( c.scard(&quot;set_a&quot;) );
}
test(&quot;srandmember&quot;);
{
OUT( c.srandmember(&quot;set_a&quot;) );
}
test(&quot;sinter&quot;);
{
c.sadd(&quot;set_b&quot;, &quot;C&quot;);
c.sadd(&quot;set_b&quot;, &quot;F&quot;);
redis::client::string_vector keys;
keys.push_back(&quot;set_a&quot;);
keys.push_back(&quot;set_b&quot;);
redis::client::string_set out;
c.smembers(&quot;set_a&quot;, out);
std::cout<<&quot;set a:  *******************&quot;<<std::endl;
output_set(out);
out.clear();
c.smembers(&quot;set_b&quot;, out);
std::cout<<&quot;set b:  *******************&quot;<<std::endl;
output_set(out);
c.sinter(keys, out);
output_set(out);
}
test(&quot;sinterstore&quot;);
{
redis::client::string_vector keys;
redis::client::string_set out;
keys.push_back(&quot;set_a&quot;);
keys.push_back(&quot;set_b&quot;);
c.sinterstore(&quot;set_c&quot;, keys);
c.smembers(&quot;set_c&quot;, out);
output_set(out);
}
test(&quot;sunion & sunionstore&quot;);
{
redis::client::string_vector keys;
redis::client::string_set out;
keys.push_back(&quot;set_a&quot;);
keys.push_back(&quot;set_b&quot;);
c.sunion(keys, out);
output_set(out);
out.clear();
c.sunionstore(&quot;set_d&quot;, keys);
c.smembers(&quot;set_d&quot;, out);
std::cout<<&quot;set d: ****************&quot;<<std::endl;
output_set(out);
}
test(&quot;sdiff * sdiffstore&quot;);
{
redis::client::string_vector keys;
redis::client::string_set out;
keys.push_back(&quot;set_a&quot;);
keys.push_back(&quot;set_b&quot;);
c.sdiff(keys, out);
output_set(out);
out.clear();
c.sdiffstore(&quot;set_e&quot;, keys);
c.smembers(&quot;set_e&quot;, out);
std::cout<<&quot;set e: ****************&quot;<<std::endl;
output_set(out);
}
}
void output_set(redis::client::string_set & sset)
{
size_t size = sset.size();
OUT(size);
redis::client::string_set::iterator it;
for(it=sset.begin(); it!=sset.end(); ++it) {
OUT(*it);
}
}


  



版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138313-1-1.html 上篇帖子: redis事务处理:(error) EXECABORT Transaction discarded because of previous errors. 下篇帖子: redis安装和使用文档
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表