目录
- 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
ps -ef | grep redis
常用命令
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name haka
OK
127.0.0.1:6379> get name
"haka"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> move name 1
(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
(integer) 1
127.0.0.1:6379> ttl name1
(integer) 9
127.0.0.1:6379> ttl name1
(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操作命令
SET key value
GET key
SETEX key seconds value
SETNX key value
2、哈希hash操作命令
Redis hash是一个string类型的field和value的映射表,hash特别适用于存储对象,常用命令:
HSET key field value
HGET key field
HDEL key field
HKEYS key
HVALS 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]
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_NAMESPACE
using namespace std;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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
源文件
#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();
setString("name","haka");
string msg = getString("name");
printf("msg=%s\n",msg.c_str());
vector<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 };
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
{
cout << "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);
}
int MainWindow::setString(string key, string value)
{
if(m_redis == NULL || m_redis->err)
{
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;
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 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();
}
}
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;
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<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;
redisReply** replyVector = reply->element;
vector<string> result;
for(int i=0;i<valueSize;i++)
{
string temp =(*replyVector)->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.conf
bind 0.0.0.0
protected-mode no
deamonize yes
requirepass 123456
编辑连接
连接成功
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)