redis服务搭建,C++实现redis客户端,redis远程可视化工具

news/2024/11/24 6:58:06/

目录

  • redis简介
  • redis服务搭建
  • redis常用命令
  • C++实现redis客户端
  • redis远程可视化工具:Another Redis DeskTop Manager

redis简介

官方网址:https://redis.io/
开源地址:https://github.com/redis
中文文档:http://www.redis.cn/documentation.html

redis服务搭建

下载地址:https://redis.io/download/
下载版本:redis-7.0.11.tar.gz
操作系统:CentOS7

服务安装

#上传到目录,解压缩安装包
cd /opt/soft/
tar -zxvf redis-7.0.11.tar.gz
cd /opt/soft/redis-7.0.11/
make
make install

启动服务

cp /opt/soft/redis-7.0.11/redis.conf /usr/local/bin/mtconfig
vim redis.conf
daemonize no --> yes	#默认后台启动
cd /usr/local/bin/
./redis-server mtconfig/redis.conf	#启动服务
redis-cli -p 6379	#连接服务
ping	#测试,打印PONG
ps -ef | grep redis	#查看服务进程

常用命令

127.0.0.1:6379> ping			#查看当前连接是否正常,正常返回PONG
PONG
127.0.0.1:6379> keys *			#查看当前库里所有的key
(empty array)
127.0.0.1:6379> set name haka	#添加一个key为‘name’ value为‘haka’的数据
OK
127.0.0.1:6379> get name		#查询key为‘name’的value值
"haka"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> EXISTS name		#判断当前key是否存在
(integer) 1
127.0.0.1:6379> move name 1		#移除当前库1的key为‘name‘的数据
(integer) 1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name1 haka1
OK
127.0.0.1:6379> type name1		#查看数据类型
string
127.0.0.1:6379> EXPIRE name1 15	#设置key为’name‘的数据过期时间为15秒 单位seconds
(integer) 1
127.0.0.1:6379> ttl name1		#查看当前key为’name‘的剩余生命周期时间
(integer) 9
127.0.0.1:6379> ttl name1		#如若返回-2,证明key已过期
(integer) -2
127.0.0.1:6379> get name 1
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> get name1
(nil)
127.0.0.1:6379> FLUSHALL		#清空所有库的内容
OK
127.0.0.1:6379>config set requirepass 123456 #设置临时密码
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456		#使用密码认证

redis常用命令

1、字符串string操作命令

#设置指定的key值
SET key value
#获取指定key的值
GET key
#设置指定key的值,并将key的过期时间设为seconds秒
SETEX key seconds value
#只有在key不存在时设置key的值
SETNX key value

2、哈希hash操作命令
Redis hash是一个string类型的field和value的映射表,hash特别适用于存储对象,常用命令:

#将哈希表key中的字段field的值设为value
HSET key field value
#获取存储在哈希表中指定字段的值
HGET key field
#删除存储在哈希表中的指定字段
HDEL key field
#获取哈希表中所有字段
HKEYS key
#获取哈希表中所有值
HVALS key 
#获取在哈希表中指定key的所有字段和值
HGETALL key

3、列表list操作命令
Redis列表是简单的字符串列表,按照插入顺序排序,常用命令:

#将一个或多个值插入到列表头部
LPUSH key value1 [value2] 
#获取列表指定范围内的元素
LRANGE key start stop 
#移除并获取列表最后一个元素
RPOP key
#获取列表长度
LLEN key
#移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BRPOP key1 [key2] timeout

4、集合set操作命令
Redis set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:

#向集合添加一个或多个成员
SADD key member1 [member2]
#返回集合中的所有成员
SMEMBERS key 
#获取集合中的成员数
SCARD key
#返回给定所有集合的交集
SINTER key1 [key2]
#返回所有给定集合的并集
SUNION key1 [key2]
#返回给定所有集合的差集
SDIFF key1 [key2]
#移除集合中一个或多个成员
SREM key member1 [member2]

5、有序集合sorted set操作命令
Redis sorted set有序集合是string类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。
常用命令:

#向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD key score1 member1 [score2 member2]
#通过索引区间返回有序集合中指定区间内的成员
ZRANGE key start stop [WITHSCORES]
#有序集合中对指定成员的分数加上增量increment
ZINCRBY key increment member
#移除有序集合中的一个或多个成员
ZREM key member [member...]

C++实现redis客户端

使用redis官方提供的开源客户端:hiredis。
下载地址:https://github.com/redis/hiredis
下载开发包:hiredis-master.zip

unzip hiredis-master.zip
cd hiredis-master/
make
make install
/usr/local/include/hiredis	#头文件目录
/usr/local/lib				#库文件目录

代码实现,使用QT测试:
pro文件添加:LIBS += -lhiredis
头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <hiredis/hiredis.h>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEusing namespace std;
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void init();int setString(string key, string value);string getString(string key);int setList(string key, vector<string> value);vector<string> getList(string key);private:Ui::MainWindow *ui;redisContext *m_redis;
};
#endif // MAINWINDOW_H

源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <iostream>
#include <sstream>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);init();//test stringsetString("name","haka");string msg = getString("name");printf("msg=%s\n",msg.c_str());//测试listvector<string> vec ={"cat","dog","rat","bird"};setList("bao",vec);vector<string> vecResult = getList("bao");for(int i=0;i<vecResult.size();i++){cout<<vecResult[i]<<" ";}
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::init()
{
//建立连接struct timeval timeout = { 1, 500000 }; // 1.5 seconds 设置连接等待时间char ip[255];strcpy(ip, "127.0.0.1");m_redis = redisConnectWithTimeout(ip, 6379, timeout);if (m_redis->err) {printf("RedisTool : Connection error: %s\n", m_redis->errstr);}else{//REDIS_REPLY响应的类型typecout << "init redis tool success " << endl;cout << "#define REDIS_REPLY_STRING 1"<< endl;cout << "#define REDIS_REPLY_ARRAY 2"<< endl;cout << "#define REDIS_REPLY_INTEGER 3"<< endl;cout << "#define REDIS_REPLY_NIL 4"<< endl;cout << "#define REDIS_REPLY_STATUS 5"<< endl;cout << "#define REDIS_REPLY_ERROR 6"<< endl;}
//设置密码redisReply *reply = (redisReply *)redisCommand(m_redis, "AUTH %s", "123456");if (reply->type == REDIS_REPLY_ERROR){printf("Redis认证失败!\n");}else{printf("Redis认证成功!\n");}freeReplyObject(reply);
}//向数据库写入string类型数据
int MainWindow::setString(string key, string value)
{if(m_redis == NULL || m_redis->err)//int err; /* Error flags, 错误标识,0表示无错误 */{cout << "Redis init Error !!!" << endl;init();return -1;}redisReply *reply;reply = (redisReply *)redisCommand(m_redis,"SET %s %s", key.c_str(), value.c_str());//执行写入命令cout<<"set string type = "<<reply->type<<endl;//获取响应的枚举类型int result = 0;if(reply == NULL){redisFree(m_redis);m_redis = NULL;result = -1;cout << "set string fail : reply->str = NULL " << endl;//pthread_spin_unlock(&m_redis_flock);return -1;}else if(strcmp(reply->str, "OK") == 0)//根据不同的响应类型进行判断获取成功与否{result = 1;}else{result = -1;cout << "set string fail :" << reply->str << endl;}freeReplyObject(reply);//释放响应信息return result;
}//从数据库读出string类型数据
string MainWindow::getString(string key)
{if(m_redis == NULL || m_redis->err){cout << "Redis init Error !!!" << endl;init();return NULL;}redisReply *reply;reply = (redisReply *)redisCommand(m_redis,"GET %s", key.c_str());cout<<"get string type = "<<reply->type<<endl;if(reply == NULL){redisFree(m_redis);m_redis = NULL;cout << "ERROR getString: reply = NULL!!!!!!!!!!!! maybe redis server is down" << endl;return NULL;}else if(reply->len <= 0){freeReplyObject(reply);return NULL;}else{stringstream ss;ss << reply->str;freeReplyObject(reply);return ss.str();}
}//向数据库写入vector(list)类型数据
int MainWindow::setList(string key,vector<string> value)
{if(m_redis == NULL || m_redis->err){cout << "Redis init Error !!!" << endl;init();return -1;}redisReply *reply;int valueSize = value.size();int result = 0;for(int i=0; i<valueSize; i++){reply = (redisReply*)redisCommand(m_redis,"RPUSH %s %s", key.c_str(),value.at(i).c_str());cout<<"set list type = "<<reply->type<<" ";int old = reply->integer;if(reply == NULL){redisFree(m_redis);m_redis = NULL;result = -1;cout << "set list fail : reply->str = NULL " << endl;//pthread_spin_unlock(&m_redis_flock);return -1;}else if(reply->integer == old++){result = 1;cout<<"rpush list ok"<<endl;continue;}else{result = -1;cout << "set list fail ,reply->integer = " << reply->integer << endl;return -1;}}freeReplyObject(reply);cout<<"set List  success"<<endl;return result;}//从数据库读出vector(list)类型数据
vector<string> MainWindow::getList(string key)
{if(m_redis == NULL || m_redis->err){cout << "Redis init Error !!!" << endl;init();return vector<string>{};//返回空的向量}redisReply *reply;reply = (redisReply*)redisCommand(m_redis,"LLEN %s", key.c_str());int valueSize = reply->integer;cout<<"List size is :"<<reply->integer<<endl;reply = (redisReply*)redisCommand(m_redis,"LRANGE %s %d %d", key.c_str(),0,valueSize-1);cout<<"get list type = "<<reply->type<<endl;cout<<"get list size = "<<reply->elements<<endl;//对于数组类型可以用elements元素获取数组长度redisReply** replyVector = reply->element;//获取数组指针vector<string> result;for(int i=0;i<valueSize;i++){string temp =(*replyVector)->str;//遍历redisReply*数组,存入vector向量
//        int a =atoi(temp.c_str());result.push_back(temp);replyVector++;}cout<<"result size:"<<result.size()<<endl;return result;
}

打印:

init redis tool success 
#define REDIS_REPLY_STRING 1
#define REDIS_REPLY_ARRAY 2
#define REDIS_REPLY_INTEGER 3
#define REDIS_REPLY_NIL 4
#define REDIS_REPLY_STATUS 5
#define REDIS_REPLY_ERROR 6
Redis认证成功!
set string type = 5
get string type = 1
msg=haka
set list type = 3 rpush list ok
set list type = 3 rpush list ok
set list type = 3 rpush list ok
set list type = 3 rpush list ok
set List  success
List size is :4
get list type = 2
get list size = 4
result size:4
cat dog rat bird 

redis远程可视化工具:Another Redis DeskTop Manager

下载地址:https://github.com/qishibo/AnotherRedisDesktopManager/releases
下载exe安装包:Another-Redis-Desktop-Manager.1.6.0.exe。
安装程序后运行。

远程连接配置
1、关闭防火墙

 systemctl status firewalld		#查看防火墙状态systemctl stop firewalld		#关闭防火墙

2、修改redis配置文件

 vim redis.confbind 0.0.0.0		#设置为0.0.0.0开放所有,或指定IPprotected-mode no	#关闭保护模式,才能远程连接deamonize yes		#redis设置为后台启动requirepass 123456	#设置访问密码

编辑连接
在这里插入图片描述
连接成功
在这里插入图片描述


http://www.ppmy.cn/news/59536.html

相关文章

Java 中的线程是什么,如何创建和管理线程-下(十三)

书接上文 CompletableFuture CompletableFuture 是 Java 8 中新增的类&#xff0c;提供了更为强大的异步编程支持。它可以将多个异步任务组合成一个整体&#xff0c;并且可以处理异常情况。 例如&#xff0c;可以使用 CompletableFuture 来实现异步任务的串行执行&#xff1…

行人重识别数据集Person Re-Identification Datasets(全)

DatasetRelease time# identities# cameras# imagesLabel methodCrop sizeMulti-shotTracking sequencesFull frames availabilityVIPeR200763221264Hand128X48ETH1,2,3200785, 35, 2818580HandVary✔✔✔QMUL iLIDS20091192476HandVary✔GRID2009102581275HandVaryCAVIAR4ReID…

JAVAScript入门指南 - 从零基础到快速开发

JAVAScript是一门在网站开发中使用广泛的编程语言&#xff0c;它能够帮助你创造动态的网页&#xff0c;并让用户与网站交互。很多人对于JAVAScript入门感到很困惑&#xff0c;那么&#xff0c;本篇文章将详细地介绍JAVAScript的入门知识。 一、入门介绍 JAVAScript是一种轻量…

P3029 [USACO11NOV]Cow Lineup S 双指针 单调队列

“五一”小长假来了趟上海&#xff0c;在倒数第二天终于有时间做了一会儿题目&#xff0c;A了之后过来写一篇题解 【问题描述】 农民约翰雇一个专业摄影师给他的部分牛拍照。由于约翰的牛有好多品种&#xff0c;他喜欢他的照片包含每个品种的至少一头牛。 约翰的牛都站在一条沿…

KL散度

KL散度&#xff08;Kullback-Leibler divergence&#xff09;&#xff0c;也称为相对熵&#xff08;relative entropy&#xff09;&#xff0c;是用来衡量两个概率分布之间差异的一种指标。在机器学习中&#xff0c;KL散度常常用于度量两个概率分布之间的相似度或差异性。 具体…

【Git】‘git‘ 不是内部或外部命令,也不是可运行的程序

一、问题 我想利用git clone命令从github上下载项目源代码&#xff0c;发现报错&#xff1a; git 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。我用cmd跑一下git命令&#xff0c;发现报错&#xff1a; 二、问题分析 这个错误提示表明您的系统中没有安装…

报错:RuntimeError: CUDA error: device-side assert triggered

在运行CGAN代码时&#xff0c;有几个报错&#xff0c;记录解决办法 一、报错1 C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\Indexing.cu:1146: block: [0,0,0], thread: [39,0,0] Assertion srcIndex < srcSelectDimSize failed. C:\cb\pytorch_10000000…

音视频八股文(10)-- mp4结构

介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14&#xff0c;出⾃MPEG-4标准第14部分 。它是⼀种多媒体格式容器&#xff0c;⼴泛⽤于包装视频和⾳频数据流、海报、字幕和元数据等。&#xff08;顺便⼀提&#xff0c;⽬前流⾏的视频编码格式AVC/H264 定义在MPEG-4 Part 10&#xff09…