redis学习笔记(二)

来源:互联网 发布:磁力在线播放 源码 编辑:程序博客网 时间:2024/06/05 16:46

引入依赖

 <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>    <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>    <version>2.9.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-pool2</artifactId>    <version>2.4.2</version></dependency>

编写测试代码

方式一:

package com.jedis;import org.junit.Test;import redis.clients.jedis.Jedis;/** * @author wyc * @ClassName Test1 * @Description TODO * @date 2017年9月26日 下午7:59:15 * */public class Test1 {    @Test    public void testJedis(){        //连接数据库        Jedis jedis = new Jedis("192.168.117.128", 6379);        //设置数据        jedis.set("name", "test");        //获取数据        String value = jedis.get("name");        System.out.println(value);        //关闭连接        jedis.close();    }}

此时运行代码会报以下错误:

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.jedis.Test1.testJedis(Test1.java:21)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)    at java.lang.reflect.Method.invoke(Unknown Source)    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)Caused by: java.net.SocketTimeoutException: connect timed out    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)    at java.net.PlainSocketImpl.connect(Unknown Source)    at java.net.SocksSocketImpl.connect(Unknown Source)    at java.net.Socket.connect(Unknown Source)    at redis.clients.jedis.Connection.connect(Connection.java:184)    ... 29 more

原因:linux未将6379端口对外暴露

方法:改变防火墙设置

vim /etc/sysconfig/iptables

这里写图片描述

复制红框中的配置并将端口号改为6379,保存,输入以下命令重启防火墙

service iptables restart

之后若依旧出现无法连接的情况,修改redis.conf,将bindAddress 127.0.0.1注释掉


第二个问题:

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.jedis.Test1.testJedis(Test1.java:21)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)    at java.lang.reflect.Method.invoke(Unknown Source)    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

解决方法:

protected-mode yea>protected-mode no

方式二(使用连接池):

@Test    public void testJedis1(){        //创建配置        JedisPoolConfig config = new JedisPoolConfig();        //设置最大连接数        config.setMaxTotal(30);        //设置闲余连接数        config.setMaxIdle(10);        JedisPool pool = new JedisPool(config, "192.168.117.128", 6379);        Jedis jedis = null;        try{            jedis = pool.getResource();            jedis.set("name", "test1");            String value = jedis.get("name");            System.out.println(value);        }catch(Exception e){            e.printStackTrace();        }finally{            if(jedis != null){                jedis.close();            }            if(pool != null){                pool.close();            }        }    }
原创粉丝点击