这篇文章记录一下redis
的两种客户端与服务器连接的方式,以及相应的配置项,也分享下自己探索过程的一些无知 (公开处刑) 。
Tip: 你可以直接看4.总结
^ _ ^。
1. 前景
最近在学习公司的一个关于BMC
的项目,其中包括了redis
的相关内容(用于缓存一些对象)。由于刚开始学习BMC
,所以想知道redis
中到底缓存了些什么对象,于是乎上网开始查找怎样登录redis
服务器,怎样获取缓存信息。不出所料,资料一大堆,都是在说有两种方式,一种是提供IP和端口登录(本地不需要提供,直接使用默认即可),另外一种是使用unix socket
登录。我暗暗窃喜,原来怎么简单,我先是使用第一种方法尝试登录BMC
中的redis
服务器,然而问题立马就出来了(因为是本地,我直接用的redis-cli
命令),系统报错:
$ ./redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>
不慌,我还有第二种方法,我又在网上找unix socket
登录的方式(socket 文件存放位置由redis
配置文件中的unixsocket
指定),然而还是失败了:
$ ./redis-cli -s /tmp/redis.sock
Could not connect to Redis at /tmp/redis.sock: Permission denied
not connected>
2. 开始挣扎
在两个方法都失败后,我有点怀疑,难道我哪里做错了么。我先分析了第一种办法,错误信息是不能连接,这有可能是系统设定了其他端口号导致的,于是我先使用ps
命令查看了redis-server
的状态:
sysadmin 1001 0.1 0.5 27988 1892 ? Ssl 08:14 0:02 /usr/bin/redis-server *:0
好家伙,超级管理员启动的进程,而且居然没有指定的IP地址,端口号也为0,我上网搜了下端口为0的意思,大部分人都在说这是让系统自动分配端口的意思(吐槽一下,为什么好多博客都在复制粘贴)。一个idea瞬间在我脑中迸发,只要把所有正在监听的端口号都试试,看看哪个能连接通不就好了吗(我他娘真是个天才)。与此同时,为了能够减少工作量,我试着用netstat
命令打印出PID
(好处是使用和上面ps
打印redis-server
的PID
对应的信息即可),然而busybox
提供的ps
工具是在太low了,不提供该选项。所以,我便开始了试错之旅,不过令我惊讶的是,第一次居然就成功了:
~ $ ./redis-cli -p 7578
127.0.0.1:7578>
哦哈哈,我当时候真以为自己真的是天才,然而我还是太抬举了自己了,在测试命令时,又报错了:
~ $ redis-cli -p 7578
127.0.0.1:7578> KEYS *
Error: Protocol error, got "\x17" as reply type byte
不过我没太在意,但在测试了所有tcp
正在监听的端口后,居然没有一个能够成功使用。这时,我的笑容逐渐凝固。我上网找错误原因,但没有一个能让我满意,于是我开始怀疑配置项,直到找到这么一行话,我才发现自己有多蠢:
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 0
原文大意:默认接受端口6379,或者接受一个指定端口,但若端口为0,redis
不在监听TCP socket
连接。
3. 选择放弃
在发现这个配置项后,我知道了第一种办法是行不通的,因为我不是超级管理员,改不了这个端口号。这时,转眼再看第二种方法,错误信息显示权限拒绝。我看了下服务器暴露的那个socket文件:
~ $ ls /run/redis/ -al
total 4
drwxr-xr-x 2 sysadmin sysadmin 80 Dec 9 16:14 .
drwxrwxrwx 10 sysadmin sysadmin 800 Dec 9 20:54 ..
-rw-r--r-- 1 sysadmin sysadmin 5 Dec 9 16:14 redis-server.pid
srwx------ 1 sysadmin sysadmin 0 Dec 9 16:14 redis.sock
好吧,我没有权限使用这个socket,其实配置项早就指定了这个文件的权限:
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
unixsocket /run/redis/redis.sock
unixsocketperm 700
700指定了服务器创建的socket文件权限为rwx------
。至此,我选择放弃,。。。好想要超级权限呀。。。
4. 总结
客户端连接redis-server
有两种方式:
- 使用
TCP
连接
如果你是在本地登陆的,那么直接使用redis-cli
命令即可,如果远程,必须指定IP,redis-cli -p port -h IP
,当然啦,前提必须是服务器的配置中端口号不为0,且绑定地址正确,具体查看配置项bind
和port
。最后要说明一下,如果服务器指定了requirepass
选项(密码),你必须在登陆的时候提供这个选项-a password
,尽管一般服务器不会设置这个选项。 - 使用
unix socket
连接
这个只能用于本地登录,使用命令redis-cli -s [sock's path]
,socket文件位置和权限由配置项unixsocket
和unixsocketperm
指定。如果你没有使用socket的权限,那你访问一定会被拒绝。
修改配置项可以登录服务器后修改,也可以在配置文件中修改重启服务器生效redis-server [configfile's path]
。