【实战】使用hiredis 时怎么解决返回的查询结果和对象释放的问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 解决内存安全之后的运行结果,get 获取的value正常传出:

首先贴出运行结果:

未解决内存安全的运行结果,get获取的value 失效:


g++ -Wall -Wextra -g -o redis_example redis_svr.cxx -L/usr/local/lib -lhiredis -Wl,-rpath=/usr/local/lib
[zryTest@master redis_test]$ ./redis_example 
SET: OK
GET: value1
GET:  �
Value:  �
DEL: 1
SET: OK
EXPIRE: 1


解决内存安全之后的运行结果,get 获取的value正常传出:


[zryTest@master redis_test]$ make all
g++ -Wall -Wextra -g -o redis_example redis_svr.cxx -L/usr/local/lib -lhiredis -Wl,-rpath=/usr/local/lib
[zryTest@master redis_test]$ ./redis_example 
SET: OK
GET: value1
GET: value1
Value: value1
DEL: 1
SET: OK
EXPIRE: 1
[zryTest@master redis_test]$


涉及到的部分代码:(修改后正确的)


class
{
    .......
    const char *get(const char *key)
    {
        redisReply *reply = (redisReply *)redisCommand(c, "GET %s", key);
        // printf("GET: %s\n", reply->str);
        const char *value = NULL;
        if (reply != NULL && reply->type == REDIS_REPLY_STRING)
        {
            value = strdup(reply->str);
            printf("GET: %s\n", value);
        }
        else
        {
            printf("GET: NULL\n");
        }
        return value;
    }
    .......
}


注意:不同于set 接口,使用redisReply对象接收 redisCommand的返回结果时,只是OK 这样的信息。

使用 get 接口时,我们要将返回结果传出,同时还要清理释放redisReply对象,如果直接使用return 时返回指针。由于经过了freeReplyObject的清理,此时指针指向空间已经被污染了。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
9月前
|
存储 编译器 C语言
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
795 3
|
9月前
|
缓存 Python
给我一些具体的例子,说明如何在Python中使用缓存和释放来避免内存溢出。
给我一些具体的例子,说明如何在Python中使用缓存和释放来避免内存溢出。
50 0
|
6月前
|
Go 数据库 UED
[go 面试] 同步与异步:程序执行方式的不同之处
[go 面试] 同步与异步:程序执行方式的不同之处
|
7月前
|
存储 固态存储 Serverless
函数计算操作报错合集之创建云函数并设置代码从Bucket获取时,返回403错误,该如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
8月前
|
监控 Serverless 文件存储
函数计算操作报错合集之启动服务时候超时,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
8月前
|
NoSQL Redis C语言
[hiredis 的Redis执行语句返回结果类型全说明
[hiredis 的Redis执行语句返回结果类型全说明
86 1
|
8月前
|
监控 前端开发 Java
函数计算操作报错合集之报错CAExited,该如何处理
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
125 0
|
8月前
|
监控 并行计算 Serverless
函数计算操作报错合集之遇到“ResourceThrottled”错误,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
9月前
|
弹性计算 前端开发 Serverless
Serverless 应用引擎操作报错合集之在阿里云函数计算中,调用了FC函数但是没有执行或者报错,并且在FC函数后台也看不到调用记录日志如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
113 5
|
9月前
|
Java Spring 容器
面试题:怎样为组件在创建的时候指定执行一个函数,在销毁的时候也先执行一个函数
面试题:怎样为组件在创建的时候指定执行一个函数,在销毁的时候也先执行一个函数
66 0