Ubuntu16.04安装Redis

Positano 波西塔诺

网上译文:如何在Ubuntu 16.04上安装并配置Redis

原文:How To Install and Configure Redis on Ubuntu 16.04

结合GitHub安装介绍 的添加版(默认安装64位):

内容介绍

Redis是一套内存内键-值存储方案,向来以出色的灵活性、性能与广泛的语言支持能力而著称。今天,我们将共同了解如何在Ubuntu 16.04服务器上安装并配置Redis。

先决条件

要完成本教程,大家首先需要接入一套Ubuntu 16.04服务器。另外,还需要一个非root用户并以sudo权限执行各项命令。关于这部分内容,请参阅Ubuntu 16.04 初始服务器设置指南一文。

准备就绪后,利用sudo用户登入Ubuntu 16.04服务器。

安装Build并测试依赖

为了获取Redis的最新版本,我们将用源码编译安装该软件。在代码下载完成前,我们需要满足构建依赖以至于可以编译该软件。

首先从Ubuntu仓储安装build-essential meta-package。另外还需要下载tcl软件包以用于二进制代码测试。

我们可以通过以下命令更新本地apt软件包缓存并安装依赖:

sudo apt-get update
sudo apt-get install build-essential tcl

Redis 有一些依赖被包含在 deps 目录下。make 命令不会自动的重建依赖,即使以来的源码发生改变。

当用 git pull 命令来更新源码时或者当依赖关系树中的代码以任何其他方式修改时,确保使用一下命令来真正地清理掉所有东西并从头开始重建

make distclean

这个命令将清理掉jemalloc, lua, hiredis, linenoise.

下载、编译并安装Redis

接下来开始构建Redis。

下载并提取源代码

由于我们不需要保留源代码,所以直接在/tmp目录内进行build:

Since we won't need to keep the source code that we'll compile long term (we can always re-download it), we will build in the /tmp directory. Let's move there now:

cd /tmp

现在下载Redis最新稳定版,大家可以使用一直可用的稳定版下载URL:

curl -O http://download.redis.io/redis-stable.tar.gz

解压tar:

tar xzvf redis-stable.tar.gz

前往Redis解压目录:

cd redis-stable

Build并安装Redis

现在对Redis二进制代码进行编译:

make

编译完成后,运行测试套件以确保built正确:

make test

这一过程通常需要几分钟。完成后,大家可以使用以下命令进行安装:

sudo make install

You can use make PREFIX=/some/other/directory install if you wish to use a different destination.

关于分配器问题:

在构建 Redis 结束的时候可以通过设置 MALLOC 环境变量来选择一个非默认的内存分配器。Redis默认使用 libc malloc 进行编译链接,除了Linux系统上缺省jemalloc 使用之外。挑选这个默认值是因为jemalloc已经证明比libc malloc更少的碎片问题。

强制使用 libc malloc

make MALLOC=libc

在Mac OS X系统上针对jemalloc进行编译

make MALLOC=jemalloc

make 安装将仅仅会在系统上安装二进制文件,但是不会配置初始化脚本和在合适的地方配置文件。如果你仅仅是想要玩一下就可以忽略配置,使用默认就好;但是如果你安装是为了在生产环境中使用,在Ubuntu 和 Debian 系统上我们有一个脚本专门进行配置的(如果运行以下脚本,默认设置会和原文在名称上有所冲突,但也可更改。如果按照本文逐条设置将不会成功)。

cd utils
./install_server.sh

这个脚本将会问你几个简单的问题,并将设置一切所需,以便将Redis作为后台守护程序正常运行,这将在系统重新启动时重新开始。

你可以通过使用脚本名字/etc/init.d/redis_<portnumber>开启和停止Redis。

配置Redis

Redis已经安装完成,接下来进行配置。首先创建一个配置目录,这里我们使用/etc/redis目录:

sudo mkdir /etc/redis

将Redis源归档文件内的示例Redis配置文件复制进来:

sudo cp /tmp/redis-stable/redis.conf /etc/redis

而后打开文件并进行调整:

sudo nano /etc/redis/redis.conf

在文件中找到supervised命令。现在其被设置为no。由于我们运行的操作系统使用systemd init系统,因此需要将其变更为systemd:

/etc/redis/redis.conf

. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

下面找到dir目录。此选项指定Redis用于放置持久数据的目录。我们需要挑选合适的位置,并确保Redis有权限写入但普通用户无权查看。

这里我们使用/var/lib/redis目录,稍后进行创建:

/etc/redis/redis.conf

. . .

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis

. . .

完成后保存并退出。

创建Redis systemd Unit文件

接下来,我们可以创建一个systemd unit文件,从而利用该init系统管理Redis进程。

首先创建并打开/etc/systemd/system/redis.service文件:

sudo nano /etc/systemd/system/redis.service

在这里,我们在[Unit]部分处添加一条描述,定义要求网络在服务启动前必须处于可用状态:

/etc/systemd/system/redis.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target

在[Service]部分,我们需要指定该服务的运作方式。出于安全考虑,我们不应以root方式运行服务。我们应当使用专用用户及群组,并以此调用redis。我们稍后再创建这部分内容。

要启动服务,我们只需要在配置中调用redis-server二进制文件。要将其关闭,则可使用Reids的shutdown命令,其可利用redis-cli加以执行。另外,由于我们希望Redis能够在故障情况下得到恢复,因此需要将Restart指令设定为“always”:

/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]部分,我们将systemd定义为在该服务可用时始终关联(即在引导过程中即行启动):

/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

完成后保存并退出。

注: 我不知道为什么我的不能运行错误信息是

sudo systemctl status redis
● redis.service - Redis In-Memory Data Store
   Loaded: loaded (/etc/systemd/system/redis.service; disabled; vendor preset:
   Active: inactive (dead)

May 30 16:12:35 ubuntu systemd[1]: redis.service: Service hold-off time over, 
May 30 16:12:35 ubuntu systemd[1]: Stopped Redis In-Memory Data Store.
May 30 16:12:35 ubuntu systemd[1]: Started Redis In-Memory Data Store.
May 30 16:12:35 ubuntu systemd[1]: redis.service: Service hold-off time over, 
May 30 16:12:35 ubuntu systemd[1]: Stopped Redis In-Memory Data Store.
May 30 16:12:35 ubuntu systemd[1]: Started Redis In-Memory Data Store.
May 30 16:12:36 ubuntu systemd[1]: redis.service: Service hold-off time over, 
May 30 16:12:36 ubuntu systemd[1]: Stopped Redis In-Memory Data Store.
May 30 16:12:36 ubuntu systemd[1]: redis.service: Start request repeated too q
May 30 16:12:36 ubuntu systemd[1]: Failed to start Redis In-Memory Data Store.

在/etc/systemd/system/redis.service 文件 [Service] 中 加上 Type=forking 后解决。

创建Redis用户、群组与目录

现在我们创建前两个文件所引用的用户、群组与目录。

首先创建reids user与group,命令如下:

sudo adduser --system --group --no-create-home redis

现在创建/var/lib/redis目录:

sudo mkdir /var/lib/redis  # 设置这样的一个目录是因为在redis.conf配置文件中设置了该路径为数据存储路径

为redis user与group分配此目录的所有权:

sudo chown redis:redis -R /var/lib/redis
# redis 的日志目录也需要设置,如果设定的话
sudo chown redis:redis /var/log/redis_6379.log(脚本自行设置的名称)

调整权限以确保普通用户无法访问该位置:

sudo chmod 770 /var/lib/redis

启动并测试Redis

现在,我们可以启动Redis服务器了。

启动Redis服务

下面启动此systemd服务:

sudo systemctl start redis

检查服务中是否存在错误:

sudo systemctl status redis

结果应如下所示:

Output
● redis.service - Redis Server
   Loaded: loaded (/etc/systemd/system/redis.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2016-05-11 14:38:08 EDT; 1min 43s ago
  Process: 3115 ExecStop=/usr/local/bin/redis-cli shutdown (code=exited, status=0/SUCCESS)
 Main PID: 3124 (redis-server)
    Tasks: 3 (limit: 512)
   Memory: 864.0K
      CPU: 179ms
   CGroup: /system.slice/redis.service
           └─3124 /usr/local/bin/redis-server 127.0.0.1:6379       

. . .

测试Redis实例功能

要测试服务是否正常起效,首先使用以下命令接入Redis服务器:

redis-cli

在提示符中测试连接情况:

127.0.0.1:6379> ping

输出结果如下:

Output
PONG

大家可以设置需要的返回结果:

127.0.0.1:6379> set test "It's working!"

Output
OK

现在再次检查:

127.0.0.1:6379> get test

取得的则为预存值:

Output
"It's working!"

退出Redis提示符并返回shell:

127.0.0.1:6379> exit

作为最后一步测试,我们重启Redis实例:

sudo systemctl restart redis

现在再次接入客户端并确认测试值仍然可用:

redis-cli

127.0.0.1:6379> get test

返回的值应该仍然为:

Output
"It's working!"
#如果失败可能是因为数据未持久化,重启服务导致数据丢失。

完成后再次返回shell:

exit

确保Redis在引导过程中启用

如果测试圆满成功,接下来要做的是确保Redis在引导过程中自动启用。

具体命令如下:

sudo systemctl enable redis

Output
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service.

总结

现在大家已经完成了Redis实例的安装与配置。要了解更多与Redis保护相关的内容,请参阅如何在Ubuntu 14.04上保护Redis (从第三步开始)。虽然此文面向Ubuntu 14.04编写,但基本完全适用于16.04版本。

一些命令吧:
redis-cli -p 6379 info server  # 显示redis信息
/etc/init.d/redis_6379 start/stop/status  # 

其实 install_server.sh 脚本已经做了上面的工作,只是名称不同。注意保持一下文件在个文件中名称一致,以及权限拥有问题。

以下是我的配置:
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容