redis在Linux上的安装方法

一、下载安装包

环境:Linux版本为Centos 7

得到安装包主要有两种方式,一种为直接从官网下载,官方网址 https://redis.io/,另外一种则是通过命令下载,然而本质都是从官网获取gz包

wget http://download.redis.io/releases/redis-6.0.8.tar.gz

当前版本最新为6.2.1,但我这边使用了6.0.8

下载完后可以选择先解压缩,解压命令:

tar -xvf redis-6.0.8.tar.gz

解压缩后移动目录到/usr/local目录下

mv redis-6.0.8 /usr/local/redis6.0.8

二、安装

安装前先安装环境

首先安装gcc环境,通过yum命令安装

yum install gcc-c++

安装完成后通过 gcc -v 命令可以查看是否安装成功

然而,这边有一个坑,6.0以后的redis版本是需要使用gcc5.3以上的版本去编译的,所以需要先升级gcc版本再去编译redis,如果已经在redis目录下执行make命令并且失败了,可以使用命令清除已编译生成的文件

make  distclean   //清除已编译生成的文件

gcc版本升级

yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash

上面的命令只能做到临时升级,退出shell后就还原回去了

设置永久升级:

echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

三、编译安装

接下来就可以安装redis了,首先进入redis目录:

cd /usr/local/redis6.0.8/

然后执行make命令对redis进行编译

然而,又出错了,错误信息:

In file included from server.c:30:0:
server.h:1065:5: 错误:expected specifier-qualifier-list before ‘_Atomic’
     _Atomic unsigned int lruclock; /* Clock for LRU eviction */
     ^
server.c: 在函数‘serverLogRaw’中:
server.c:1032:31: 错误:‘struct redisServer’没有名为‘logfile’的成员
     int log_to_stdout = server.logfile[0] == '\0';
                               ^
server.c:1035:23: 错误:‘struct redisServer’没有名为‘verbosity’的成员
     if (level < server.verbosity) return;
                       ^
server.c:1037:47: 错误:‘struct redisServer’没有名为‘logfile’的成员
     fp = log_to_stdout ? stdout : fopen(server.logfile,"a");
                                               ^
server.c:1050:47: 错误:‘struct redisServer’没有名为‘timezone’的成员
         nolocks_localtime(&tm,tv.tv_sec,server.timezone,server.daylight_active);
                                               ^
server.c:1050:63: 错误:‘struct redisServer’没有名为‘daylight_active’的成员
         nolocks_localtime(&tm,tv.tv_sec,server.timezone,server.daylight_active);
                                                               ^
server.c:1053:19: 错误:‘struct redisServer’没有名为‘sentinel_mode’的成员
         if (server.sentinel_mode) {
                   ^
server.c:1058:32: 错误:‘struct redisServer’没有名为‘masterhost’的成员
             role_char = (server.masterhost ? 'S':'M'); /* Slave or Master. */
                                ^
server.c:1066:15: 错误:‘struct redisServer’没有名为‘syslog_enabled’的成员
     if (server.syslog_enabled) syslog(syslogLevelMap[level], "%s", msg);
               ^
server.c: 在函数‘serverLog’中:
server.c:1076:30: 错误:‘struct redisServer’没有名为‘verbosity’的成员
     if ((level&0xff) < server.verbosity) return;
                              ^
server.c: 在函数‘serverLogFromHandler’中:
server.c:1093:31: 错误:‘struct redisServer’没有名为‘logfile’的成员
     int log_to_stdout = server.logfile[0] == '\0';
                               ^
server.c:1096:30: 错误:‘struct redisServer’没有名为‘verbosity’的成员
     if ((level&0xff) < server.verbosity || (log_to_stdout && server.daemonize))
                              ^
server.c:1096:68: 错误:‘struct redisServer’没有名为‘daemonize’的成员
     if ((level&0xff) < server.verbosity || (log_to_stdout && server.daemonize))
                                                                    ^
server.c:1099:37: 错误:‘struct redisServer’没有名为‘logfile’的成员
                          open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644);
                                     ^
server.c: 在函数‘hasActiveChildProcess’中:
server.c:1477:18: 错误:‘struct redisServer’没有名为‘rdb_child_pid’的成员
     return server.rdb_child_pid != -1 ||
                  ^
server.c:1478:18: 错误:‘struct redisServer’没有名为‘aof_child_pid’的成员
            server.aof_child_pid != -1 ||
                  ^
server.c:1479:18: 错误:‘struct redisServer’没有名为‘module_child_pid’的成员
            server.module_child_pid != -1;
                  ^
server.c: 在函数‘allPersistenceDisabled’中:
server.c:1485:18: 错误:‘struct redisServer’没有名为‘saveparamslen’的成员
     return server.saveparamslen == 0 && server.aof_state == AOF_OFF;
                  ^
server.c:1485:47: 错误:‘struct redisServer’没有名为‘aof_state’的成员
     return server.saveparamslen == 0 && server.aof_state == AOF_OFF;
                                               ^
server.c: 在函数‘trackInstantaneousMetric’中:
server.c:1492:36: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
     long long t = mstime() - server.inst_metric[metric].last_sample_time;
                                    ^
server.c:1494:27: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
                     server.inst_metric[metric].last_sample_count;
                           ^
server.c:1499:11: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
     server.inst_metric[metric].samples[server.inst_metric[metric].idx] =
           ^
server.c:1499:46: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
     server.inst_metric[metric].samples[server.inst_metric[metric].idx] =
                                              ^
server.c:1501:11: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
     server.inst_metric[metric].idx++;
           ^
server.c:1502:11: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
     server.inst_metric[metric].idx %= STATS_METRIC_SAMPLES;
           ^
server.c:1503:11: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
     server.inst_metric[metric].last_sample_time = mstime();
           ^
server.c:1504:11: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
     server.inst_metric[metric].last_sample_count = current_reading;
           ^
server.c:1491:35: 警告:形参‘metric’被设定但未被使用 [-Wunused-but-set-parameter]
 void trackInstantaneousMetric(int metric, long long current_reading) {
                                   ^
server.c: 在函数‘getInstantaneousMetric’中:
server.c:1513:22: 错误:‘struct redisServer’没有名为‘inst_metric’的成员
         sum += server.inst_metric[metric].samples[j];
                      ^
server.c:1508:38: 警告:形参‘metric’被设定但未被使用 [-Wunused-but-set-parameter]
 long long getInstantaneousMetric(int metric) {
                                      ^
server.c: 在函数‘clientsCronResizeQueryBuffer’中:
server.c:1523:29: 错误:‘struct redisServer’没有名为‘unixtime’的成员
     time_t idletime = server.unixtime - c->lastinteraction;
                             ^
server.c: 在函数‘clientsCronTrackExpansiveClients’中:
server.c:1580:19: 错误:‘struct redisServer’没有名为‘unixtime’的成员
     int i = server.unixtime % CLIENTS_PEAK_MEM_USAGE_SLOTS;
                   ^
server.c: 在函数‘clientsCronTrackClientsMemUsage’中:
server.c:1617:11: 错误:‘struct redisServer’没有名为‘stat_clients_type_memory’的成员
     server.stat_clients_type_memory[c->client_cron_last_memory_type] -=
           ^
server.c:1619:11: 错误:‘struct redisServer’没有名为‘stat_clients_type_memory’的成员
     server.stat_clients_type_memory[type] += mem;
           ^
In file included from server.h:63:0,
                 from server.c:30:
server.c: 在函数‘clientsCron’中:
server.c:1659:39: 错误:‘struct redisServer’没有名为‘clients’的成员
     int numclients = listLength(server.clients);

原因是环境缺失,只能再回去将gcc套装全部安上:

yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make

再次进入redis程序目录执行make编译,总算是ok了:

在这里插入图片描述

继续执行 make install 命令对redis进行安装,此命令会将redis安装在linux上的默认位置:/usr/local/bin

不过也可以通过 make install PREFIX=/usr/local/redis-6.0.8 安装在指定位置

我这边使用了默认安装,即安装在了 usr/local/bin目录下

make install     //或者执行make install PREFIX=/usr/local/redis-6.0.8 安装在指定位置

四、配置更改

首先我们进入原先的redis程序目录

/usr/local/redis6.0.8

ls查看当前目录下文件

[root@tangjiang redis6.0.8]# ls
00-RELEASENOTES  COPYING  Makefile   redis.conf       runtest-moduleapi  src     utils
BUGS             deps     MANIFESTO  runtest          runtest-sentinel   tests
CONTRIBUTING     INSTALL  README.md  runtest-cluster  sentinel.conf      TLS.md

可以看到redis.conf 即为redis的配置文件,这份文件作为原配置文件保留在当前目录,拷贝一份到/usr/local/bin/conf/ 文件夹下

cd /usr/local/bin/
mkdir conf
cd conf
cp /usr/local/redis6.0.8/redis.conf myredis.conf

这份myredis.conf 即为我们要进行修改的redis配置了,之后启动redis 也是使用这份配置文件启动

修改配置文件:

vim myredis.conf

可能需要修改的地方

#bind 127.0.0.1  //这边注释掉,不注释掉就只能本地连接redis

protected-mode no  //这边将yes改为no 允许远程连接,否则远程连接redis时将会被拒绝

daemonize yes   //默认为no 改为yes以后台方式运行

requirepass yourpassword  //建议如果设置了远程连接一定要配置密码 yourpassword为自己需要设置成的密码

五、启动

使用指定的配置文件启动

redis-server conf/myredis.conf

本地连接

redis-cli -p 6379

使用ping测试,如果设置了密码将会出错,需要以密码登录

[root@tangjiang bin]# redis-cli -p 6379
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth yourpassword
OK
127.0.0.1:6379> ping
PONG

如果是远程连接,则需要将linux防火墙上的redis端口进行开放

首先查看6379端口是否开放

[root@tangjiang bin]# firewall-cmd --zone=public --list-ports
80/tcp 8080/tcp 6001/tcp 22/tcp 6379/tcp

我这边已经设置了6379开放,如果列表中没有6379端口,可以使用以下命令开放端口:

firewall-cmd --zone=public --add-port=6379/tcp --permanent

注意开启后需要重启防火墙使其生效:

firewall-cmd --reload

查看设置是否生效:

[root@tangjiang bin]# firewall-cmd --zone=public --query-port=6379/tcp
yes

接下来我这边使用了windows版的redis-cli去连接linux上的redis

打开cmd进入到redis安装目录下,使用redis-cli测试远程连接linux上的redis:

D:\environments\Redis-x64-5.0.9>redis-cli -h 10.98.20.73 -p 6379 -a yourpassword
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.98.20.73:6379> ping
PONG
10.98.20.73:6379>

ping命令返回pong连接成功

六、将redis加入系统服务

进入最开始的redis程序目录下的utils文件夹

cd /usr/local/redis6.0.8/utils

拷贝redis_init_script到/etc/rc.d/init.d/目录下:

cp redis_init_script /etc/rc.d/init.d/

重命名redis_init_script文件名为redis

[root@tangjiang utils]# cd /etc/rc.d/init.d/
[root@tangjiang init.d]# ls
functions  netconsole  network  README  redis_init_script
[root@tangjiang init.d]# mv redis_init_script redis

接下来需要对该文件进行一些修改

REDISPORT=6379                    //端口如果需要可以自己修改
EXEC=/usr/local/bin/redis-server			//redis-server的目录 如果和我一样是使用make install安装到默认路径下那么就是这个
CLIEXEC=/usr/local/bin/redis-cli			//redis-cli的目录

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/bin/conf/myredis.conf"		//启动使用的配置文件

最后使用chkconfig --add redis 命令将redis加入系统服务即可,接下来就可以使用service start redis启动redis服务了

[root@tangjiang init.d]# chkconfig --add redis
[root@tangjiang init.d]# ps -ef|grep redis
root     55676 40955  0 01:34 pts/0    00:00:00 grep --color=auto redis
[root@tangjiang init.d]# service redis start
Starting Redis server...
[root@tangjiang init.d]# chkconfig redis on        //设置开机自启

参考文章:

redis安装:https://www.cnblogs.com/xsge/p/13841875.html

redis安装报错:https://www.jianshu.com/p/bec5b1016860

linux防火墙开放端口: https://blog.csdn.net/ywd1992/article/details/80401630

将redis设为系统服务: https://www.jianshu.com/p/e25dab3bd0e7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值