昨天把 rucaptcha 升级到 v1.1.1 时发现多一个配置:self.cache_store = :mem_cache_store
所以打算在系统中添加入 redis_store 作为缓存载体。一直以来在 Rails 项目中引入 redis 都是在官方文档引导下逐个步骤安装 redis-server 并添加相关 gem ,所以索性把这个过程自己总结写下来,后面如果在其他服务器,其他项目需要重复这个过程时再次翻阅这篇文章就是了。
在本篇文章中我们将会详细介绍在 Ubuntu 16.04 上编译安装和常规设置,及在 Rails 项目中的设置。
简介
Redis 是一种以其灵活性、高性能以及多语言支持著称的内存级键值对存储。
准备工作
基于最新的 Ubuntu 服务器系统文档版本,在安装过程中通过 sudo 权限,使用非 root 用户进行系统管理员权限操作。查阅 Initial Server Setup with Ubuntu 16.04
接下来就是需要安装编译环境及编译结果测试依赖工具。为了在机器上安装最新稳定版本的 redis ,我们需要从源码编译安装,所以需要编译安装环境 build-essential 。为了测试编译产生的二进制文件,同时需要安装 tcl 包。
sudo apt-get update
sudo apt-get install build-essential tcl
下载、编译、安装 Redis
因为我们从源码中编译之后不想保存源码,所以把源码下载到 /tmp
目录下就好了。
cd /tmp
curl -O http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-stable.tar.gz
cd redis-stable
接着就是编译和安装
make
编译二进制文件之后,为确保编译步骤都执行成功,我们可以运行测试用例,运行测试用户需要等待几分钟(这一步是可选的,非必做步骤)
make test
编译完成之后,在 /tmp/redis-stable/src
目录下会出现六个可执行文件,分别为:
- redis-server is the Redis Server itself.
- redis-sentinel is the Redis Sentinel executable (monitoring and failover).
- redis-cli is the command line interface utility to talk with Redis.
- redis-benchmark is used to check Redis performances.
- redis-check-aof and redis-check-dump are useful in the rare event of corrupted data files.
通常会把redis-server
和redis-cli
这两个可执行文件拷贝到 /usr/local/bin/
目录下(这里假设 /usr/local/bin 目录在环境变量中)
sudo cp src/redis-server /usr/local/bin/
sudo cp src/redis-cli /usr/local/bin/
或者不通过拷贝的方式,我们也可以执行下面的命令达到一样的效果。
sudo make install
Redis 配置
sudo mkdir /etc/redis
sudo cp /tmp/redis-stable/redis.conf /etc/redis
然后编辑配置文件,需要改的指令如下
supervised systemd # 因为 Ubuntu 使用 systemd 作为系统启动初始化系统
dir /var/lib/redis # 保存持久化数据文件目录,下文会设计到这个文件目录的讨论
新建 Redis 服务进程系统启动文件
sudo vi /etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
新建 redis 用户,用户组及持久化文件目录
为了保障安全性 redis 服务进程系统启动文件指定 redis 用户及用户组而不是 root 用户。
sudo adduser --system --group --no-create-home redis
sudo mkdir /var/lib/redis
sudo chown redis:redis /var/lib/redis //更改文件目录拥有者属性
sudo chmod 770 /var/lib/redis // 更改文件目录读写模式,只允许 redis 用户及超级管理员
redis 服务启动及测试
sudo systemctl start redis //Start up the systemd service
sudo systemctl status redis //Check that the service had no errors
为了测试 redis 服务的实例是否正常启动,可使用 redis-cli
连接 redis-server
trusblock@i-m6rhh3ub:/etc/redis$ redis-cli
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> set test "It's working!"
OK
127.0.0.1:6379> get test
"It's working!"
127.0.0.1:6379> exit
trusblock@i-m6rhh3ub:/etc/redis$ sudo systemctl restart redis
trusblock@i-m6rhh3ub:/etc/redis$ redis-cli
127.0.0.1:6379> get test
"It's working!"
127.0.0.1:6379> exit
当所有的测试都成功之后,我们可以设置 redis-server 服务开机启动
sudo systemctl enable redis
Rails 项目中引入 Redis 设置
- gem
gem 'redis'
gem 'redis-namespace'
gem 'redis-rails'
gem 'redis-rack-cache' #Rails 5 API 没有 Rack::Cache middleware,可不需要引入这个 gem
- configure
# config/application.rb
config.cache_store = :redis_store, 'redis://localhost:6379/0/cache', { expires_in: 90.minutes }
# config/initializers/redis.rb
$redis = Redis::Namespace.new("site_point", :redis => Redis.new)
- test
在 Rails c 命令行中测试
$redis.set("test_key", "Hello World!")
$redis.get("test_key")
```
### 推荐阅读
- [Rails Model Caching with Redis](https://www.sitepoint.com/rails-model-caching-redis/)
- [Redis Quick Start](http://redis.io/topics/quickstart)
- [A web interface for managing redis: cli, admin, and live monitoring](https://github.com/steelThread/redmon)