如何在 Debian 安装和使用 Redis

950 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

为什么要上手

作为一名业务后端开发,上手去体验不同的存储系统是很重要的学习机会,也是必要的。

在微服务化的今天,很多公司都有专门的基建团队来维护 MySQL,Redis,Elasticsearch,PostgreSQL 等存储。内部会做很多优化,proxy 的设计也各不相同。从业务研发的角度看,很少需要自己去手把手安装这些存储组件,而是提个单子就 ok。至于组件的用法,原理,市面上大量的文献已经涉及,大致看一看,知道怎么用。然后在公司的测试集群上跑代码即可。

不可否认,这是很多业务开发的心态。但如果你想搞懂一个存储系统的原理,学会怎么用才能让性能最好,知道系统的瓶颈,只靠线上代码是远远不够的。

很难想象一个自称精通 MySQL,Redis 的面试候选人站出来说,其实自己从来没自己安装和管理过这些存储,全是靠 DBA 来搞定的。如果没有自己上手操作,就很难有动机去了解细节的配置,能力,总是会浮在表面上。

同时,测试环境的库表也不应该随便操作。在云计算的时代,作为开发者,我们最佳的学习方式还是自己到云厂商申请 EC2 开发机,有需要的话搭一个集群,在一个所有配置都可以自己定的环境里,一步步上手,解决问题。至于是阿里云,AWS 还是 GCP,Azure 都 ok。

出于这个目的,我们此前一篇文章 如何在 Debian 10 安装 MySQL 就给大家介绍了如何安装 MySQL server,只要一步步来就 ok,我们可以基于自己的开发机来做调试,建表,不用担心污染生产或公司的测试环境。

有了自己的环境,存储,条件具备了我们才有更多动力去改参数,试错,向着更深层次前进。

今天我们来看看怎样在 Debian 环境中安装 Redis 的 server,以及通过 cli 工具连接。

Redis

image.png

The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.

redis> PING
"PONG"
redis> HSET user:1 name antirez vocation artist
(integer) 2
redis> SET e 2.71
"OK"
redis> INCRBYFLOAT e 0.43
"3.14"
redis> RENAME e pi
"OK"

Redis 是什么相信不用多说,可以说是市面上使用最广泛的开源高性能内存存储,用C语言实现。这些年来经常有竞品宣扬性能超过 Redis,但不可否认工业界最稳定,可信赖的选型,在这个阶段还是 Redis。

本文只是个开篇,这里把 Redis 官方最重要的一些学习和文档链接附上,感兴趣的同学可以直接去了解:

这里额外推荐两个有意思的 Golang 实现的库:

  1. miniredis:为了单测设计的经典 fake 方案,我们此前的测试系列有文章介绍,感兴趣的同学可以了解一下;
  2. godis:一个国人大佬用 Golang 实现的 Redis server 和分布式集群,同样超过 2k 的 star。Finley blog 里面有对实现思路的描述,大家可以学习一下。此外非常推荐基于 Redis 7.0.4 的中文注释项目,如果大家想了解源码,可以在这里有更深刻体会,也可以来 PR。

如何安装

Redis 官方提供了几种安装方式,不过本着学习的目的,最好的还是下载源码安装。事实上 Redis 除了 C 编译器和 libc 外,是不存在其他依赖的,非常方便。

下载稳定版

wget https://download.redis.io/redis-stable.tar.gz

从官方下载最新的稳定版本的 Redis 压缩包,我们直接在自己目录运行即可。

解压编译

tar -xzvf redis-stable.tar.gz
cd redis-stable

解压我们下载的 redis-stable.tar.gz 后,我们可以进入目录看一下

ag9920:~/redis-stable$ ls
00-RELEASENOTES  CODE_OF_CONDUCT.md  COPYING  dump.rdb	Makefile   README.md   runtest		runtest-moduleapi  SECURITY.md	  src	 TLS.md
BUGS		 CONTRIBUTING.md     deps     INSTALL	MANIFESTO  redis.conf  runtest-cluster	runtest-sentinel   sentinel.conf  tests  utils

这里的 src 目录就是 redis 的源码

image.png

我们用上一篇文章介绍过的make 命令进行编译:

make

这里可能要花一段时间,结束之后,我们在 src 目录下就能看到

  • redis-cli: 和 Redis server 交互的CLI 工具
  • redis-server: Redis server

我们还可以将其安装到 /usr/local/bin 目录下:

make install

前台启动和停止 server

好了,如果你完成了上面的步骤,现在我们就有了 redis server 可以使用。

我们可以看下 redis-stable 目录下的 redis.conf 文件,看看启动到哪个端口:

image.png

图中可以看出,这里默认会在 6379 端口执行。鉴于我们已经把它安装到 /usr/local/bin了,下来可以直接执行启动:

$ redis-server
2181470:C 22 Oct 2022 14:10:41.626 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2181470:C 22 Oct 2022 14:10:41.627 # Redis version=7.0.5, bits=64, commit=00000000, modified=0, pid=2181470, just started
2181470:C 22 Oct 2022 14:10:41.627 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
2181470:M 22 Oct 2022 14:10:41.627 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 7.0.5 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 2181470
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

2181470:M 22 Oct 2022 14:10:41.629 # Server initialized
2181470:M 22 Oct 2022 14:10:41.629 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
2181470:M 22 Oct 2022 14:10:41.630 * Loading RDB produced by version 7.0.5
2181470:M 22 Oct 2022 14:10:41.630 * RDB age 3566 seconds
2181470:M 22 Oct 2022 14:10:41.630 * RDB memory usage when created 0.82 Mb
2181470:M 22 Oct 2022 14:10:41.630 * Done loading RDB, keys loaded: 0, keys expired: 0.
2181470:M 22 Oct 2022 14:10:41.630 * DB loaded from disk: 0.000 seconds
2181470:M 22 Oct 2022 14:10:41.630 * Ready to accept connections

可以看到,我们安装的 Redis server 版本为 7.0.5,目前已经在 6379 端口启动,进程号 2181470。可以接受 client 端的连接了。

此时的 Redis server 是直接在前台启动,想要停止也很简单,直接 Ctrl-C 即可。

^C2181470:signal-handler (1666419151) Received SIGINT scheduling shutdown...
2181470:M 22 Oct 2022 14:12:31.553 # User requested shutdown...
2181470:M 22 Oct 2022 14:12:31.553 * Saving the final RDB snapshot before exiting.
2181470:M 22 Oct 2022 14:12:31.558 * DB saved on disk
2181470:M 22 Oct 2022 14:12:31.559 # Redis is now ready to exit, bye bye...

查看端口占用

这里补充一个知识点,很多同学发现安装的时候会默认启动,导致上一步自己想在前台执行 redis-server 命令总是报端口占用,那怎么来看此前有没有程序启动在 6379 端口呢?

常见的方案为 netstatlsof,建议大家不熟悉的话看一下这三篇文章:

在我们这次 demo 的 Debian 系统下更建议用 ss 命令,这里可能需要安装一下 iproute2 的依赖:

在 Debian 10 系统中打开终端,并在其中执行以下命令:

$ sudo apt install iproute2

要检查 Debian 系统上的开放端口,请在终端中执行以下命令:

$ sudo ss -tulpn

参数介绍:

  • -t, –tcp: 查看所有 TCP 套接字
  • -u, –udp: 查看所有 UDP 套接字
  • -l, –listening: 查看所有监听套接字
  • -p, processes: 查看哪些进程正在使用套接字
  • -n, –numeric: 如果您想查看端口号而不是服务名称,请使用此选项

在输出中,将会看到所有侦听 TCP 和 UDP 连接的列表。 注意:如果您在 ss 命令中使用 -p 或 –processes 选项,您必须是 root 用户或具有 sudo 权限的用户。否则,您将无法看到端口上运行的进程的进程标识号 (PID)。

我们还是启动一个 redis server,然后使用 sudo ss -tlpn 看一下效果(这里我们已知 Redis 走的是 TCP,所以不用加上 UDP 选项)

$ sudo ss -tlpn

State                     Recv-Q                    Send-Q                                       Local Address:Port                                          Peer Address:Port
.....
LISTEN                    0                         511                                                0.0.0.0:6379                                               0.0.0.0:*                        users:(("redis-server",pid=2185243,fd=6))
.....

这里可以看到,redis-server 的确是在 6379 端口。

后台启动和停止

类似 How can I stop redis-server? 这样的问题还不少,很多小伙伴发现 redis-server 已经在后台启动了,这时候没法 Ctrl-C 了,怎么停止呢?

如果我们想重新在后台启动又要怎么办呢?这里就要用到我们的 daemon 命令即可,使用下面三个命令就可以在后台对 redis server 进行启动,停止,重启。

/etc/init.d/redis-server stop
/etc/init.d/redis-server start
/etc/init.d/redis-server restart

除此外,我们也可以通过 redis-cli 客户端连接 server,发送 shutdown 指令:

redis-cli shutdown

这时候会看到下面的日志:

User requested shutdown...
[6716] 02 Aug 15:48:44 * Saving the final RDB snapshot before exiting.
[6716] 02 Aug 15:48:44 * DB saved on disk
[6716] 02 Aug 15:48:44 # Redis is now ready to exit, bye bye...

redis-cli

cli 工具可以帮助我们很方便地在命令行测试,详细的使用说明可以参考官方cli手册

事实上,由于我们把 redis-cli 和 redis-server 都安装到了 /usr/local/bin 所以这里也可以直接用:

$ redis-cli

127.0.0.1:6379>

你会发现默认直接就能连上本地的 6379 端口,这里官方也作出了说明

By default, redis-cli connects to the server at the address 127.0.0.1 with port 6379. You can change the port using several command line options. To specify a different host name or an IP address, use the -h option. In order to set a different port, use -p.

假设我们的 client 和 server 不在一个机子上,我们也可以通过 -h 来指定 ip 地址,用 -p 来输入端口:

$ redis-cli -h redis15.localnet.org -p 6390 PING
PONG

如果设置了密码,可以用 -a 命令带上去:

$ redis-cli -a myUnguessablePazzzzzword123 PING
PONG

redis-cli 的交互模式会在键入命令的时候给出 hint,这里还是非常方便的

image.png

下来大家就可以随意尝试自己的测试命令了:

$ redis-cli
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> set a ag9920
OK
127.0.0.1:6379> get a
"ag9920"
127.0.0.1:6379>

结语

这篇文章我们一起了解了 Redis 的安装和连接,希望大家都能够本地,或者开发机尝试一下,以此为起点,深入思考存储系统的特点和原理。Have Fun !