一、编译安装
Redis官网地址:redis官网,官网可能会打不开,可以在github的发布页中下载:Release-redis。
当前最新版6.0-rc1,下载redis:
1 |
https://github.com/antirez/redis/archive/6.0-rc1.tar.gz |
编译redis6.0需要GCC5以上版本,低版本会报错,如果GCC版本低于5,只能使用redis5.x版本。
解压源码文件编译:
1 2 3 |
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
参数,否则可能出现以下报错:
1 2 3 4 5 6 7 |
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
:
1 |
sudo make PREFIX=/usr/local/redis-6.0-rc1 install |
给安装目录创建软链接并添加到PATH路径下:
1 2 3 4 |
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/
目录下:
1 2 |
mkdir /etc/redis cp redis.conf /etc/redis/6379.conf |
6379是redis的默认监听端口,根据不同端口来命名配置文件可以使主机同时运行多个redis实例,方便管理。
配置文件中的一些参数说明:
1 2 3 4 5 |
port 6379 # 默认的端口 dir ./ # 持久化文件存放路径 daemonize no # 是否以守护进程启动 pidfile /var/run/redis_6379.pid # pid文件路径 logfile "" # 日志文件路径 |
添加redis用户:
1 |
useradd -M -s /sbin/nologin redis |
设置目录权限:
1 |
chown redis.redis -R /usr/local/redis |
三、添加服务
3.1 services服务
安装目录下的utils
默认有一个redis_init_script
脚本,复制到/etc/ini.d
目录下:
1 |
cp utils/redis_init_script /etc/init.d/redis_6379 # 6379是redis监听的端口号 |
里面需要修改的内容:
1 2 3 4 5 |
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:
1 2 |
/etc/init.d/redis_6379 start # 启动 /etc/init.d/redis_6379 stop # 关闭 |
3.2 systemd服务
使用systemd服务时,注意redis不能以守护进程启动:
1 |
daemonize no |
复制以下内容到/etc/systemd/system/redis_6379.service
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[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 launchd服务
2020-02-18添加mac系统下launchctl配置。
luanchd服务是mac系统下的后台管理程序,把以下配置保存到文件homebrew.mxcl.redis.plist
,然后放到~/Library/LaunchAgents/路径下(注意修改程序和日志文件路径):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?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配置文件:
1 2 |
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist |
启动和停止进程:
1 2 |
launchctl start homebrew.mxcl.redis launchctl stop homebrew.mxcl.redis |
上面的配置中没有设置开机自启,如果希望开机自启,要把18行的<false/>
改成<true>
。
四、其他
4.1 低版本GCC编译redis-6.x报错问题
使用GCC4编译redis-6.0,会报错:
1 2 3 4 5 6 7 8 9 10 |
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或以上
评论