【Redis存储】Redis客户端

目录

一,安装Redis库

二,Redis的运用


一,安装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;

}

相关推荐
独泪了无痕2 小时前
通过Homebrew安装Redis指南
数据库·redis·缓存
数据知道2 小时前
PostgreSQL:如何把PostgreSQL变成时序数据库(TimescaleDB)
数据库·postgresql·时序数据库
curry____3032 小时前
c++位运算符笔记
java·c++·笔记
崎岖Qiu2 小时前
【MySQL | 第11篇】一条SQL查询语句的执行全流程简析
数据库·后端·sql·mysql
Hx_Ma163 小时前
测试题(一)
java
w***29853 小时前
Knife4j文档请求异常(基于SpringBoot3,查找原因并解决)
java·服务器·数据库
yaoxin5211234 小时前
325. Java Stream API - 理解 Collector 的三大特性:助力流处理优化
java·开发语言
RFG201210 小时前
20、详解Dubbo框架:消费方如何动态获取服务提供方地址?【微服务架构入门】
java·人工智能·后端·微服务·云原生·架构·dubbo
砚边数影10 小时前
运营商网管系统重构:如何解决海量投诉数据下的“查询延迟”与“写入瓶颈”?
网络·数据库·时序数据库·kingbase·kingbasees·数据库平替用金仓·金仓数据库