redis:set数据类型与操作
2011-11-25 13:55
274 查看
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++接口,了解一下这些基本操作。
假设有集合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<<" = "<<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("test redis set type."); test("sadd"); { std::vector<std::string> vals; for(size_t i=0; i<10; ++i) { char ch = (char)('A'+i); std::string tmp =""; tmp += ch; vals.push_back(tmp); } std::vector<std::string>::iterator it; c.sadd("set_a", vals.begin(), vals.end()); } test("smembers"); { redis::client::string_set out; OUT(c.smembers("set_a", out)); output_set( out ); } test("srem"); { c.srem("set_a", "A"); redis::client::string_set out; OUT(c.smembers("set_a", out)); output_set( out ); } test("sismember"); { OUT( c.sismember("set_a", "A") ); OUT( c.sismember("set_a", "B") ); } test("scard"); { OUT( c.scard("set_a") ); } test("smove"); { c.smove("set_a", "set_b", "B"); redis::client::string_set out; OUT(c.smembers("set_a", out)); output_set(out); out.clear(); OUT(c.smembers("set_b", out)); output_set( out ); } test("spop"); { OUT( c.scard("set_a") ); OUT( c.spop("set_a") ); OUT( c.scard("set_a") ); } test("srandmember"); { OUT( c.srandmember("set_a") ); } test("sinter"); { c.sadd("set_b", "C"); c.sadd("set_b", "F"); redis::client::string_vector keys; keys.push_back("set_a"); keys.push_back("set_b"); redis::client::string_set out; c.smembers("set_a", out); std::cout<<"set a: *******************"<<std::endl; output_set(out); out.clear(); c.smembers("set_b", out); std::cout<<"set b: *******************"<<std::endl; output_set(out); c.sinter(keys, out); output_set(out); } test("sinterstore"); { redis::client::string_vector keys; redis::client::string_set out; keys.push_back("set_a"); keys.push_back("set_b"); c.sinterstore("set_c", keys); c.smembers("set_c", out); output_set(out); } test("sunion & sunionstore"); { redis::client::string_vector keys; redis::client::string_set out; keys.push_back("set_a"); keys.push_back("set_b"); c.sunion(keys, out); output_set(out); out.clear(); c.sunionstore("set_d", keys); c.smembers("set_d", out); std::cout<<"set d: ****************"<<std::endl; output_set(out); } test("sdiff * sdiffstore"); { redis::client::string_vector keys; redis::client::string_set out; keys.push_back("set_a"); keys.push_back("set_b"); c.sdiff(keys, out); output_set(out); out.clear(); c.sdiffstore("set_e", keys); c.smembers("set_e", out); std::cout<<"set e: ****************"<<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); } }
相关文章推荐
- redis: sorted set数据类型与操作
- Redis----sorted set数据类型操作
- Redis的数据类型及操作(三):set类型
- NoSQL之Redis对set(集合)数据类型的操作之二
- Redis-Service.Stack.Redis对Redis基本数据类型String,List,Hash,Set,ZSet的操作
- Redis数据类型操作(四) —— Set
- 系统学习redis之六——redis数据类型之set数据类型及操作
- redis:set数据类型和操作
- Redis---set数据类型操作
- redis----set 类型数据操作指令简介
- 5.Redis学习-set数据类型操作
- NoSQL之Redis对set(集合)数据类型的操作之一
- Redis数据类型操作(五) —— Sorted Set
- Redis常用数据类型介绍、使用场景及其操作命令
- redis之常用数据类型操作
- Redis详解:sets数据类型及操作
- redis 基本数据类型及操作学习(二)
- 系统学习redis之三——redis数据类型之string类型及操作
- 系统学习redis之四——redis数据类型之hash类型及操作
- 五,redis数据类型-无序set