hiredis+vs2019+c++redis各种数据类型演示

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

  1. 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;
}
  1. 运行前先运行redis-server

  1. 执行结果:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天生_13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值