Redis,一个开源、支持多种数据结构,亦支持集群和副本且高性能的内存存储。尽管它可被视为内存数据库,但更多地,我们在程序中把它当成缓存使用。缓存的内容也是多种多样,举几个简单的例子,常备访问的数据、维持会话的token,验证码等时效性较强的数据……

在搭建redis服务器,官方给出的教程是通过源码自行编译和安装。说是说make是个神器,但在ubuntu中,系统的软件源早已为我们准备好了一切,let’s go!

1
apt install redis-server

一步搞定有木有?嗯,想要挑战一下官方教程的当然也可以,看这里这里。我自己其实也试验过,没有想象的那么复杂,无非gcc和make报几个错,缺少依赖的头文件什么的,解决起来也挺简单。

前面的一键安装事实上同时安装好了server和client,在终端中运行

1
redis-cli

就会自动连接localhost:6379上的redis-server,试着执行几个命令(“127.0.0.1:6379>”打头的行是我们的输入,顶格的行是redis的输出)

1
2
3
4
5
6
7
8
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set hello "world"
OK
127.0.0.1:6379> get hello
"world"

这样一来redis其实已经可用了,但还不够,至少我们要修改一下端口号、绑定的网卡、数据和日志文件路径什么的,vim打开/etc/redis/redis.conf,找到下面几行,大概位于50~200行之间,做相应的修改即可

1
2
3
4
port 6379
bind 127.0.0.1
logfile /var/log/redis-server.log
dir /var/lib/redis

修改完问题就来了,redis服务停止以后再也启动不了了,因为是systemd启动服务时出错,所以日志打到了/var/log/syslog里边,一开始找了有些时候,看错误日志,说的是

Jan 14 06:08:56 pocket-erp-db redis-server[3118]: Reading the configuration file, at line 108
Jan 14 06:08:56 pocket-erp-db redis-server[3118]: >>> ‘logfile /data/logs/redis/redis-server.log’
Jan 14 06:08:56 pocket-erp-db redis-server[3118]: Can’t open the log file: Read-only file system

神马??说日志所在的/data挂载点是只读的?因为/data挂载的是一块云硬盘,实习那会在公司的测试机上也碰到过类似奇怪的问题。但这回先是mount看了一眼,显示是rw的,试着往里写个文件,也没啥异常,这就奇了怪了。

谷歌走起,先是找到了这个,他说是升级以后引入的BUG,重启一下就没事了,但我试了并不管用,后来找到了这个,才是问题根本的原因。

原来redis认定的“Read-only file system”跟mount显示的结果并不是一回事,他有他自己的一套逻辑,这个逻辑实质上位于systemd的配置中,vim打开/etc/systemd/system/redis.service,会看到下面几行

1
2
3
4
ReadOnlyDirectories=/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/var/run/redis

原来除了指定的这3个目录,其他目录对于redis来说都是只读的,难怪会报错呢,改就一个字!别忘了改完这个文件要

1
systemctl daemon-reload

重新加载下systemd。

等下!打住!做这几步操作之前麻烦先把服务停下来,虽然我也不确定是不是就是这个原因,我在服务运行期间做了上面的几个操作,再回过头来想重启服务时,卡在了停止服务那一步,更可怕的是,redis设置了“永不超时”……最后费尽周折好不容易重启了服务,幸好没出啥大篓子。