连接redis server的那点破事。。。

这篇文章记录一下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-serverPID对应的信息即可),然而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有两种方式:

  1. 使用TCP连接
    如果你是在本地登陆的,那么直接使用redis-cli命令即可,如果远程,必须指定IP,redis-cli -p port -h IP,当然啦,前提必须是服务器的配置中端口号不为0,且绑定地址正确,具体查看配置项bindport。最后要说明一下,如果服务器指定了requirepass选项(密码),你必须在登陆的时候提供这个选项-a password,尽管一般服务器不会设置这个选项。
  2. 使用unix socket连接
    这个只能用于本地登录,使用命令redis-cli -s [sock's path],socket文件位置和权限由配置项unixsocketunixsocketperm指定。如果你没有使用socket的权限,那你访问一定会被拒绝。

修改配置项可以登录服务器后修改,也可以在配置文件中修改重启服务器生效redis-server [configfile's path]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值