当前位置:首页 > 问答 > 正文

Redis配置只读模式怎么弄,简单方法教你快速设置不复杂

要理解Redis的只读模式,其实就是限制某些客户端连接只能进行读取操作,GETLRANGE 等,而不能执行 SETDEL 等会修改数据的命令,这样做的好处是,当你的应用有像网站前台、查询服务这类只负责展示数据的部分时,可以让它们连接到只读的Redis,避免因为程序bug或误操作而意外修改或清空数据库,提高数据的安全性,实现这个目标有两个非常直接的方法,一个是通过修改配置文件,另一个是在运行时通过命令动态设置,我们一个一个来看。

第一个方法:修改Redis的配置文件,这是最常用也最彻底的方式。

Redis的所有配置都放在一个叫 redis.conf 的文件里,你需要找到这个文件,它通常位于Redis的安装目录下,如果你是用包管理器安装的,比如在Ubuntu上用apt安装,它可能在 /etc/redis/redis.conf

找到文件后,用文本编辑器打开它,比如可以用 nanovim,你需要寻找一个叫做 rename-command 的配置项,这个配置项的作用非常强大,它可以给任何命令换个名字,甚至直接禁用它,我们正是利用它来达到只读的目的。

思路是这样的:我们把所有危险的、会修改数据的命令,要么改成一个非常复杂、别人猜不到的名字(这样只有知道新名字的管理员才能用),要么直接把它重命名为一个空字符串,这样就彻底禁用这个命令了。

举个例子,我们想禁止 FLUSHALL 命令,因为它会清空整个Redis的所有数据,非常危险,我们就在 redis.conf 文件里加上这么一行:

rename-command FLUSHALL ""

这行代码的意思就是把 FLUSHALL 命令重命名为“空”,也就是禁用了,当客户端再尝试执行 FLUSHALL 时,Redis会报错,说这个命令不存在。

同样的道理,我们可以把其他关键的命令也禁掉,禁止修改数据的 SET 命令:

rename-command SET ""

禁止删除数据的 DEL 命令:

rename-command DEL ""

你还可以根据自己的需要,把 MSETHSETLPUSH 等一系列写操作命令都按这个方式处理,只留下 GETHGETLRANGESMEMBERS 这类只读命令不变。

全部设置好后,保存配置文件,然后最重要的一步是:重启Redis服务器,让新的配置生效,重启后,任何连接到这个Redis的客户端,都将无法执行被你禁用的命令,自然就实现了只读模式。

这个方法的好处是一劳永逸,配置一次之后就一直有效,安全性很高,但缺点是需要重启服务,并且在重启前一定要确认你的管理员账号有办法通过其他方式(比如知道新的命令名)来管理数据库,否则把自己也锁在外面就麻烦了。

第二个方法:使用 CONFIG SET 命令动态设置,这个方法更灵活,不需要重启。

如果你的Redis正在线上运行,不方便重启,或者你只是想临时设置一下只读模式,那么这个方法是更好的选择,你可以通过Redis的命令行工具 redis-cli 直接连接上服务器,然后输入命令来实时修改配置。

这个命令的写法和在配置文件里几乎一样,只是换了一种形式,我们还是想禁用 FLUSHALL 命令,可以这样输入:

CONFIG SET rename-command FLUSHALL ""

Redis会立刻回复一个 OK,表示设置成功,从这一刻起,FLUSHALL 命令就被禁用了,所有连接立即生效,你可以马上试试输入 FLUSHALL,会发现已经不能用了。

用同样的方式,你可以动态地禁用任何你想禁用的写命令:

CONFIG SET rename-command SET ""
CONFIG SET rename-command DEL ""

这种方法非常灵活,随用随设,用完还可以再改回来,它有一个重要的特点:这个设置是临时的,当Redis服务器重启后,所有这些通过 CONFIG SET 做的修改都会丢失,配置会变回 redis.conf 文件里的样子。

如果你希望这次动态设置也能永久生效,可以在用 CONFIG SET 命令修改完之后,再执行一个命令:

CONFIG REWRITE

这个命令会把当前内存中的配置立刻写回到 redis.conf 文件里,这样下次重启就会自动加载你刚才的修改了。

  • 追求永久生效、不怕重启:就用第一种方法,直接修改 redis.conf 文件,然后重启Redis。
  • 需要临时调整、避免重启:就用第二种方法,通过 redis-cli 连接后使用 CONFIG SET 命令,如果想变永久,记得再加一句 CONFIG REWRITE

最后提醒一点,无论用哪种方法,在操作前最好都先备份一下你的 redis.conf 文件,并且在一个不重要的测试环境里先试一试,确认效果符合你的预期,然后再到正式环境中去操作,这样最稳妥,希望这些简单直接的方法能帮到你。

Redis配置只读模式怎么弄,简单方法教你快速设置不复杂