10.jedis连接redis

环境准备

jdk + 启动redis服务 + idea(或eclipse)+ jedis所需jar包

jedis所需jar包:jedis-3.3.0.jar + commons-pool2-2.6.2.jar

或maven依赖:

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.3.0</version>
        </dependency>

启动redis服务时先修改redis配置文件和linux防火墙,否则将导致连接redis失败。

  • 注释bind的绑定ip。
#指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项
# bind 127.0.0.1
  • 关闭保护模式(或设置密码)
#是否启动redis保护模式,默认开启,启动之后远程服务需要密码才能连接,如果没有设置密码又需要远程连接,则需要把保护模式关闭
protected-mode no

或者不关闭保护模式,则需要设置密码,jedis需要带密码连接redis。

设置密码:config set requirepass 123456

清空密码(需要重启):config set requirepass ''

获取密码:config get requirepass

  • 关闭防火墙(或开放redis服务端口)

关闭防火墙:systemctl stop firewalld.service

开启防火墙:systemctl start firewalld.service

不推荐关闭防火墙,则需要开放redis服务端口(需重启防火墙)。

开放端口:firewall-cmd --add-port=6379/tcp

关闭端口:firewall-cmd --remove-port=6379/tcp

重启防火墙:systemctl restart firewalld.servicefirewall-cmd --reload

测试连接

  • ifconfig查看linux的ip地址,比如我的是:192.168.64.129,我的redis服务启动端口是:6379

在这里插入图片描述

  • 无密码(关闭保护模式)
public class PingTest {
    public static void main(String[] args) {
        // 参数:redis服务所在机器的ip地址 + redis启动端口
        Jedis jedis = new Jedis("192.168.64.129", 6379);
        // 结果:PONG
        System.out.println(jedis.ping());
    }
}
  • 有密码
public class PingTest {
    public static void main(String[] args) {
    	// 参数:redis服务所在机器的ip地址 + redis启动端口
        JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.64.129", 6379);
        // 设置redis密码
        jedisShardInfo.setPassword("123456");
        Jedis jedis = jedisShardInfo.createResource();
        // 结果:PONG
        System.out.println(jedis.ping());
    }
}

当调用ping()方法返回结果为PONG则表示连接成功。

jedis常用api

只列举部分,剩下的同学们自己尝试。

public class Test01 {
    public static void main(String[] args) {
        // 获取jedis连接对象
        JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.64.129", 6379);
        jedisShardInfo.setPassword("123456");
        Jedis jedis = jedisShardInfo.createResource();

        // keys *
        Set<String> keys = jedis.keys("*");
        // 遍历并输出说有key
        for (Iterator iterator = keys.iterator(); iterator.hasNext(); ) {
            String key = (String) iterator.next();
            System.out.println(key);
        }
        System.out.println("************************************************");
        // exists k2
        System.out.println("jedis.exists====>" + jedis.exists("k2"));
        System.out.println(jedis.ttl("k1"));
        // get k1
        System.out.println(jedis.get("k1"));
        // set k4 k4_redis
        jedis.set("k4", "k4_redis");
        // mset str1 v1 str2 v2 str3 v3
        jedis.mset("str1", "v1", "str2", "v2", "str3", "v3");
        System.out.println("************************************************");
        // lpush mylist v1 v2 v3 v4 v5
        jedis.lpush("mylist","v1","v2","v3","v4","v5");
        // lrange mylist 0 -1
        List<String> list = jedis.lrange("mylist", 0, -1);
        // 遍历输出mylist列表
        for (String element : list) {
            System.out.println(element);
        }
        System.out.println("************************************************");
        // sadd orders jd001
        jedis.sadd("orders", "jd001");
        // smembers orders
        Set<String> set1 = jedis.smembers("orders");
        // 遍历输出set无序集合
        for (Iterator iterator = set1.iterator(); iterator.hasNext(); ) {
            String string = (String) iterator.next();
            System.out.println(string);
        }
        // srem orders jd002
        jedis.srem("orders", "jd002");
        System.out.println("************************************************");
        // hset hash1 username lisi
        jedis.hset("hash1", "userName", "lisi");
        // hget hash1 username
        String hget = jedis.hget("hash1", "userName");
        Map<String, String> map = new HashMap<String, String>();
        map.put("telphone", "11012011933");
        map.put("address", "China");
        map.put("email", "abc@163.com");
        // hmset hash2 telphone 11012011933 address China email 163
        jedis.hmset("hash2", map);
        // hmget hash2 telphone email
        List<String> result = jedis.hmget("hash2", "telphone", "email");
        System.out.println("************************************************");
        // zadd zset01 60 v1
        jedis.zadd("zset01", 60d, "v1");
        // zrange zset01 0 -1
        Set<String> s1 = jedis.zrange("zset01", 0, -1);
        // 遍历输出zset有序集合
        for (Iterator iterator = s1.iterator(); iterator.hasNext(); ) {
            String string = (String) iterator.next();
            System.out.println(string);
        }
    }
}

jedis事务

public class TXTest01 {
    public static void main(String[] args) {
        JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.64.129", 6379);
        jedisShardInfo.setPassword("123456");
        Jedis jedis = jedisShardInfo.createResource();

        //监控key,如果该动了事务就被放弃
        // watch serialNum
        jedis.watch("serialNum");
        // set serialNum 1000
        jedis.set("serialNum", "1000");
        // unwatch
        // jedis.unwatch();

        // multi
        Transaction transaction = jedis.multi();//被当作一个命令进行执行
        // set serialNum 1001
        transaction.set("serialNum", "1001");
        Response<String> response = transaction.get("serialNum");
        // lpush list01 a
        transaction.lpush("list01", "a");

        // exec
        transaction.exec();
        // discard
        //2 transaction.discard();

        // serialNum:1000(被回滚了)
        System.out.println("serialNum:" + jedis.get("serialNum"));
    }
}

jedis主从复制

首先开启6379和6380端口的redis服务。

在这里插入图片描述

public class MSTest {
    public static void main(String[] args) {
        // 连接6379和6380,此处使用关闭保护模式方式
        Jedis jedisM6379 = new Jedis("192.168.64.129",6379);
        Jedis jedisS6380 = new Jedis("192.168.64.129",6380);

        // slaveof 192.168.64.129 6379
        jedisS6380.slaveof("192.168.64.129",6379);
        jedisM6379.set("k1","v1");
        String result = jedisS6380.get("k1");
        // v1
        System.out.println(result);
    }
}

jedis连接池

类似数据库连接池对象,可以减少频繁的创建或销毁数据库连接对象。

public class JedisPoolUtil {
    /**
     * 数据库连接对象
     */
    private static volatile JedisPool jedisPool = null;

    private JedisPoolUtil() {
    }

    /**
     * 双重锁检查单例模式
     *
     * @return
     */
    public static JedisPool getJedisPoolInstance() {
        if (null == jedisPool) {
            synchronized (JedisPoolUtil.class) {
                if (null == jedisPool) {
                    JedisPoolConfig poolConfig = new JedisPoolConfig();
                    // 控制一个pool最多有多少个状态为idle(空闲)的jedis实例
                    poolConfig.setMaxIdle(32);
                    // 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException
                    poolConfig.setMaxWaitMillis(1000);
                    // 获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的
                    poolConfig.setTestOnBorrow(true);
                    jedisPool = new JedisPool(poolConfig, "192.168.64.129", 6379, 2000, "123456");
                }
            }
        }
        return jedisPool;
    }

    /**
     * 关闭连接池
     *
     * @param jedisPool
     */
    public static void close(JedisPool jedisPool) {
        if (!jedisPool.isClosed()) {
            jedisPool.destroy();
        }
    }

    public static void main(String[] args) {
        JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
        JedisPool jedisPool2 = JedisPoolUtil.getJedisPoolInstance();

        // 测试是否为单例模式:true
        System.out.println(jedisPool == jedisPool2);

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            // PONG
            System.out.println(jedis.ping());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭连接池对象
            JedisPoolUtil.close(jedisPool);
        }
    }
}

连接池配置信息如下:

JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
 
maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。

maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;

whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。

WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;

WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;

WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;

maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;

testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;
 
testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());
 
testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
 
timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;
 
numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;
 
minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
 
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;
 
lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;
 
其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPException.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值