SylixOS下Redis编程实践

2023-11-09

1、Redis简介

    Redis是一个完全开源的key-value型数据库,其显著特点是基于内存操作,但是可以持久化到磁盘。相比较其他的数据库,Redis有着明显的优势,响应速度快和特性丰富是其明显的特点,其他的特点这里不一一赘述。

    Redis有非常丰富的shell命令可以进行操作,关于shell相关命令网上有很多资料,本次不作详解。

    关于Redis介绍和shell命令操作可以参考菜鸟教程和其他网上资料:

    1、http://www.runoob.com/redis/redis-tutorial.html

    2、《Redis命令参考手册完整版》

2、Redis移植

    网上介绍linux下移植Redis资料很多,在SylixOS下开发同样需要进行移植工作。本文介绍Redis的编程接口,关于移植细节不做详细介绍。

    SylixOS下使用Redis需要Redis-server程序和libredis.so库,在移植过程中会生成。在运行程序前需先运行redis-server,编译程序的时候要依赖libredis.so库。

3、相关接口介绍

   Redis支持丰富的shell命令操作,下面介绍 Redis相关编程接口的使用:

1、连接数据库

redisContext *redisConnect(const char *ip, int port);

    说明:该函数用来连接Redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379,IP为127.0.0.1,该函数返回一个结构体redisContext,接下来的操作基于这个返回值句柄进行操作。

2、执行命令

void *redisCommand(redisContext *c, const char *format, ...);

    说明:该函数执行相关redis库的命令,和Sqlite数据库类似,第一个参数为连接数据库时返回的redisContext,剩下的参数为变参,和printf函数类似。该返回值为void*,一般强制转换成为redisReply类型的进行进一步的处理,用返回值可判定函数的执行结果。

3、释放内存(执行命令时占用的内存)

void freeReplyObject(void *reply);

    说明:该函数释放redisCommand执行后返回的redisReply所占用的内存,执行命令后应及时释放。

4、释放内存(连接数据库时占用的内存)

void redisFree(redisContext *c);

    说明:释放redisConnect()所产生的连接,程序结束后应及时释放,防止内存泄漏。

    下面介绍一个重要的结构体,在使用redisCommand函数操作命令时,根据返回值进行相关操作(执行不同的命令,返回的内容不同,可以通过结构体获取所需的内容,譬如执行get命令时,结构体中char * str可以表示get后的value值):

/* This is the reply object returned by redisCommand() */
typedef struct redisReply {
    int type;                                   /* REDIS_REPLY_* */
    long long integer;                          /* The integer when type is REDIS_REPLY_INTEGER */
    int len;                                    /* Length of string */
    char *str;                                  /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
    size_t elements;                            /* number of elements, for REDIS_REPLY_ARRAY */
    struct redisReply **element;                /* elements vector for REDIS_REPLY_ARRAY */
} redisReply;


4、编程实例

      下面为redis的编程实例,实例中以时间戳为key值,构造一个数组为value,示例代码如下:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <string.h>
#include <assert.h>
#include <hiredis/hiredis.h>

redisContext* connect_redis ( void )
{
	redisContext* redisContext_tbox = redisConnect("127.0.0.1", 6379);
	if (redisContext_tbox->err) {
		redisFree(redisContext_tbox);
		printf("Connect to redisServer faile\n");
		return NULL;
	}
	printf("Connect to redisServer Success\n");
	return (redisContext_tbox);
}

int getLocalTime ( char *pcLocalTime )
{
	time_t      timep = 0;
	struct tm  *p     = NULL;

	time(&timep);
	p = localtime(&timep);                                               //取得当地时间
	sprintf(pcLocalTime,
		"%d%02d%02d%02d%02d%02d",
		(1900 + p->tm_year),
		(1 + p->tm_mon),
		p->tm_mday,
		p->tm_hour,
		p->tm_min,
		p->tm_sec);

	return (0);
}

int main (int argc, char **argv)
{
	int           i                 = 0;
	redisContext *redisContext_tbox = NULL;
	redisReply   *r                 = NULL;
	char          localtime[32]     = { 0 };
	char          data[9]           = { '1', '2', '3', '4', '5', '6', '7', '8', '\0' };

	redisContext_tbox = connect_redis();                       	   //和数据库服务器建立连接

	r = (redisReply*) redisCommand(redisContext_tbox, "select 0");     //切换 0 号数据库
	if ( NULL == r) {
		printf("Execut setex failure\n");
		redisFree(redisContext_tbox);
		return (-1);
	}
	freeReplyObject(r);

	for (i = 0; i < 5; i++) {
		sleep(2);
		getLocalTime(localtime); 				  //获得系统时间
		r = (redisReply*) redisCommand(redisContext_tbox, "set %s %s",
					       localtime,
					       data);	                 //添加数据到数据库,40S后删除
		if ( NULL == r) {
			printf("Execut setex failure\n");
			redisFree(redisContext_tbox);
			return (-1);
		}
		freeReplyObject(r);
		printf("set %s %s OK\n", localtime, data);
	}
	r = (redisReply*) redisCommand(redisContext_tbox, "dbsize");       //获取数据库大小
	if ( NULL == r) {
		printf("Execut get failure\n");
		redisFree(redisContext_tbox);
		return (-1);
	}
	printf("Succeed to execute dbsize,integer : %lld\n", r->integer);
	freeReplyObject(r);


	r = (redisReply*) redisCommand(redisContext_tbox, "select 1"); 		//切换 1 号数据库
	if ( NULL == r) {
		printf("Execut select failure\n");
		redisFree(redisContext_tbox);
		return (-1);
	}
	freeReplyObject(r);

	for (i = 0; i < 5; i++) {
		sleep(1);
		getLocalTime(localtime);          				 //获得系统时间

		r = (redisReply*) redisCommand(redisContext_tbox, "set %s %s",
				localtime, data); 				//添加数据到数据库,40S后删除
		if ( NULL == r) {
			printf("Execut setex failure\n");
			redisFree(redisContext_tbox);
			return (-1);
		}
		printf("set %s %s OK\n", localtime, data);
		freeReplyObject(r);
	}

	r = (redisReply*) redisCommand(redisContext_tbox, "dbsize");           //获取数据库大小
	if ( NULL == r) {
		printf("Execut get failure\n");
		redisFree(redisContext_tbox);
		return (-1);
	}
	printf("Succeed to execute dbsize, integer : %lld\n", r->integer);
	freeReplyObject(r);

	redisFree( redisContext_tbox);

	return (0);
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SylixOS下Redis编程实践 的相关文章

  • Hive 分区表

    Hive 分区表创建 hive gt CREATE TABLE t3 id int name string age int PARTITIONED BY Year INT Month INT ROW FORMAT DELIMITED FIE
  • 【NLP】第 1 章 语言处理和 Python

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Team Leader 究竟要不要写代码?

    今天浏览 Medium 看到一篇直接喊出 技术负责人 请停止写代码 的文章 晚间和家属一起坐火车 不禁一起围绕着这个话题进行了一番讨论 文章中说到 成为一个 Team Leader 最难的是要明白 你不再是一个真正的开发者 了 既编程又管理

随机推荐

  • 【面试经典150

    文章目录 写在前面 Tag 题目来源 题目解读 解题思路 方法一 原地操作 写在最后 写在前面 本专栏专注于分析与讲解 面试经典150 算法 两到三天更新一篇文章 欢迎催更 专栏内容以分析题目为主 并附带一些对于本题涉及到的数据结构等内容进
  • CMD设置代理 注册表设置IE代理

    法一 注册表reg 设置代理 开启代理 并 设置代理地址为127 0 0 1 8080 Windows Registry Editor Version 5 00 HKEY CURRENT USER Software Microsoft Wi
  • Vite的原理

    背景 这里的背景介绍会从与Vite紧密相关的两个概念的发展史说起 一个是JavaScript的模块化标准 另一个是前端构建工具 共存的模块化标准 为什么JavaScript会有多种共存的模块化标准 因为js在设计之初并没有模块化的概念 随着
  • 代码静态分析与安全检测工具COBOT

    COBOT是北大软件开发的软件代码静态分析与安全检测工具 COBOT支持10类1000余种编码规则检查 支持CWE 14类110余种语义缺陷 支持8类90余种常见的安全漏洞分析 COBOT通过度量分析能够检测包括圈复杂度 函数扇入扇出 注释
  • EMI滤波电路是由哪些元件组成的,一文看懂

    通常对于追求效率的电源来说 NTC热敏电阻几瓦的损耗始终会降低电源的转换效率 而且对于关机后在短时间内再次开机的情况 如果没有继电器 处于高温下的NTC热敏电阻将无法发挥正常作用 因此继电器与NTC在高端电源中往往是配套使用 以达到 鱼与熊
  • Macbook Pro M1芯片Python开发环境配置

    文章主要介绍M1 Mac新机器如何进行开发环境配置 由于在进行开发环境配置的时候 需要经常使用终端 而且新机器是没有配置homebrew的 后面一些操作不是很方便 所以本文将会对日常终端使用方面进行一些配置 丰富我们的终端样式和使用 文章大
  • Linux进阶_DNS服务和BIND之详解篇

    成功不易 加倍努力 1 名字解析介绍和DNS 1 1 DNS服务工作原理 1 2 DNS查询类型 1 3 名称服务器 1 4 解析类型 1 5 完整的查询请求经过的流程 2 DNS 服务相关概念和技术 2 1 DNS服务器的类型 2 2 区
  • Kafka学习资料全集,保证你从入门到精通

    1 Kafka架构和工作原理 https www jianshu com p aa4c6994687e 2 Prometheus Grafana kafka exporter监控kafka https blog csdn net an109
  • 【picodet 训练流程】

    picodet训练流程 一 Train 1 环境搭建 2 准备数据 2 1 数据位置 2 2 数据读取和标签读取 2 2 1yml 文件位置 2 2 2数据集路径文件生成 3 修改模型相应参数 3 1 参数文件位置 4 训练 二 Eval
  • window7系统中64位安装matalbR2009b后出现乱码的解决方案

    转自 http blog csdn net shaoguangleo archive 2010 11 29 6042194 aspx MATLAB 中默认的字体是 Monospaced 即等宽字体 这是一种非常适合用于显示程序源代码的字体
  • 使用Flex图表组件

    使用Flex图表组件 以图表或是图的方式显示数据的能力可以使得Flex程序用户的数据交互更为容易 与仅显示简单的数字数据表不同 我们可以显示条状图 饼图 线图或是其他类型的图表 并且可以使用颜色 标题以及二维图形来表示我们的数据 在这一部分
  • 求矢量夹角

    由点乘计算角度 由叉乘计算正负 点乘公式 a b a b cos
  • VQ-VAE

    Generating Diverse High Fidelity Images with VQ VAE 2 摘要 本文主要研究VQ VAE在大尺度图像生成器上的应用 我们改进了自回归的先验来生成比以前更加优秀的图片 本文使用的是简单的编码和
  • springbboot的默认缓存方案:@Cacheable@CachePut@CacheEvict

    Spring Boot 默认使用的缓存方案是基于 Spring Framework 的缓存抽象 在 Spring Boot 中 你可以使用 Cacheable CachePut 和 CacheEvict 注解来实现缓存功能 Cacheabl
  • Bugkuctf--逆向第三题游戏过关题解

    题目链接 https ctf bugku com challenges 先让我们来打开文件 既然题目都说是游戏过关了 那就玩玩这个游戏呗 雾 游戏还是很简单的 但显然这道题应该用逆向的思维来做 废话 正式部分 逆向的题拿到手一般能考虑的工具
  • 行走在前端路上

    从今天起开始写一写实际项目中遇到的各种前端问题 希望对自己和和小伙伴们都能起到一定的帮助作用
  • 架构师必须了解的 5 种最佳软件架构模式

    世界变得越来越依赖软件 软件系统已经渗透到了人类生活的方方面面 并带来了很多便利 从移动应用 用于和人联系 到医疗应用和深度学习模型 到金融技术系统 再到智能建筑 利用技术来自动化许多功能 为了提供所需的解决方案并获得最佳效果 必须使用恰当
  • Qt 疑云解答

    一 qt的mianwindow处不能布局 我们在mainwindow中添加2个控件 pushButton和pushButton 2 QWidget centerWindow new QWidget this this is point to
  • Hashmap扩容方法机制原理

    Hashmap扩容方法 机制原理 1 7版本 数组额定容量为16 元素数量超过负载因子 一般为0 75 后会扩容至原有数组大小 2 遍历老数组每个位置上的链表每个元素 取每个元素的key根据链表长度计算出在新数组中的下表 将元素添加到新数组
  • SylixOS下Redis编程实践

    1 Redis简介 Redis是一个完全开源的key value型数据库 其显著特点是基于内存操作 但是可以持久化到磁盘 相比较其他的数据库 Redis有着明显的优势 响应速度快和特性丰富是其明显的特点 其他的特点这里不一一赘述 Redis