Redis使用Jedis和Jedis连接池

阅读更多
1. 使用Jedis连接Redis

网址: https://redis.io/clients

新建项目
    new maven project
    new simple maven project
    group Id: com.andrew
    Artifact Id: JedisDemo

pom.xml


  4.0.0
  com.andrew
  JedisDemo
  0.0.1-SNAPSHOT
  
      
        redis.clients
        jedis
        2.9.0
    
  


JedisTest.java

package com.andrew.test;
import redis.clients.jedis.Jedis;
public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.18.4", 6379);
        // jedis.auth("123456");
        jedis.set("name", "andrew");
        String value = jedis.get("name");
        System.out.println(value);
        jedis.close();
    }
}


运行报错

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
    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.BinaryClient.set(BinaryClient.java:110)
    at redis.clients.jedis.Client.set(Client.java:47)
    at redis.clients.jedis.Jedis.set(Jedis.java:120)
    at com.andrew.test.JedisTest.main(JedisTest.java:9)
Caused by: java.net.SocketTimeoutException: connect timed out
    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

解决方法

配置下防火墙 开一个6379端口权限
[root@localhost ~]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
[root@localhost ~]# firewall-cmd --reload


运行报错

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.BinaryClient.set(BinaryClient.java:110)
    at redis.clients.jedis.Client.set(Client.java:47)
    at redis.clients.jedis.Jedis.set(Jedis.java:120)
    at com.andrew.test.JedisTest.main(JedisTest.java:9)
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配置文件
    [root@localhost redis]# vi /usr/local/redis/redis.conf
将bind 127.0.0.1备注掉
配置完后重启服务
    [root@localhost ~]# cd /usr/local/redis/
    [root@localhost redis]# bin/redis-cli shutdown
    [root@localhost redis]# bin/redis-server redis.conf


运行报错

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 com.andrew.test.JedisTest.main(JedisTest.java:9)

解决方法
因为远程连接redis redis自我保护 拒绝访问;

方法一:直接去掉自我保护功能(不推荐)
    [root@localhost redis]# vi /usr/local/redis/redis.conf
将protected-mode yes改为no
重启下redis服务
    [root@localhost ~]# cd /usr/local/redis/
    [root@localhost redis]# bin/redis-cli shutdown
    [root@localhost redis]# bin/redis-server redis.conf
运行结果:
    andrew
将属性改回去

方法二:设置redis连接密码(推荐)
    [root@localhost redis]# bin/redis-cli
设置密码 123456
    127.0.0.1:6379> config set requirepass 123456
    OK
退出
    127.0.0.1:6379> quit
登陆验证
    [root@localhost redis]# bin/redis-cli
    127.0.0.1:6379> auth 123456
    OK
设置成功
代码中增加
    jedis.auth("123456");
运行结果:
    andrew


2. Jedis连接池使用

JedisPoolTest.java

package com.andrew.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolTest {
    public static void main(String[] args) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100); // 设置最大连接数
        config.setMaxIdle(10); // 设置最大空闲连接数
        JedisPool jedisPool = new JedisPool(config, "192.168.18.4", 6379);
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.auth("123456");
            jedis.set("name", "andrew");
            String value = jedis.get("name");
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.close();
            }
            if (jedisPool != null) {
                jedisPool.close();
            }
        }
    }
}

运行结果:
andrew

你可能感兴趣的:(Redis)