Redis学习02——Jedis使用

Redis学习02——Jedis使用

一、准备jar包

我们需要使用到的jar包如下

jedis.jar

common-pool

下载地址如下

http://central.maven.org/maven2/redis/clients/jedis/2.9.0/

http://commons.apache.org/proper/commons-pool/download_pool.cgi


二、创建第一实例程序

private String ipAddress = "172.16.50.145";
private int port = 6379;

@Test
public void test1(){
    //1.获取链接对象
    Jedis jedis = new Jedis(ipAddress,port);

    //2.获得数据
    String username = jedis.get("username");
    System.out.println(username);

    //3.存储
    jedis.set("addr","上海");
    System.out.println(jedis.get("addr"));
    jedis.close();
}

但是如果你运行你会发现是报超时错,这是因为linux默认没有打开我们的6379端口。具体配置请看下面。


三、配置服务器

3.1 connect timed out

3.1.1 异常
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.Connection.sendCommand(Connection.java:117)
    at redis.clients.jedis.Jedis.get(Jedis.java:152)
    at com.qwm.redis.Demo1.test1(Demo1.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
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)
    ... 27 more
3.1.2 解决方式

这个是由于linux默认是没有允许访问 6379 端口的,我们需要配置可以访问这个端口。

使用 vim 修改 /etc/sysconfig/iptables

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

加上一行

-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT

例如


# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379  -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

保存重启 iptables

[root@wiming ~]# service iptables restart
Redirecting to /bin/systemctl restart  iptables.service

3.2 java.net.ConnectException: Connection refused: connect

3.2.1 异常
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:117)
    at redis.clients.jedis.Jedis.get(Jedis.java:152)
    at com.qwm.redis.Demo1.test1(Demo1.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
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)
    ... 27 more
3.2.2 解决方式

第一步:

注释 redis.conf 中的 bind 127.0.0.1,还是一样使用vim 打开配置文件。找到 69行,修改如下

67 # JUST COMMENT THE FOLLOWING LINE.
68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69 # bind 127.0.0.1

保存,重启redis,在看可一看是时候已经ok了,如果不行,再看第二步

第二步:

修改 redis.conf 中的 88 行**protected-mode no
**,yes 改为no

86 # even if no authentication is configured, nor a specific set of interfaces
87 # are explicitly listed using the "bind" directive.
88 protected-mode no

保存重启redis,现在就ok了。


四、打印结果

wiming
上海

五、使用连接池

5.1 代码

@Test
public void test2(){
    //1.创建连接池的配置对象
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(30);//最大闲置个数
    config.setMinIdle(10);//最小闲置个数
    config.setMaxTotal(50);//最大连接数

    //2.创建连接池
    JedisPool pool = new JedisPool(config,ipAddress,port);

    //3.从连接池子中获取redis连接
    Jedis jedis = pool.getResource();

    //4.操作数据库
    System.out.println(jedis.get("username"));

    //5.关闭资源
    jedis.close();
    pool.close();
}

5.2 结果

wiming

六、使用配置的使用连接池

我们可以使配置的方式来设置连接池的配置。选用 properties 相对简单好多,所以我们使用这个。

6.1 redis.properties

在src下创建 redis.properties

//最大闲置个数
redis.maxIdle=30
//最小闲置个数
redis.minIdle=10
//最大连接数
redis.maxTotal=50
//主机
redis.host=172.16.50.145
//端口
redis.port=6379

6.2 JedisPoolUtils 连接池工具类

package com.qwm.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author:qiwenming
 * @date:2017/9/24 0024   19:43
 * @description:
 * redis连接池工具类
 */
public class JedisPoolUtils {
    private static JedisPool pool = null;
    static {
        //加载配置文件
        InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
        Properties pro = new Properties();
        try {
            pro.load(in);
            //最大闲置个数
            int maxIdle = Integer.parseInt(pro.getProperty("redis.maxIdle"));
            //最小闲置个数
            int minIdle = Integer.parseInt(pro.getProperty("redis.minIdle"));
            //最大连接数
            int maxTotal = Integer.parseInt(pro.getProperty("redis.maxTotal"));
            //主机
            String host = pro.getProperty("redis.host");
            //端口
            int port = Integer.parseInt(pro.getProperty("redis.port"));

            //配置参数
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxTotal(maxTotal);

            pool = new JedisPool(poolConfig,host,port);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获得jedis资源的方法
     * @return
     */
    public static Jedis getJedis(){
        return pool.getResource();
    }
}

6.3 测试代码

package com.qwm.redis;

import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @author:qiwenming
 * @date:2017/9/24 0024   20:00
 * @description:
 */
public class Demo2 {
    @Test
    public void test1(){
        Jedis jedis = JedisPoolUtils.getJedis();
        System.out.println(jedis.get("username"));

        jedis.hset("myhash","s","kkkkkkk");
        jedis.hset("myhash","k","fdsafdsafds");
        jedis.hset("myhash","v","fdsafdsafds");

        //获取myhash中的全部数据
        Map<String,String> map =  jedis.hgetAll("myhash");
        Set<Map.Entry<String,String>> kv = map.entrySet();
        Iterator<Map.Entry<String,String>>  iterator = kv.iterator();
        //迭代
        while(iterator.hasNext()){
            Map.Entry<String,String> entry = iterator.next();
            System.out.println(entry.getKey()+"---"+entry.getValue());
        }
    }
}

6.4 结果

wiming
v---fdsafdsafds
s---kkkkkkk
k---fdsafdsafds
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值