一、编译安装

Redis官网地址:redis官网,官网可能会打不开,可以在github的发布页中下载:Release-redis

当前最新版6.0-rc1,下载redis:

https://github.com/antirez/redis/archive/6.0-rc1.tar.gz
编译redis6.0需要GCC5以上版本,低版本会报错,如果GCC版本低于5,只能使用redis5.x版本。

解压源码文件编译:

tar -zxvf 6.0-rc1.tar.gz && mv 6.0-rc1 redis-6.0-rc1
cd redis-6.0-rc1
make MALLOC=libc

注意make的时候要添加MALLOC=libc参数,否则可能出现以下报错:

zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
 #include <jemalloc/jemalloc.h>
                               ^
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/redis-5.0.5/src'
make: *** [all] Error 2

这个参数的用处是指定redis使用的malloc函数为libc中的,默认情况下redis使用的是jmalloc,大部分系统默认没有安装,会报错。

编译完成后,安装redis到/usr/local/redis-6.0-rc1

sudo make PREFIX=/usr/local/redis-6.0-rc1 install

给安装目录创建软链接并添加到PATH路径下:

sudo ln -s /usr/local/redis-6.0-rc1/ /usr/local/redis
# 添加路径到PATH环境变量中
REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin

执行完成后,直接运行redis-server 就能启动redis了,可以加上--port 参数指定运行端口。

二、服务配置

默认的配置文件在安装目录下:redis.conf ,复制到/etc/redis/ 目录下:

mkdir /etc/redis
cp redis.conf /etc/redis/6379.conf
6379是redis的默认监听端口,根据不同端口来命名配置文件可以使主机同时运行多个redis实例,方便管理。

配置文件中的一些参数说明:

port 6379  # 默认的端口
dir ./  # 持久化文件存放路径
daemonize  no  # 是否以守护进程启动
pidfile /var/run/redis_6379.pid # pid文件路径
logfile ""  # 日志文件路径

添加redis用户:

useradd -M -s /sbin/nologin redis

设置目录权限:

chown redis.redis -R /usr/local/redis

三、添加服务

3.1 services服务

安装目录下的utils 默认有一个redis_init_script 脚本,复制到/etc/ini.d 目录下:

cp utils/redis_init_script /etc/init.d/redis_6379  # 6379是redis监听的端口号

里面需要修改的内容:

REDISPORT=6379  # 默认监听端口6379
EXEC=/usr/local/redis/bin/redis-server  # 服务端程序路径
CLIEXEC=/usr/local/redis/bin/redis-cli  # 客户端程序路径
PIDFILE=/var/run/redis_${REDISPORT}.pid  # pid文件路径
CONF="/etc/redis/${REDISPORT}.conf"  # 配置文件路径

启动和关闭redis:

/etc/init.d/redis_6379 start  # 启动
/etc/init.d/redis_6379 stop  # 关闭

3.2 systemd服务

使用systemd服务时,注意redis不能以守护进程启动:

daemonize no

复制以下内容到/etc/systemd/system/redis_6379.service

[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/redis-server /etc/redis/redis_6379.conf         
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

然后执行systemctl start redis_6379即可启动服务。

3.2 luanchd服务

luanchd服务是mac系统下的后台管理程序,把以下配置保存到文件homebrew.mxcl.redis.plist,然后放到~/Library/LaunchAgents/路径下(注意修改程序和日志文件路径):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>KeepAlive</key>
    <dict>
      <key>SuccessfulExit</key>
      <false/>
    </dict>
    <key>Label</key>
    <string>homebrew.mxcl.redis</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/redis/bin/redis-server</string>
      <string>/etc/redis/redis.conf</string>
    </array>
    <key>RunAtLoad</key>
    <false/>
    <key>WorkingDirectory</key>
    <string>/usr/local/redis</string>
    <key>StandardErrorPath</key>
    <string>/appdata/redis/redis.log</string>
    <key>StandardOutPath</key>
    <string>/appdata/redis/redis.log</string>
  </dict>
</plist>

编辑完成后,载入redis服务:

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

启动和关闭redis:

launchctl start ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
launchctl stop ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

上面的配置中没有设置开机自启,如果希望开机自启,要把18行的<false/>改成<true>

四、其他

4.1 低版本GCC编译redis-6.x报错问题

使用GCC4编译redis-6.0,会报错:

cd src && make all
make[1]: 进入目录“/data/software/redis-6.0-rc1/src”
    CC server.o
In file included from server.c:30:0:
server.h:1022:5: 错误:expected specifier-qualifier-list before ‘_Atomic’
     _Atomic unsigned int lruclock; /* Clock for LRU eviction */
     ^
server.c: 在函数‘serverLogRaw’中:
server.c:1020:31: 错误:‘struct redisServer’没有名为‘logfile’的成员
     int log_to_stdout = server.logfile[0] == '\0';

问题原因:

In old gcc version like 4.7/8, there is a bug that miss the macro like [STDC_NO_ATOMICS]

低版本的GCC例如4.7和4.8,有一个缺少类似[STDC_NO_ATOMICS]宏定义的BUG。

可参考fix: old gcc without atomic support compile failed

解决方案是升级GCC5或以上

最后修改:2020 年 02 月 18 日
如果觉得我的文章对你有用,请随意赞赏