目录
一,安装Redis库
实际应用中很少会直接使用主机登录redis客户端使用指令操作。通常都是使用语言的 Redis 客户端。这里就需要安装redis的库和对应的头文件。
C++操作redis的库有很多,这里使用 redis-plus-plus 库。这个库功能强大,使用简单。安装时,可以使用游戏加速器 watt tool 加速安装。
redis-plus-plus库是基于 hiredis 实现的(hiredis是一个C语言实现的redis客户端),因此需要先安装 hiredis。这里也可以直接使用包管理器安装即可,下面以Ubuntu系统为例说明:
方法一:系统资源管理器安装
apt install libhiredis-dev
方法二:GitHub克隆安装
git clone https://github.com/redis/hiredis.git
cd hiredis
make
make install # 将库文件和头文件安装到系统默认的路径
redis-plus-plus正文库安装如下:
git clone https://github.com/sewenew/redis-plus-plus.git
cd redis-plus-plus
mkdir build
cd build
cmake ..
make
make install
二,Redis的运用
下面来使用redis进行增删查改。
1,string类型
增:set、mset 删:del 查:get mget scan exists 改:setrange
#include <iostream>
#include <vector>
#include <string>
#include <chrono>
#include <sw/redis++/redis++.h>
using std::cout;
using std::endl;
using sw::redis::Redis;
void Create(Redis& redis) {
redis.flushdb();
cout << "Create操作: set和mset" << endl;
redis.set("key1", "111");
redis.set("key", "value", std::chrono::seconds(10)); // 设置set超时时间10秒
redis.mset({"key2", "2", "key3", "3"});
}
void Delete(Redis& redis) {
cout << "Delete操作: del" << endl;
long long count = redis.del("key3");
long long isExists = redis.exists("key3");
if (isExists == 0) {
cout << "redis.del(key3)成功" << endl;
}
}
void Read(Redis& redis) {
cout << "Read操作: get mget scan" << endl;
auto value = redis.get("key1");
if (value) {
cout << "get操作,key1: " << value.value() << std::endl;
} else {
cout << "key1不存在" << endl;
}
std::vector<std::string> results;
redis.mget({"key1", "key2"}, std::back_inserter(results));
cout << "mget操作: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
results.clear();
long long cursor = 0;
redis.scan(cursor, "*", 10, std::back_inserter(results));
cout << "scan: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
}
void Update(Redis& redis) {
cout << "Update操作: setrange" << endl;
redis.set("k", "value123");
int n = redis.strlen("k");
if (n > 2) {
redis.setrange("k", 2, "987");
auto value = redis.get("k");
if (value) {
cout << "k: " << value.value() << endl;
} else {
cout << "k不存在" << endl;
}
}
}
void Clean(Redis& redis) {
redis.flushdb();
}
// 增删查改接口:set mset del exists get mget scan setrange strlen
// 查询多个结果基本都是使用插入迭代器往容器里存放
int main()
{
Redis redis("tcp://127.0.0.1:6379");
Clean(redis);
Create(redis);
Delete(redis);
Read(redis);
Update(redis);
return 0;
}
2,hash类型
增:hget 删:del hdel 查:hget hmget hscan hexists 改:hset
#include <iostream>
#include <vector>
#include <string>
#include <sw/redis++/redis++.h>
using std::cout;
using std::endl;
using sw::redis::Redis;
void Create(Redis& redis) {
cout << "Create: hget" << endl;
redis.hset("key1", "hash1", "value1");
redis.hset("key2", std::make_pair("hash2", "value2"));
redis.hset("key3", std::make_pair("hash3", "value3"));
redis.hset("key", {std::make_pair("hash7", "value7"),
std::make_pair("hash4", "value4"),
std::make_pair("hash5", "value5"),
std::make_pair("hash6", "value6")});
}
void Delete(Redis& redis) {
cout << "Delete: del和hdel" << endl;
redis.del("key3");
redis.hdel("key", {"hash6", "hash7"});
}
void Read(Redis& redis) {
cout << "Read: hget hmget hscan hexists" << endl;
auto value = redis.hget("key1", "hash1");
if (value) {
cout << "hget,key1->hash1: " << value.value() << endl;
} else {
cout << "hget error" << endl;
}
std::vector<std::string> results;
redis.hmget("key", {"hash4", "hash5"}, std::back_inserter(results));
cout << "hmget: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
results.clear();
redis.hscan("key", 0, std::back_inserter(results));
cout << "hscan: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
bool isExists = redis.hexists("key1", "hash1");
if (isExists) {
cout << "key1存在" << endl;
} else {
cout << "key1不存在" << endl;
}
}
void Update(Redis& redis) {
cout << "Update: hset" << endl;
redis.hset("key1", "hash1", "v123456");
auto result = redis.hget("key1", "hash1");
if (result) {
cout << "key1->hash1: " << result.value() << endl;
} else {
cout << "key1->hash1不存在" << endl;
}
}
void Clean(Redis& redis) {
redis.flushdb();
}
// 前缀 +h 的基本都是针对值(哈希表类型)里的具体某个元素
int main()
{
Redis redis("tcp://127.0.0.1:6379");
Clean(redis);
Create(redis);
Delete(redis);
Read(redis);
Update(redis);
return 0;
}
3,list类型
增:lpush/rpush linsert 删:lpop/rpop lrem 查:lrange lindex 改:lset
#include <iostream>
#include <vector>
#include <string>
#include <sw/redis++/redis++.h>
using std::cout;
using std::endl;
using sw::redis::Redis;
void Create(Redis& redis) {
cout << "Create: lpush/rpush linsert" << endl;
redis.lpush("key1", "v1");
redis.rpush("key1", "v2");
redis.rpush("key1", "v1");
redis.linsert("ke1y", sw::redis::InsertPosition::AFTER, "v1", "v3");
}
void Delete(Redis& redis) {
cout << "Delete: lpop/rpop lrem" << endl;
auto result = redis.lpop("key1");
if (result) {
cout << "lpop: key1" << endl;
}
redis.rpush("key1", "v1");
redis.rpush("key1", "v1");
redis.lrem("key1", 2, "v1");
}
void Read(Redis& redis) {
cout << "Read: lrange lindex" << endl;
std::vector<std::string> results;
redis.lrange("key1", 0, -1, std::back_inserter(results));
int end = redis.llen("key1") - 1;
auto result = redis.lindex("key1", end);
if (result) {
cout << "key1最后一个元素: " << result.value() << endl;
} else {
cout << "lindex error" << endl;
}
}
void Update(Redis& redis) {
cout << "Update: lset" << endl;
int end = redis.llen("key1") - 1;
if (end >= 0) {
redis.lset("key1", end, "end123");
std::vector<std::string> results;
redis.lrange("key1", 0, -1, std::back_inserter(results));
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
}
}
void Clean(Redis& redis) {
redis.flushdb();
}
// lpush/rpush linsert lpop/rpop lrem lrange lindex lset
int main()
{
Redis redis("tcp://127.0.0.1:6379");
Clean(redis);
Create(redis);
Delete(redis);
Read(redis);
Update(redis);
return 0;
}
4,set类型
增:sadd 删:spop srem 查:srandmember sscan sismember scard
注意,set元素不能重复,元素无序,不支持改操作。set是一种无序集合类型。
#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <sw/redis++/redis++.h>
using std::cout;
using std::endl;
using sw::redis::Redis;
void Create(Redis& redis) {
cout << "Create: sadd" << endl;
redis.sadd("key", {"v1", "v2", "v3", "v4"});
redis.sadd("key", "v1"); // 返回0,set元素不能重复
}
void Delete(Redis& redis) {
cout << "Delete: spop srem" << endl;
std::vector<std::string> results;
redis.spop("key", 2, std::back_inserter(results));
cout << "spop key: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
redis.sadd("key", {"v5", "v6", "v7", "v8"});
redis.srem("key", {"v8", "v7"});
}
void Read(Redis& redis) {
cout << "Read: srandmember sscan sismember" << endl;
std::vector<std::string> results;
redis.srandmember("key", 2, std::back_inserter(results));
cout << "srandmember: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
int cursor = 0;
results.clear();
cursor = redis.sscan("key", cursor, std::back_inserter(results));
while (cursor) {
cursor = redis.sscan("key", cursor, std::back_inserter(results));
}
cout << "sscan: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
bool isExists = redis.sismember("key", "v5");
int count = redis.scard("key");
cout << "key nums: " << count << endl;
}
void Clean(Redis& redis) {
redis.flushdb();
}
// set元素不能重复,元素无序,不支持改操作
int main()
{
Redis redis("tcp://127.0.0.1:6379");
Clean(redis);
Create(redis);
Delete(redis);
Read(redis);
return 0;
}
5,zset类型
增:zadd 删:zrem 查:zremrangebyscore zrang/zrevange zscore zscan zrangebyscore
注意:zset与set不同的是,zset是有序集合。
#include <iostream>
#include <vector>
#include <string>
#include <sw/redis++/redis++.h>
using std::cout;
using std::endl;
using sw::redis::Redis;
void Create(Redis& redis) {
cout << "Create: zadd" << endl;
redis.zadd("zkey", {
std::make_pair("v1", 12), std::make_pair("v2", 2),
std::make_pair("v3", 14),std::make_pair("v4", 8),
std::make_pair("v5", 16), std::make_pair("v6", 6)
});
}
void Delete(Redis& redis) {
cout << "Delete: zrem" << endl;
int count = redis.zrem("zkey", {"v2", "v4"});
cout << "zrem(v2 v4): " << count << endl;
}
void Read(Redis& redis) {
cout << "Read: zrang/zrevange zscan zrangebyscore zscore zcard" << endl;
// zrange升序,zrevange降序
std::vector<std::string> results;
int end = redis.zcard("zkey") - 1;
redis.zrange("zkey", 0, end, std::back_inserter(results));
cout << "zkey: ";
for (auto& e : results) {
cout << e << " ";
}
cout << endl;
results.clear();
int cursor = 0;
redis.zscan("zkey", cursor, std::back_inserter(results));
redis.zscore("zkey", "v6");
}
void Clean(Redis& redis) {
redis.flushdb();
}
int main()
{
Redis redis("tcp://127.0.0.1:6379");
Clean(redis);
Create(redis);
Delete(redis);
Read(redis);
return 0;
}