1.Github下载hiredis源码
源码地址:https://github.com/redis/hiredis
下载后在文件夹下新建build目录cd 进入
然后打开cmd进入build目录下,执行代码:
cmake .. -G "Visual Studio 16 2019" -DCMAKE_INSTALL_PREFIX=G:\TIANSHENG\研究生\C++学习\学习ing\六个C++项目打包送给你\redis\hiredis-master\build -DYAML_BUILD_SHARED_LIBS=ON ..
打开.sln文件,生成库文件
2.新建vs2019空项目
在项目->属性->包含目录下加入头文件目录
在项目->链接器->输入填入:hiredisd.lib
redis_test.cpp
#include <iostream>
#include <cstring>
#include "hiredis.h"
#include "head.h"
using namespace std;
Redis* redis = new Redis();
redisContext* c = nullptr;
int test() {
if (!redis->connect("127.0.0.1", 6379))
{
printf("connect error!\n");
return 0;
}
redis->set("name", "tiansheng");
cout << "Get the name is " << redis->get("name") << endl;
redis->append("name", "12345");
cout << "Get the name is " << redis->get("name") << endl;
int len = redis->getlen("name");
std::cout << "STRLEN: " << len << std::endl;
delete redis;
return 0;
}
int connect_() {
c = redisConnect("127.0.0.1", 6379); // 连接Redis
if (c == nullptr || c->err) {
if (c) {
std::cout << "Error: " << c->errstr << std::endl;
redisFree(c);
}
else {
std::cout << "Error: can't allocate redis context" << std::endl;
}
return 1;
}
std::cout << "Connected to Redis" << std::endl;
}
int list() {
// LPUSH key element1 element2 ...
const char* key = "list";
const char* elements[] = { "apple", "banana", "orange" };
size_t elementCount = sizeof(elements) / sizeof(elements[0]);
for (size_t i = 0; i < elementCount; i++) {
redisReply* reply = (redisReply*)redisCommand(c, "LPUSH %s %s", key, elements[i]); // 左插入元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "LPUSH: " << reply->integer << std::endl;
freeReplyObject(reply);
}
}
// LLEN key
redisReply* reply = (redisReply*)redisCommand(c, "LLEN %s", key); // 获取列表长度
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "LLEN: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// LRANGE key start stop
reply = (redisReply*)redisCommand(c, "LRANGE %s %d %d", key, 0, elementCount - 1); // 获取列表中的所有元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_ARRAY) {
std::cout << "LRANGE: ";
for (size_t i = 0; i < reply->elements; i++) {
std::cout << reply->element[i]->str << " ";
}
std::cout << std::endl;
freeReplyObject(reply);
}
// LINDEX key index
reply = (redisReply*)redisCommand(c, "LINDEX %s %d", key, 1); // 获取列表中指定位置的元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_STRING) {
std::cout << "LINDEX: " << reply->str << std::endl;
freeReplyObject(reply);
}
// LREM key count element
reply = (redisReply*)redisCommand(c, "LREM %s %d %s", key, 1, "apple"); // 从列表中移除指定元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "LREM: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// RPOP key
reply = (redisReply*)redisCommand(c, "RPOP %s", key); // 右弹出元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_STRING) {
std::cout << "RPOP: " << reply->str << std::endl;
freeReplyObject(reply);
}
return 0;
}
int stringg() {
// SET key value
const char* key = "name";
const char* value = "Tom";
redisReply* reply = (redisReply*)redisCommand(c, "SET %s %s", key, value); // 存储键值对
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "SET: " << reply->str << std::endl;
freeReplyObject(reply);
}
reply = (redisReply*)redisCommand(c, "PERSIST %s", key); // 将键的过期时间设置为永久
freeReplyObject(reply); // 释放 reply 对象
// GET key
reply = (redisReply*)redisCommand(c, "GET %s", key); // 获取键值对
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_STRING) {
std::cout << "GET: " << reply->str << std::endl;
freeReplyObject(reply);
}
// APPEND key value
const char* appendValue = " Smith";
reply = (redisReply*)redisCommand(c, "APPEND %s %s", key, appendValue); // 追加值
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "APPEND: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// STRLEN key
reply = (redisReply*)redisCommand(c, "STRLEN %s", key); // 获取字符串长度
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "STRLEN: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// INCR key
reply = (redisReply*)redisCommand(c, "INCR %s", "age"); // 自增1
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "INCR: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// DECRBY key decrement
reply = (redisReply*)redisCommand(c, "DECRBY %s %d", "age", 2); // 自减2
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "DECRBY: " << reply->integer << std::endl;
freeReplyObject(reply);
}
return 0;
}
int set() {
// SADD key member1 member2 ...
const char* key = "set";
const char* members[] = { "apple", "banana", "orange" };
size_t memberCount = sizeof(members) / sizeof(members[0]);
for (size_t i = 0; i < memberCount; i++) {
redisReply* reply = (redisReply*)redisCommand(c, "SADD %s %s", key, members[i]); // 添加元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "SADD: " << reply->integer << std::endl;
freeReplyObject(reply);
}
}
// SCARD key
redisReply* reply = (redisReply*)redisCommand(c, "SCARD %s", key); // 获取集合元素个数
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "SCARD: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// SMEMBERS key
reply = (redisReply*)redisCommand(c, "SMEMBERS %s", key); // 获取集合中的所有元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_ARRAY) {
std::cout << "SMEMBERS: ";
for (size_t i = 0; i < reply->elements; i++) {
std::cout << reply->element[i]->str << " ";
}
std::cout << std::endl;
freeReplyObject(reply);
}
// SISMEMBER key member
reply = (redisReply*)redisCommand(c, "SISMEMBER %s %s", key, "apple"); // 判断元素是否在集合中
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "SISMEMBER: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// SREM key member1 member2 ...
reply = (redisReply*)redisCommand(c, "SREM %s %s %s", key, "apple", "banana"); // 从集合中移除指定元素
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "SREM: " << reply->integer << std::endl;
freeReplyObject(reply);
}
return 0;
}
int hash_() {
// HSET key field value
const char* key = "hash";
const char* field = "name";
const char* value = "John";
redisReply* reply = (redisReply*)redisCommand(c, "HSET %s %s %s", key, field, value); // 设置Hash键值对
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "HSET: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// HMSET key field1 value1 field2 value2 ...
const char* fields[] = { "age", "gender" };
const char* values[] = { "25", "male" };
size_t fieldCount = sizeof(fields) / sizeof(fields[0]);
for (size_t i = 0; i < fieldCount; i++) {
redisAppendCommand(c, "HMSET %s %s %s", key, fields[i], values[i]); // 批量设置Hash键值对
}
for (size_t i = 0; i < fieldCount; i++) {
redisGetReply(c, (void**)&reply);
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "HMSET: " << reply->str << std::endl;
freeReplyObject(reply);
}
}
// HGET key field
reply = (redisReply*)redisCommand(c, "HGET %s %s", key, field); // 获取Hash键值对的值
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key or field not found" << std::endl;
freeReplyObject(reply);
}
else {
std::cout << "HGET: " << reply->str << std::endl;
freeReplyObject(reply);
}
// HMGET key field1 field2 ...
const char* queryFields[] = { "name", "age", "gender" };
size_t queryFieldCount = sizeof(queryFields) / sizeof(queryFields[0]);
reply = (redisReply*)redisCommand(c, "HMGET %s %s %s %s", key, queryFields[0], queryFields[1], queryFields[2]); // 批量获取Hash键值对的值
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_ARRAY) {
std::cout << "HMGET:";
for (size_t i = 0; i < queryFieldCount; i++) {
if (reply->element[i]->type == REDIS_REPLY_NIL) {
std::cout << " NULL";
}
else {
std::cout << " " << reply->element[i]->str;
}
}
std::cout << std::endl;
freeReplyObject(reply);
}
// HGETALL key
reply = (redisReply*)redisCommand(c, "HGETALL %s", key); // 获取Hash键值对的所有字段和值
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_ARRAY) {
std::cout << "HGETALL:";
for (size_t i = 0; i < reply->elements; i += 2) {
std::cout << " " << reply->element[i]->str << "=" << reply->element[i + 1]->str;
}
std::cout << std::endl;
freeReplyObject(reply);
}
// HDEL key field1 field2 ...
reply = (redisReply*)redisCommand(c, "HDEL %s %s %s", key, fields[0], fields[1]); // 删除Hash键值对的指定字段
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "HDEL: " << reply->integer << std::endl;
freeReplyObject(reply);
}
return 0;
}
int zset() {
// ZADD key score1 member1 score2 member2 ...
const char* key = "zset";
const char* members[] = { "John", "Tom", "Mary" };
double scores[] = { 1.0, 2.0, 3.0 };
size_t memberCount = sizeof(members) / sizeof(members[0]);
redisReply* reply = nullptr;
for (size_t i = 0; i < memberCount; i++) {
redisAppendCommand(c, "ZADD %s %f %s", key, scores[i], members[i]); // 添加zSet成员
}
for (size_t i = 0; i < memberCount; i++) {
redisGetReply(c, (void**)&reply);
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "ZADD: " << reply->integer << std::endl;
freeReplyObject(reply);
}
}
// ZRANGE key start stop [WITHSCORES]
reply = (redisReply*)redisCommand(c, "ZRANGE %s 0 -1 WITHSCORES", key); // 获取zSet成员列表
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key not found" << std::endl;
freeReplyObject(reply);
}
else if (reply->type == REDIS_REPLY_ARRAY) {
std::cout << "ZRANGE:";
for (size_t i = 0; i < reply->elements; i++) {
std::cout << " " << reply->element[i]->str;
if (i % 2 == 1) {
std::cout << "(" << reply->element[i - 1]->str << ")";
}
}
std::cout << std::endl;
freeReplyObject(reply);
}
// ZSCORE key member
const char* member = "John";
reply = (redisReply*)redisCommand(c, "ZSCORE %s %s", key, member); // 获取zSet成员的分值
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key or member not found" << std::endl;
freeReplyObject(reply);
}
else {
std::cout << "ZSCORE: " << reply->str << std::endl;
freeReplyObject(reply);
}
// ZINCRBY key increment member
reply = (redisReply*)redisCommand(c, "ZINCRBY %s 2.5 %s", key, member); // 对zSet成员的分值进行增量操作
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "ZINCRBY: " << reply->str << std::endl;
freeReplyObject(reply);
}
// ZRANK key member
reply = (redisReply*)redisCommand(c, "ZRANK %s %s", key, member); // 获取zSet成员的排名
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else if (reply->type == REDIS_REPLY_NIL) {
std::cout << "Key or member not found" << std::endl;
freeReplyObject(reply);
}
else {
std::cout << "ZRANK: " << reply->integer << std::endl;
freeReplyObject(reply);
}
// ZREM key member1 member2 ...
reply = (redisReply*)redisCommand(c, "ZREM %s %s %s", key, members[0], members[1]); // 删除zSet成员
if (reply == nullptr) {
std::cout << "Error: can't execute Redis command" << std::endl;
redisFree(c);
return 1;
}
else {
std::cout << "ZREM: " << reply->integer << std::endl;
freeReplyObject(reply);
}
redisFree(c); // 关闭Redis连接
return 0;
}
int main() {
connect_();
stringg();
set();
hash_();
zset();
return 0;
}
运行前先运行redis-server
执行结果: