Ubuntu14.04安装redis和简单配置及Java连接redis遇到的无法访问问题解决

转载:https://www.cnblogs.com/zjfjava/p/6881772.html

https://www.cnblogs.com/hltswd/p/6225833.html#undefined

 

安装

//在终端中安装Redis服务器端
sudo apt-get install redis-server

安装完成后,Redis 服务器会自动启动,我们检查 Redis 服务器程序

// 在终端中检查 Redis 服务器系统进程
ps -aux|grep redis

可以看到: 
这里写图片描述

// 在终端中通过启动命令检查 Redis 服务器状态
netstat -nlt|grep 6379

显示: tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN

// 通过启动命令检查 Redis 服务器状态
sudo /etc/init.d/redis-server status

显示: redis-server is running


3、通过命令行客户端访问 Redis

安装 Redis 服务器,会自动地一起安装 Redis 命令行客户端程序。

在本机输入 redis-cli 命令就可以启动,客户端程序访问 Redis 服务器。

~ redis-cli
redis 127.0.0.1:6379>

命令行的帮助

redis 127.0.0.1:6379> help
redis-cli 2.2.12
Type: "help @" to get a list of commands in
"help" for help on
"help" to get a list of possible help topics
"quit" to exit

查看所有的key列表

redis 127.0.0.1:6379> keys *
(empty list or set)


基本的 Redis 客户端命令操作

  1. 增加一条字符串记录 key1
# 增加一条记录 key1
redis 127.0.0.1:6379> set key1 "hello"
OK

# 打印记录
redis 127.0.0.1:6379> get key1
"hello"

   2 . 增加一条数字记录 key2

# 增加一条数字记录 key2
set key2 1
OK

# 让数字自增
redis 127.0.0.1:6379> INCR key2
(integer) 2
redis 127.0.0.1:6379> INCR key2
(integer) 3

# 打印记录
redis 127.0.0.1:6379> get key2
"3"

   3. 增加一条列表记录 key3

# 增加一个列表记录 key3
redis 127.0.0.1:6379> LPUSH key3 a
(integer) 1

# 从左边插入列表
redis 127.0.0.1:6379> LPUSH key3 b
(integer) 2

# 从右边插入列表
redis 127.0.0.1:6379> RPUSH key3 c
(integer) 3

# 打印列表记录,按从左到右的顺序
redis 127.0.0.1:6379> LRANGE key3 0 3

  1. "b"
  2. "a"
  3. "c"

   4. 增加一条哈希表记录 key4

# 增加一个哈希记表录 key4
redis 127.0.0.1:6379> HSET key4 name "John Smith"
(integer) 1

# 在哈希表中插入,email 的 Key 和 Value 的值
redis 127.0.0.1:6379> HSET key4 email "abc@gmail.com"
(integer) 1

# 打印哈希表中,name 为 key 的值
redis 127.0.0.1:6379> HGET key4 name
"John Smith"

# 打印整个哈希表
redis 127.0.0.1:6379> HGETALL key4

  1. "name"
  2. "John Smith"
  3. "email"
  4. "abc@gmail.com"

   5. 增加一条哈希表记录 key5

# 增加一条哈希表记录 key5,一次插入多个 Key 和 value 的值
redis 127.0.0.1:6379> HMSET key5 username antirez password P1pp0 age 3
OK

# 打印哈希表中,username 和 age 为 key 的值
redis 127.0.0.1:6379> HMGET key5 username age

  1. "antirez"
  2. "3"

# 打印完整的哈希表记录
redis 127.0.0.1:6379> HGETALL key5

  1. "username"
  2. "antirez"
  3. "password"
  4. "P1pp0"
  5. "age"
  6. "3"

   6. 删除记录

# 查看所有的 key 列表
redis 127.0.0.1:6379> keys *
1) "key2"
2) "key3"
3) "key4"
4) "key5"
5) "key1"

# 删除 key1,key5
redis 127.0.0.1:6379> del key1
(integer) 1
redis 127.0.0.1:6379> del key5
(integer) 1

# 查看所有的 key 列表
redis 127.0.0.1:6379> keys *

  1. "key2"
  2. "key3"
  3. "key4"

4、修改 Redis 的配置

1、 使用 Redis 的访问账号

默认情况下,访问 Redis 服务器是不需要密码的,为了增加安全性我们需要设置 Redis 服务器的访问密码。设置访问密码为 redis。

用 vi 打开 Redis 服务器的配置文件 redis.conf

~ sudo vi /etc/redis/redis.conf

#取消注释 requirepass
requirepass redis

2、 让 Redis 服务器被远程访问 
默认情况下,Redis 服务器不允许远程访问,只允许本机访问,所以我们需要设置打开远程访问的功能。

用 vi 打开 Redis 服务器的配置文件 redis.conf

~ sudo vi /etc/redis/redis.conf
~ sudo gedit /etc/redis/redis.conf

#注释 bind
#bind 127.0.0.1

修改后,重启 Redis 服务器。

~ sudo /etc/init.d/redis-server restart
Stopping redis-server: redis-server.
Starting redis-server: redis-server.

未使用密码登陆 Redis 服务器

~ redis-cli

redis 127.0.0.1:6379> keys *
(error) ERR operation not permitted

发现可以登陆,但无法执行命令了。

登陆 Redis 服务器,输入密码

~  redis-cli -a redis

redis 127.0.0.1:6379> keys *
1) "key2"
2) "key3"
3) "key4"

登陆后,一切正常。

我们检查 Redis 的网络监听端口

// 检查 Redis 服务器占用端口
~ netstat -nlt|grep 6379
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN

我们看到从之间的网络监听从 127.0.0.1:6379 变成 0 0.0.0.0:6379,表示 Redis 已经允许远程登陆访问。

我们在远程的另一台Linux访问 Redis 服务器

~ redis-cli -a redis -h 192.168.1.199

redis 192.168.1.199:6379> keys *
1) "key2"
2) "key3"
3) "key4"

远程访问正常。通过上面的操作,我们就把 Redis 数据库服务器,在 Linux Ubuntu 中的系统安装完成。

 

Java 连接操作 Redis 出现错误

 
复制代码
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
    at redis.clients.jedis.Connection.connect(Connection.java:207)
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:126)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:121)
    at redis.clients.jedis.BinaryClient.ping(BinaryClient.java:106)
    at redis.clients.jedis.BinaryJedis.ping(BinaryJedis.java:195)
    at practice.RedisJava.main(RedisJava.java:13)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at redis.clients.jedis.Connection.connect(Connection.java:184)
    ... 6 more
复制代码

 这可能是两个原因造成的,首先可能是 redis 的 6379 端口无法访问,请先在 cmd 中输入命令 
telnet 127.0.0.1 6379 
看看可不可以访问 redis-server 机器的 6379 端口,如果不能访问,需要在远程机器关掉防火墙或者添加允许通过 
1)使用 root 用户登录,vi /etc/sysconfig/iptables,添加如图所以一行 

 

2)输入命令 service iptables restart 重启防火墙

或者可以直接 root 用户使用命令 service iptables stop 关闭防火墙。

防火墙检查完后,如果还是出现上述问题,说明 redis 还有地方需要配置,redis 默认是只有本机可以访问的,想要远程访问需要修改 redis.conf 配置文件。 
进入 redis.conf 目录,并使用 vi 命令打开,找到 bind 那行修改后,wq 保存退出,重启 redis-server。 

bind 后加的是允许访问的 ip 
bind 127.0.0.1 代表只有本机可以访问,可以将允许访问的 ip 加入,也可以直接注释掉这一行,这样所有机器都可以访问。

解决上述问题后出现的新问题:DENIED Redis is running in protected mode

报错信息如下:

复制代码
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
    at redis.clients.jedis.Protocol.processError(Protocol.java:127)
    at redis.clients.jedis.Protocol.process(Protocol.java:161)
    at redis.clients.jedis.Protocol.read(Protocol.java:215)
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
    at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239)
    at redis.clients.jedis.Jedis.set(Jedis.java:121)
    at roy.redis.test.Test.init(Test.java:13)
    at roy.redis.test.Test.main(Test.java:8)
复制代码

报错信息很长,但是主要是说 redis 开启了 protected mode,这也是 Redis3.2 加入的新特性,开启保护模式的 redis 只允许本机登录,同样设置在配置文件 redis.conf 中,如图 
这里写图片描述 
这里原来是 yes 代表开启了保护模式,后面可以填密码也可以填 no 代表关闭,我们这里选择关闭保护模式,wq 保存退出后再重启 redis-server