Redis 客户端接口介绍
一、使用环境
Redis 有自己的应用层协议,用于实现客户端开发
这里用的是第三方库 redis-plus-plus:https://github.com/sewenew/redis-plus-plus
二、通用命令介绍
1、get set
void test1(Redis& redis)
{cout << "get和set的使用:" << endl;// 清空数据库redis.flushall();redis.set("k1", "111");redis.set("k2", "222");redis.set("k3", "333");auto val1 = redis.get("k1");auto val2 = redis.get("k2");auto val3 = redis.get("k3");auto val4 = redis.get("k4");// 返回值是optional_string,要拿到string类型使用函数value()cout << val1.value() << endl;cout << val2.value() << endl;cout << val3.value() << endl;if(val4)// 没有k4抛异常cout << val4.value() << endl;
}
2、exists
void test2(Redis& redis)
{cout << "exists的使用:" << endl;redis.flushall();redis.set("key", "111");auto ret = redis.exists("key");cout << ret << endl;ret = redis.exists("key2");cout << ret << endl;// 通过初始化列表添加多个keyret = redis.exists({"key", "key1", "key2"});cout << ret << endl;
}
3、del
void test3(Redis& redis)
{cout << "del的使用:" << endl;redis.flushall();redis.set("k1", "111");redis.set("k2", "222");redis.set("k3", "333");redis.del("k1");auto ret = redis.exists("k1");cout << "k1: " << ret << endl;ret = redis.exists("k2");cout << "k2: " << ret << endl;ret = redis.exists("k3");cout << "k3: " << ret << endl;
}
4、keys
void test4(Redis& redis)
{cout << "keys的使用:" << endl;redis.flushall();redis.set("k1", "111");redis.set("k2", "222");redis.set("k3", "333");redis.set("k4", "444");redis.set("k5", "555");redis.set("k6", "666");// 第一个参数是pattern// 第二个参数是插入迭代器,用于存储keys的获取结果vector<string> ret;auto it = back_inserter(ret); // 构造std插入迭代器,向容器末尾插入redis.keys("*", it);Print(ret);
}
5、expire ttl
void test5(Redis& redis)
{using namespace std::chrono_literals;cout << "expire和ttl的使用:" << endl;redis.flushall();redis.set("key", "111");redis.expire("key", chrono::seconds(10));// 字面值常量this_thread::sleep_for(3s);auto time = redis.ttl("key");cout << time << endl;
}
6、type
void test6(Redis& redis)
{cout << "type的使用:" << endl;redis.flushall();redis.set("key1", "111");string ret = redis.type("key1");cout << ret << endl; redis.lpush("key2", "222");ret = redis.type("key2");cout << ret << endl; redis.hset("key3", "333", "aaa");ret = redis.type("key3");cout << ret << endl; redis.sadd("key4", "aaa");ret = redis.type("key4");cout << ret << endl; redis.zadd("key5", "aaa", 100);ret = redis.type("key5");cout << ret << endl;
}
三、string 命令介绍
1、get set
void test1(Redis& redis)
{cout << "get和set使用:" << endl;redis.flushall();redis.set("key1", "111");auto val = redis.get("key1");cout << val.value() << endl;redis.set("key2", "222");val = redis.get("key2");cout << val.value() << endl;
}
2、set 设置过期时间
void test2(Redis& redis)
{cout << "set过期时间使用:" << endl;redis.flushall();redis.set("key", "111", std::chrono::seconds(10));auto time = redis.ttl("key");cout << time << endl;
}
3、nx xx
void test3(Redis& redis)
{cout << "set的nx xx使用:" << endl;redis.flushall();// sw::redis::UpdateType里面有ALWAYS(总是设置和更新) EXIST(存在才更新xx) NOT_WXIST(不存在才设置nx) redis.set("k1", "111", 0s, sw::redis::UpdateType::NOT_EXIST);auto val1 = redis.get("k1");redis.set("k2", "222", 0s, sw::redis::UpdateType::EXIST);auto val2 = redis.get("k2");// 结果应该是k1存在,k2不存在if(val1)cout << "val1: " << val1.value() << endl;else cout << "k1不存在" << endl;if(val2)cout << "val2: " << val2.value() << endl;else cout << "k2不存在" << endl;
}
4、mget mset
void test4(Redis& redis)
{cout << "mget和mset使用:" << endl;redis.flushall();// 1.初始化列表设置多个key valueredis.mset({make_pair("k1", "111"), make_pair("k2", "222"), make_pair("k3", "333"), make_pair("k4", "444")});// 2.容器迭代器方式设置// vector<pair<string, string>> keys = {// {"k1", "111"}, // {"k2", "222"}, // {"k3", "333"}, // {"k4", "444"}// };// redis.mset(keys.begin(), keys.end());// 用容器存储mget的结果vector<sw::redis::OptionalString> ret;auto it = std::back_inserter(ret);// 初始化列表redis.mget({"k1", "k2", "k3", "k4", "k5"}, it);PrintOp(ret);
}
5、getrange setrange
void test5(Redis& redis)
{cout << "getrange setrange使用:" << endl;redis.flushall();redis.set("key", "fhasdjdgkndfg");string ret = redis.getrange("key", 2, 5);cout << ret << endl;redis.setrange("key", 2, "ghd");auto str = redis.get("key");cout << str.value() << endl;
}
6、incr decr
void test6(Redis& redis)
{cout << "incr decr使用:" << endl;redis.flushall();redis.set("key", "111");auto ret = redis.incr("key");cout << ret << endl;auto val = redis.get("key");cout << val.value() << endl;ret = redis.decr("key");cout << ret << endl;val = redis.get("key");cout << val.value() << endl;
}
四、list 命令介绍
1、lpush lrange
void test1(Redis& redis)
{cout << "lpush lrange使用:" << endl;redis.flushall();redis.lpush("key", "111");redis.lpush("key", {"222", "333", "444"});vector<string> vals = {"555", "666"};redis.lpush("key", vals.begin(), vals.end());vector<string> ret;auto it = std::back_inserter(ret);redis.lrange("key", 0, -1, it);Print(ret);
}
2、rpush
void test2(Redis& redis)
{cout << "rpush使用:" << endl;redis.flushall();redis.rpush("key", "111");redis.rpush("key", {"222", "333", "444"});vector<string> vals = {"555", "666"};redis.rpush("key", vals.begin(), vals.end());vector<string> ret;auto it = std::back_inserter(ret);redis.lrange("key", 0, -1, it);Print(ret);
}
3、lpop rpop
void test3(Redis& redis)
{cout << "lpop rpop使用:" << endl;redis.flushall();redis.rpush("key", {"111", "222", "333", "444"});auto ret = redis.lpop("key");if(ret)cout << "lpop: " << ret.value() << endl;ret = redis.rpop("key");if(ret)cout << "rpop: " << ret.value() << endl;
}
4、blpop brpop
void test4(Redis& redis)
{cout << "blpop使用:" << endl;redis.flushall();auto ret = redis.blpop("key");if(ret){cout << "key: " << ret.value().first << endl;cout << "elem: " << ret.value().second << endl;}else cout << "ret无效" << endl;}
没有数据阻塞中
5、llen
void test5(Redis& redis)
{cout << "llen使用:" << endl;redis.flushall();redis.rpush("key", {"111", "222", "333", "444"});auto len = redis.llen("key");cout << len << endl;
}
五、hash 命令介绍
1、hset hget
void test1(Redis& redis)
{cout << "hset hget使用:" << endl;redis.flushall();redis.hset("key", "f1", "111");redis.hset("key", make_pair("f2", "222"));redis.hset("key", {make_pair("f3", "333"),make_pair("f4", "444")});vector<pair<string, string>> vals = {make_pair("f5", "555"),make_pair("f6", "666")};redis.hset("key", vals.begin(), vals.end());auto ret = redis.hget("key", "f1");if(ret)cout << ret.value() << endl;else cout << "field无效" << endl;
}
2、hexists
void test2(Redis& redis)
{cout << "hexists使用:" << endl;redis.flushall();redis.hset("key", "f1", "111");redis.hset("key", "f2", "222");redis.hset("key", "f3", "333");bool ret1 = redis.hexists("key", "f1");bool ret4 = redis.hexists("key", "f4");cout << ret1 << endl << ret4 << endl;
}
3、hdel
void test3(Redis& redis)
{cout << "hdel使用:" << endl;redis.flushall();redis.hset("key", "f1", "111");redis.hset("key", "f2", "222");redis.hset("key", "f3", "333");auto ret = redis.hdel("key", "f1");cout << ret << endl;ret = redis.hdel("key", {"f2", "f3"});cout << ret << endl;auto len = redis.hlen("key");cout << len << endl;
}
4、hkeys hvals
void test4(Redis& redis)
{cout << "hkeys hvals使用:" << endl;redis.flushall();redis.hset("key", "f1", "111");redis.hset("key", "f2", "222");redis.hset("key", "f3", "333");vector<string> ret;auto it = back_inserter(ret);redis.hkeys("key", it);Print(ret);vector<string> ret2;auto it2 = back_inserter(ret2);redis.hvals("key", it2);Print(ret2);
}
5、hmget hmset
void test5(Redis& redis)
{cout << "hmget hmset使用:" << endl;redis.flushall();redis.hmset("key", {make_pair("f1", "111"),make_pair("f2", "222"),make_pair("f3", "333")});vector<std::pair<string, string>> pairs = {make_pair("f4", "444"),make_pair("f5", "555"),make_pair("f6", "666")};redis.hmset("key", pairs.begin(), pairs.end());vector<string> vals;auto it = std::back_inserter(vals);redis.hmget("key", {"f1", "f2", "f3"}, it);Print(vals);
}
六、set 命令介绍
1、sadd smembers
void test1(Redis& redis)
{cout << "sadd smembers使用:" << endl;redis.flushall();redis.sadd("key", "111");redis.sadd("key", {"222", "333", "444"});set<string> vals = {"555", "666"};redis.sadd("key", vals.begin(), vals.end());// vector<string> ret;// auto it = std::back_inserter(ret);// setset<string> ret;auto it = std::inserter(ret, ret.end());redis.smembers("key", it);Print(ret);
}
2、sismember
void test2(Redis& redis)
{cout << "sismember使用:" << endl;redis.flushall();redis.sadd("key", {"111", "222", "333"});bool ret1 = redis.sismember("key", "111");bool ret4 = redis.sismember("key", "444");cout << ret1 << endl << ret4 << endl;
}
3、scard
void test3(Redis& redis)
{cout << "scard使用:" << endl;redis.flushall();redis.sadd("key", {"111", "222", "333"});auto ret = redis.scard("key");cout << ret << endl;
}
4、spop
void test4(Redis& redis)
{cout << "spop使用:" << endl;redis.flushall();redis.sadd("key", {"111", "222", "333", "444"});auto ret = redis.spop("key");if(ret)cout << "spop: " << ret.value() << endl;else cout << "set空" << endl;
}
5、sinter
void test5(Redis& redis)
{cout << "sinter使用:" << endl;redis.flushall();redis.sadd("key1", {"111", "222", "444"});redis.sadd("key2", {"111", "333"});set<string> ret;auto it = std::inserter(ret, ret.end());redis.sinter({"key1", "key2"}, it);Print(ret);
}
6、sinterstore
void test6(Redis& redis)
{cout << "sinterstore使用:" << endl;redis.flushall();redis.sadd("key1", {"111", "222", "444"});redis.sadd("key2", {"111", "333"});auto len = redis.sinterstore("key3", {"key1", "key2"});cout << len << endl;set<string> ret;auto it = std::inserter(ret, ret.end());redis.smembers("key3", it);Print(ret);
}
七、zset 命令介绍
1、zadd zrange
void test1(Redis& redis)
{cout << "zadd zrange使用:" << endl;redis.flushall();redis.zadd("key", "吕布", 99.5);redis.zadd("key", {make_pair("关羽", 75),make_pair("张飞", 95)});vector<pair<string, double>> members = {make_pair("刘备", 68),make_pair("赵云", 74.8)};redis.zadd("key", members.begin(), members.end());// zrange 支持两种主要的风格:// 1. 只查询 member, 不带 score// 2. 查询 member 同时带 score// 关键就是看插入迭代器指向的容器的类型. // 指向的容器只是包含一个 string, 就是只查询 member// 指向的容器包含的是一个 pair, 里面有 string 和 double, 就是查询 member 同时带有 scorevector<string> mems;auto it1 = std::back_inserter(mems);redis.zrange("key", 0, -1, it1);Print(mems);vector<pair<string, double>> vals;auto it2 = std::back_inserter(vals);redis.zrange("key", 0, -1, it2);PrintPair(vals);
}
2、zcard
void test2(Redis& redis)
{cout << "zcard使用:" << endl;redis.flushall();redis.zadd("key", "zhangsan", 90);redis.zadd("key", "lisi", 91);redis.zadd("key", "wangwu", 92);redis.zadd("key", "zhaoliu", 93);long long result = redis.zcard("key");cout << "result: " << result << endl;
}
3、zrem
void test3(Redis& redis)
{cout << "zrem使用:" << endl;redis.flushall();redis.zadd("key", "zhangsan", 90);redis.zadd("key", "lisi", 91);redis.zadd("key", "wangwu", 92);redis.zadd("key", "zhaoliu", 93);redis.zrem("key", "zhangsan");long long result = redis.zcard("key");cout << "result: " << result << endl;
}
4、zscore
void test4(Redis& redis) {cout << "zscore" << endl;redis.flushall();redis.zadd("key", "zhangsan", 90);redis.zadd("key", "lisi", 91);redis.zadd("key", "wangwu", 92);redis.zadd("key", "zhaoliu", 93);auto score = redis.zscore("key", "zhangsan");if (score) cout << "score: " << score.value() << endl; else cout << "score 无效" << endl;
}
5、zrank
void test5(Redis& redis) {cout << "zrank" << endl;redis.flushall();redis.zadd("key", "zhangsan", 90);redis.zadd("key", "lisi", 91);redis.zadd("key", "wangwu", 92);redis.zadd("key", "zhaoliu", 93);auto rank = redis.zrank("key", "zhaoliu");if (rank) cout << "rank: " << rank.value() << endl;else cout << "rank 无效" << endl;}