数据库学习(MySQL & Redis)

目录

一、数据库简介

1.定义

2.分类

二、MySQL 与 Redis 区别、应用场景

三、MySQL安装与使用

1.安装步骤

2.常用命令

3.实例

四、Redis安装与使用

1.安装步骤

2.Redis入门知识

3.常用命令

4.Redis事务

5.乐观锁与悲观锁

6.实例


一、数据库简介

1.定义

数据库是指存储和管理大量数据的软件系统,它可以将数据以结构化的方式存储起来,方便用户进行查询、插入、更新和删除操作。

数据库服务器是指运行数据库软件的物理服务器或虚拟服务器。数据库服务器负责管理数据库的存储和访问,处理用户的请求,并提供数据的安全性和可靠性。它可以多用户同时访问数据库,并提供高性能和高可用性的服务。数据库服务器还可以提供其他功能,如备份和恢复、监控和性能调优等。

2.分类

常用的数据库有关系型数据库、非关系型数据库和内存数据库等。

  1. 关系型数据库:关系型数据库使用表格来组织和管理数据,表格中的数据以行和列的形式进行存储。关系型数据库采用结构化查询语言SQL来操作和管理数据。常见的关系型数据库有MySQL、Oracle、SQL Server等。它们适合存储结构化数据,具有严格的数据一致性、完整性和安全性。

  2. 非关系型数据库:非关系型数据库不使用表格来组织数据,而是使用其他数据模型,如键值对、文档、列族和图等。非关系型数据库通常具有较高的可扩展性和灵活性,在大数据和分布式系统中应用广泛。常见的非关系型数据库有MongoDB、Redis、Cassandra等。

  3. 内存数据库:内存数据库将数据存储在内存中,而不是磁盘上,以提供更快的数据访问速度。内存数据库适用于需要高性能和低延迟的应用场景,如实时分析和高并发事务处理。常见的内存数据库有Redis、Memcached等。

        不同类型的数据库在数据存储方式、数据模型和应用场景上有所差异,选择适合的数据库取决于具体的需求和情况。关系型数据库适合处理结构化数据,非关系型数据库适合处理半结构化和非结构化数据,内存数据库适合需要高性能和低延迟的场景。

二、MySQL 与 Redis 区别、应用场景

MySQL和Redis为两种常用数据库,下面简要描述两者区别与应用场景:

区别:

  1. MySQL是一种关系型数据库,Redis是一种基于键值对的内存数据库/非关系型数据库。
  2. MySQL数据存放在磁盘上,可以持久保存,对读写速度要求不高;Redis将数据存放在内存中,具有非常快速的读写速度,但数据在重启后会丢失。

应用场景:

  1. MySQL适用于需要复杂查询、事务支持和大规模结构化数据存储的应用,如电子商务、社交媒体和管理系统;
  2. Redis适用于对读写速度要求很、数据规模较简单的场景,如缓存、实时计数器等。

三、MySQL安装与使用

1.安装步骤

以下是Ubuntu系统上安装和使用MySQL的步骤:

  1. 打开终端(Ctrl + Alt + T)。

  2. 更新软件包列表:sudo apt update

  3. 安装MySQL:sudo apt install mysql-server

  4. 安装过程中,会提示设置MySQL root用户的密码。请设置一个安全的密码,并记下来。

  5. 安装完成后,可以使用以下命令检查MySQL服务的状态:sudo systemctl status mysql

  6. 若要启动MySQL服务,可以使用以下命令:sudo systemctl start mysql

  7. 若要停止MySQL服务,可以使用以下命令:sudo systemctl stop mysql

  8. 若要重启MySQL服务,可以使用以下命令:sudo systemctl restart mysql

  9. 若要设置MySQL服务在系统启动时自动启动,可以使用以下命令:sudo systemctl enable mysql

  10. 若要取消MySQL服务在系统启动时自动启动,可以使用以下命令:sudo systemctl disable mysql

  11. 若要登录到MySQL数据库,可以使用以下命令:mysql -u root -p。然后输入之前设置的密码。

  12. 登录成功后,可以开始使用MySQL数据库。

2.常用命令

显示数据库:show databases;

创建数据库:create database 数据库名;

使用数据库:use 数据库名;

创建数据库表格:

     create table 表格名(

     列名1 数据类型 条件,

     列名2 数据类型 条件,

     列名3 数据类型 条件);

插入数据:

      insert into 数据库名.表格名(列名1,列名2,列名3)

      values(数值1,数值2,数值3);

查询表格某行: select *from 表格名 where 列名=“数值1”;

删除表格某行:delete from 表格名 where 列名=“数值1”;

修改表格某行:update 表格名 set 列名='数值2' where  列名=“数值1”;

表格增加一列:alter table add 列名 数据类型默认条件;

删除表格某行:delete from 表格名 where 列名=“数值1”;

删除数据库:drop database 数据库名;

3.实例

例1:在workbench中实现创建数据库、创建表格、添加数据

CREATE DATABASE TEST_DB;   #创建数据库
USE TEST_DB;
CREATE TABLE TEST_TBL(                   #创建表格
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32),
PHONE INT);
SHOW TABLES;               #显示表格
INSERT INTO TEST_TBL (NAME,PHONE)        #插入数据
VALUES('zhang','12345');

例2:C语言代码实现连接数据库、插入和打印表格数据。

#include <stdio.h>
#include <string.h>
#include <mysql.h>

#define My_DB_SERVER_IP		"192.168.116.130"              //MySQL服务器IP地址
#define My_DB_SERVER_PORT		3306

#define My_DB_USERNAME		"admin"            //MySQL的登录用户
#define My_DB_PASSWORD		"12345"

#define My_DB_DEFAULTDB		"TEST_DB"       //默认执行操作的数据库

#define SQL_INSERT_TBL_USER		"INSERT TEST_TBL(NAME, PHONE) VALUES('huang', '13579');"  //插入数据命令
#define SQL_SELECT_TBL_USER		"SELECT * FROM TEST_TBL;"               //查询命令

//查询,打印表格数据
int mysql_select(MYSQL *handle) { 

	// mysql_real_query --> sql
	if (mysql_real_query(handle, SQL_SELECT_TBL_USER, strlen(SQL_SELECT_TBL_USER))) {
		printf("mysql_real_query : %s\n", mysql_error(handle));
		return -1;
	}
	

	// store --> 
	MYSQL_RES *res = mysql_store_result(handle);
	if (res == NULL) {
		printf("mysql_store_result : %s\n", mysql_error(handle));
		return -2;
	}

	// rows / fields
	int rows = mysql_num_rows(res);
	printf("rows: %d\n", rows);
	
	int fields = mysql_num_fields(res);
	printf("fields: %d\n", fields);

	// fetch
	MYSQL_ROW row;
	while ((row = mysql_fetch_row(res))) {

		int i = 0;
		for (i = 0;i < fields;i ++) {
			printf("%s\t", row[i]);
		}
		printf("\n");
		
	}

	mysql_free_result(res);

	return 0;
}


int main() {

	MYSQL mysql;    //实例化和初始化

	if (NULL == mysql_init(&mysql)) {
		printf("mysql_init : %s\n", mysql_error(&mysql));
		return -1;
	}

    //连接数据库服务器
	if (!mysql_real_connect(&mysql, My_DB_SERVER_IP, My_DB_USERNAME, My_DB_PASSWORD,  
		My_DB_DEFAULTDB, My_DB_SERVER_PORT, NULL, 0)) {

		printf("mysql_real_connect : %s\n", mysql_error(&mysql));
		
	}

	// 执行插入表格数据
	if (mysql_real_query(&mysql, SQL_INSERT_TBL_USER, strlen(SQL_INSERT_TBL_USER))) {
		printf("mysql_real_query : %s\n", mysql_error(&mysql));
	}

	mysql_select(&mysql);

	mysql_close(&mysql);
	return 0;

}

4.数据库工具—— MySQL Workbench

        MySQL Workbench是一个用于设计、开发和管理MySQL数据库的集成开发环境(IDE)。它提供了直观的图形界面,允许用户创建和编辑数据库模型,并可以通过可视化工具生成或修改数据库的结构。除此之外,MySQL Workbench还提供了数据导入和导出、SQL查询和调试、性能优化以及用户和权限管理等功能,使用户能够更轻松地进行数据库管理和开发工作。

1.安装,见下面链接

MySQL Workbench免费下载-MySQL Workbench中文版下载 v8.0.36官方版 - 3322软件站

2.安装后若出现workbench无法连接root用户的情况,需创建一个新的用户

登录root用户下的mysql,输入以下命令:

create user 'admin'@'%' identified by '12345';

 赋予新用户权限:

grant all PRIVILEGES on *.* to 'admin'@'%' identified by '12345' WITH GRANT OPTION;

刷新:

flush privileges;

退出登录quit; 重启mysql

sudo systemctl restart mysql

3.workbench连接新创建的用户

4.在工作区输入增删改查操作

在工作区输入执行的命令后,点击“⚡”启动。

四、Redis安装与使用

1.安装步骤

在Ubuntu系统上安装Redis的步骤如下:

1. 打开终端,输入以下命令来更新系统软件包列表:

sudo apt update

2. 安装Redis服务器:

sudo apt install redis-server

3. 安装完成后,Redis服务器将会自动启动。你可以使用以下命令来检查Redis服务器的运行状态:

sudo systemctl status redis-server

4. 如果Redis服务器没有启动,你可以使用以下命令手动启动它:

sudo systemctl start redis-server

5. 如果你希望Redis服务器在系统启动时自动启动,可以使用以下命令启用自动启动:

sudo systemctl enable redis-server

6. 现在,Redis服务器已经安装并运行在默认端口6379上。你可以使用以下命令连接到Redis服务器并执行Redis命令:

redis-cli

2.Redis入门知识

2.1.Redis是一个内存数据库:Redis将数据存储在内存中,这使得它能够提供非常高的读写性能。Redis也可以将数据持久化到磁盘中,以防止数据丢失。

2.2.Redis支持多种数据类型:Redis不仅支持简单的键值对存储,还支持更复杂的数据类型,如字符串、列表、集合、有序集合和哈希表。这些数据类型使得Redis非常适合于不同的应用场景。                Redis支持多种数据结构,每种类型都有对应的操作命令。可以使用字符串作为键和值,通过键来获取对应的值。列表是一个有序的字符串列表,可以在列表的头部或尾部插入或删除元素。哈希是键值对的集合,可以通过键获取对应的哈希表。集合是一个无序的字符串集合,可以对集合进行添加、删除和判断是否存在等操作。有序集合是一个有序的字符串集合,每个元素都有一个分数,可以根据分数进行排序。

2.3.Redis数据库默认支持16个数据库,编号从0到15。可以通过SELECT命令切换当前操作的数据库。一般情况下,Redis的数据库是在启动Redis时就创建好的,无法动态创建或删除。如果需要清空某个数据库的数据,可以使用FLUSHDB命令清空当前数据库,或者使用FLUSHALL命令清空所有数据库的数据。

3.常用命令

Redis常用命令根据value的数据结构不同,有以下几种:

3.1.通用命令:

  • SET:设置指定key的值
  • GET:获取指定key的值
  • DEL:删除指定key
  • EXISTS:检查key是否存在
  • CONFIG GET databases #命令行查看数据库数量databases
  • SELECT 8 # 切换数据库 DB 8
  • DBSIZE # 查看数据库大小,即键的个数
  • MOVE key db:将键值对移动到指定数据库
  • EXPIRE key second:设置键值对的过期时间
  • TYPE key:查看value的数据类型
示例:
SET mykey "Hello":设置mykey的值为"Hello"
GET mykey:获取mykey的值,返回"Hello"
DEL mykey:删除mykey
EXISTS mykey:检查mykey是否存在,返回0或1
CONFIG GET databases #命令行查看数据库数量databases
SELECT 8 # 切换数据库 DB 8
DBSIZE # 查看数据库大小,即键的个数
MOVE mykey 2:将键值对mykey移动到数据库2
EXPIRE mykey 5:设置键值对的过期时间为5s
TYPE mykey:查看mykey所对应的value的数据类型

3.2.String命令:

  • APPEND:在指定key的值后面追加内容
  • INCR:将指定key的值加1
  • DECR:将指定key的值减1
  • STRLEN:获取指定key的值的长度
示例:
APPEND mystring " World":将" World"追加到mystring的值后面
INCR number:将number的值加1
DECR number:将number的值减1
STRLEN mystring:获取mystring的值的长度

String类似的使用场景:value除了是字符串还可以是其他数据类型,用途举例:

  1. 计数器:可以将value设为整型,用来记录某个事件发生的次数或者某个操作执行的次数。

  2. 统计多单位的数量:可以将value设为浮点型,用来统计多个单位的数量,比如某个商品的销售量或者某个团队的绩效得分。

  3. 粉丝数:可以将value设为整型,用来记录用户的粉丝数量,可以用于社交平台或者博客等场景。

  4. 对象存储缓存:可以将value设为对象,用来存储和缓存一些复杂的数据结构,比如将数据库查询结果放入缓存中,提高系统性能和响应速度。

3.3.List命令:

  • LPUSH:将一个或多个值插入到列表头部
  • RPUSH:将一个或多个值插入到列表尾部
  • LPOP:移除并获取列表的第一个元素
  • RPOP:移除并获取列表的最后一个元素
  • LLEN:获取列表的长度
  • LRANGE key index0 index1:获取列表某个区间的的值
  • LINDEX key index :获取列表指定索引的值
示例:
LPUSH mylist "World":创建一个mylist列表,并将"World"插入到mylist的头部  mylist=>{"World"}
LPUSH mylist 0 : mylist=>{"0","World"}
RPUSH mylist "Hello":将"Hello"插入到mylist的尾部  mylist=>{"0","World","Hello"}
LPUSH mylist 1 : mylist=>{"0","World","Hello","1"}
LRANGE mylist 0 0 : 获取列表的第一个值
LRANGE mylist 0 1 : 获取列表的前两个值
LRANGE mylist 0 -1 : 获取列表全部值
LPOP mylist:移除并获取mylist的第一个元素,返回"0"
RPOP mylist:移除并获取mylist的最后一个元素,返回"1"
LLEN mylist:获取mylist的长度

Redis中的List数据结构有以下几种应用:

  1. 消息队列:可以将消息放入List中,然后使用Redis中的相关命令进行消息的发布和订阅,实现简单的消息队列功能。

  2. 实时排行榜:可以使用List存储用户的得分信息,然后使用相关命令对得分进行排序和统计,实现实时的排行榜功能。

  3. 最新消息列表:可以将最新的消息放入List中,然后使用相关命令获取最新的消息列表,实现类似微博的功能。

  4. 历史操作记录:可以将用户的操作记录放入List中,然后使用相关命令获取历史操作记录,实现撤销、恢复等功能。

  5. 阻塞队列:可以使用List进行任务的管理,使用相关命令将任务放入List中,并使用阻塞命令进行阻塞式的任务获取和处理。

  6. 消息推送:可以将推送的消息放入List中,然后使用相关命令对消息进行推送,实现即时消息推送的功能。

4.Set命令:

在Redis中,Set是一种无序且唯一的数据结构,它可以存储多个不重复的字符串元素。Set数据结构的内部实现是一个哈希表,因此在添加、删除和查找操作的平均时间复杂度都是O(1).

  • SADD:向指定set中添加一个或多个成员
  • SREM:从指定set中移除一个或多个成员
  • SMEMBERS:获取指定set的所有成员
  • SISMEMBER:判断指定成员是否存在于set中
示例:
SADD myset "member1" "member2" "member3":向myset中添加成员"member1"
SREM myset "member2":从myset中移除成员"member2"
SMEMBERS myset:获取myset的所有成员,返回["member1", "member3"]
SISMEMBER myset "member1":判断"member1"是否存在于myset中,返回1
  1. 唯一性筛选:Set的最主要功能是去重,可以用来存储唯一的用户ID、IP地址、Email地址等数据。通过将元素添加到Set中,系统可以快速判断某个元素是否已经存在,从而避免重复数据的出现。

  2. 共同好友/共同关注:Set的集合运算可以很方便地处理共同好友、共同关注等关系。例如,假设有两个用户的关注列表存在两个Set中,通过求交集可以快速找到他们的共同关注。

  3. 标签/标签云:Set可以用来存储标签数据,例如文章的标签、商品的分类等。通过Set数据结构,可以快速找到拥有某个标签的所有文章或商品。

  4. 抽奖/投票系统:Set的主要特点是无序且不重复,这使得它非常适合用于抽奖和投票系统。通过将参与抽奖或投票的用户ID存储在Set中,可以方便地随机选择获奖者或计算投票结果。

  5. 好友推荐:通过Set数据结构存储用户的好友列表,可以方便地进行好友推荐。例如,可以通过求差集找到和某个用户没有共同好友,但可能有共同兴趣爱好的其他用户。

5.Hash命令:

  • HSET:设置指定hash中的字段值field value
  • HMSET:设置多个字段值field0 value0,field1 value1
  • HGET:获取指定hash中的字段值
  • HGETALL:获取指定hash中的所有字段和值
  • HDEL:删除指定hash中的一个或多个字段

Redis中Hash数据结构的常见应用:

  1. 缓存对象:Hash数据结构适合存储和表示对象,其中每个字段表示对象的属性,每个属性的值作为字段的值。这种结构对于缓存对象非常有用,因为数据可以按需加载,而不需要一次性加载整个对象。

  2. 用户属性:如果你有一个用户系统,每个用户都有一些属性(如用户名、密码、邮箱等),那么可以使用Hash来存储用户信息。每个用户可以被存储为一个Hash,其中每个字段表示一个属性。

  3. 计数器:Hash数据结构可以用来实现计数器功能。可以将每个计数器存储为一个Hash,其中字段表示不同的计数器,字段的值表示计数器的值。通过对字段的值进行递增/递减操作,可以方便地实现计数功能。

  4. 布隆过滤器:布隆过滤器是一种空间效率高、误判率低的数据结构,用于检测一个元素是否在一个集合中。可以使用Hash数据结构来实现布隆过滤器,其中每个字段表示不同的过滤器,字段的值表示相应过滤器的状态。

  5. 缓存表:可以使用Hash数据结构来实现缓存表。将表中的每一行存储为Hash,其中每个字段表示表的列,字段的值表示相应行的列值。

6.Sorted Set命令:

        Redis中的Sorted Set(有序集合)是一种数据结构,它可以存储一组有序的元素。每个元素都有一个分数(score)与之关联,分数用于对元素进行排序。Sorted Set使用了一种特殊的数据结构,称为跳跃表(skiplist),它可以在O(log N)的时间复杂度下查找、插入和删除元素。

  • ZADD:将一个或多个成员及其分数添加到有序集合中
  • ZRANK:获取有序集合中指定成员的排名
  • ZRANGE:获取有序集合中指定排名范围的成员
  • ZREM:从有序集合中移除一个或多个成员
示例:
ZADD myzset 1 "member1":将成员"member1"及其分数1添加到myzset
ZRANK myzset "member1":获取myzset中成员"member1"的排名,返回0
ZRANGE myzset 0 -1 WITHSCORES:获取myzset中所有成员及其分数,返回[("member1", 1)]
ZREM myzset "member1":从myzset中移除成员"member1"

7.其他命令:

  • TTL:获取指定key的过期时间
  • PUBLISH:将消息发布到指定频道
  • SUBSCRIBE:订阅一个或多个频道的消息
示例:
EXPIRE mykey 60:为mykey设置过期时间60秒
TTL mykey:获取mykey的过期时间,返回剩余秒数
PUBLISH mychannel "Hello":将消息"Hello"发布到mychannel频道
SUBSCRIBE mychannel:订阅mychannel频道的消息

4.Redis事务

Redis中的事务是指作为单个逻辑工作单元执行的一系列操作。它确保这些操作在执行时中间不会被任何其他操作打断。以下是关于Redis事务的详细解释:

  1. 定义与特性
    • Redis的事务是一组命令的集合,这些命令要么全部执行,要么全部不执行,具有原子性(Atomicity)的特点。
    • Redis的事务保证了事务内命令的隔离性(Isolation),即在一个事务中的命令不会被其他客户端的命令所插入或打断。
    • 事务的执行结果具有一致性(Consistency),即事务开始之前和事务结束以后,数据库的完整性没有被破坏。
    • Redis的事务还具备持久性(Durability),一旦事务执行完毕,对数据的修改就是永久的。
  2. 执行流程
    • 使用MULTI命令来标记一个事务的开始。
    • MULTI命令之后,用户可以输入多个Redis命令,这些命令会被Redis服务器放入一个队列中,但并不会立即执行。
    • 当用户输入EXEC命令后,Redis会依次执行队列中的所有命令。
    • 如果在EXEC命令执行前客户端断线,Redis会清空事务队列,事务中的所有命令都不会执行。
    • 如果在EXEC命令执行后客户端断线,由于Redis已经记录了所有要执行的命令,所以这些命令仍然会被执行。
    • 取消事务(discurd)
  3. 错误处理
    • 如果在定义事务的过程中,某个命令存在语法错误,那么整个事务中的所有命令都不会被执行。
    • 如果事务中的某个命令因为使用了错误类型的键而失败(如对一个字符串键执行列表操作),那么Redis会继续执行事务中的其他命令,而不是进行回滚。这是因为Redis认为这种类型的错误是由编程错误造成的,应该在开发过程中被避免。
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k1 v1 # 命令入队
QUEUED
127.0.0.1:6379> set k2 v2 # ..
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> keys *
QUEUED
127.0.0.1:6379> exec # 事务执行
1) OK
2) OK
3) "v1"
4) OK
5) 1) "k3"
   2) "k2"
   3) "k1"

5.乐观锁与悲观锁

       乐观锁与悲观锁在并发控制和数据库操作中扮演着重要的角色,它们的应用场景取决于具体的数据访问模式、并发量以及数据一致性的要求。以下是关于这两种锁的应用场景的详细解释:

乐观锁

悲观锁(Pessimistic Lock) , 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
 

  1. 基本思想
    • 乐观锁认为冲突是少数情况,因此它不会立即对读取的数据加锁。
    • 乐观锁在数据更新时进行检查,如果发现数据在读取后被其他事务修改过,则放弃或重新尝试更新操作。
  2. 实现方式
    • 在数据库中,乐观锁通常通过版本号机制或CAS(Compare-And-Swap)操作来实现。
    • 版本号机制:在数据表中添加一个版本号字段(如version),每次读取数据时都会读取该版本号。在更新数据时,会检查版本号是否发生变化,如果未变化则更新数据并递增版本号,否则放弃或重新尝试更新。
    • CAS操作:通过比较当前值与预期值是否相等,如果相等则更新为新值,否则放弃或重新尝试。

 

悲观锁

乐观锁(Optimistic Lock) , 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。redis就是利用这种check-and-set机制实现事务的。

  1. 基本思想
    • 悲观锁认为冲突是常态,因此在数据被处理之前,它总是假设最坏的情况,即数据会在处理过程中被其他事务修改。
    • 因此,悲观锁在读取数据时就会对数据加锁,确保在事务处理过程中数据不会被其他事务修改。
  2. 实现方式
    • 在数据库中,悲观锁通常通过数据库提供的锁机制(如行锁、表锁等)来实现。
    • 例如,在MySQL的InnoDB存储引擎中,使用SELECT ... FOR UPDATE语句可以对查询到的数据行加锁,阻止其他事务对这些行进行修改。

6.实例

6.1.使用c++代码实现连接redis服务器并存放、取出数据

#include <iostream>
#include <hiredis/hiredis.h>

int main() {
    // 连接redis
    redisContext* redis = redisConnect("127.0.0.1", 6379);
    if (redis == NULL || redis->err) {
        std::cout << "Failed to connect to Redis: " << (redis == NULL ? "nullptr" : redis->errstr) << std::endl;
        return 1;
    }

    // 执行SET操作
    redisReply* reply = (redisReply*)redisCommand(redis, "SET key value");
    if (reply == NULL) {
        std::cout << "Failed to execute SET command" << std::endl;
        return 1;
    }
    std::cout << "SET command result: " << reply->str << std::endl;
    freeReplyObject(reply);

    // 执行GET操作
    reply = (redisReply*)redisCommand(redis, "GET key");
    if (reply == NULL) {
        std::cout << "Failed to execute GET command" << std::endl;
        return 1;
    }
    std::cout << "GET command result: " << reply->str << std::endl;
    freeReplyObject(reply);

    // 关闭redis连接
    redisFree(redis);

    return 0;
}

运行上面代码前需下载hiredis源码并编译,命令如下:

git clone https://github.com/redis/hiredis.git
cd hiredis
make
sudo make install

编译运行实例代码
cd ..
g++ -o test test.cpp -lhiredis
./test

在这个示例中,我们首先使用redisConnect函数建立到Redis服务器的连接。如果连接成功,我们可以执行Redis的命令,例如使用redisCommand函数执行SETGET命令。执行命令后,我们可以使用返回的redisReply对象来获取结果。最后,我们使用redisFree函数关闭连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值