阅读 270

redis-java客户端学习笔记

0 环境

  • 系统环境: win10
  • 编辑器: IDEA
  • maven

1 前言

redis不支持远程连接 需手启

  • 修改地方(找到config)
    • 把bind:127.0.0.1注释掉
    • 密码校验开启(去掉requirepass注解 在vim搜索:/requirepass)
  • ok后 保存退出启动redis

2 Jedis(maven篇)基本使用

jedis参考

1 创建maven项目 添加依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
复制代码

2 创建测试方法

// 一旦连接了 API方法和redis命令很相似 即学即用
public class MyJdis {
    public static void main(String[] args) {
        // 1 new一个jedis对象 默认6379
        Jedis jedis = new Jedis("你的host");
        // 2 密码认证
        jedis.auth("123456");
        // 3 测试是否连通
        String ping = jedis.ping();
        // 4 返回PONG 说明连接成功
        System.out.println(ping);

    }
}
复制代码

3 启动

3 Jedis(maven篇)升级

1 连接池简介

一般是使用连接池 首先jedis对象非线程安全 使用jedis对象时 通过连接池获取jedis 用完归还给连接池

2 连接池改进

public class JedisPoolDemo {
    public static void main(String[] args) {
        // v1版
//        test();
        // v2版 添加异常(解决v1版 抛出异常时 无法执行的情况)
//        test1();
        // v3版 语法糖(jdk1.7 try-with-resource) 可在target目录找到相对应的xx.class查看发现还是那套
        test2();



    }

    private static void test2() {
        // 1 创建一个连接池
        JedisPool jedisPool = new JedisPool("xxx"6379);
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.auth("123456");
            // 3 jedis操作
            String ping = jedis.ping();
            System.out.println(ping);
        }
    }

    // 添加异常 确保关闭连接
    private static void test1() {
        // 1 创建一个连接池
        JedisPool jedisPool = new JedisPool("xxx"6379);
        // 2 从连接池中获取一个Jedis
        Jedis jedis = jedisPool.getResource();
        jedis.auth("123456");
        try {
            // 3 jedis操作
            String ping = jedis.ping();
            System.out.println(ping);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4 关闭连接
            if (jedis != null) {
                jedis.close();
            }
        }
    }
  
    // 简化代码量
    private static void test() {
        // 1 创建一个连接池
        JedisPool jedisPool = new JedisPool("xxx"6379);
        // 2 从连接池中获取一个Jedis
        Jedis jedis = jedisPool.getResource();
        jedis.auth("123456");

        // 3 jedis操作
        String ping = jedis.ping();
        System.out.println(ping);
        // 4 关闭连接
        jedis.close();
    }
}
复制代码

3 对连接池强约束

public interface CallWithJedis {
    void call(Jedis jedis);
}

public class CallRedisDemo {
    private JedisPool jedisPool;

    // 配置
    public CallRedisDemo() {
        GenericObjectPoolConfig config = new GenericObjectPoolConfig();
        // 连接池最大空闲数
        config.setMaxIdle(300);
        // 最大连接数
        config.setMaxTotal(1000);
        // 连接最大等待时间 若是-1 则无限制
        config.setMaxWaitMillis(200000);
        // 在空闲时检查有效性
        config.setTestOnBorrow(true);

        /*
        * GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password
        * 1 redis地址
        * 2 redis端口
        * 3 连接超时时间
        * 4 密码
        * */

        jedisPool = new JedisPool(config, "xxxx"637920000"123456");

    }

    // 执行
    // 执行失败 --> 请求重试(这样语法糖就不能用了 试太多也没意思 估计有问题)
    public void execute(CallWithJedis callWithJedis){
        try (Jedis jedis = jedisPool.getResource()){
            callWithJedis.call(jedis);
        }
    }


}

// 测试是否连接
public class CallWithJedisDemo {
    public static void main(String[] args) {
        CallRedisDemo redisDemo = new CallRedisDemo();
        redisDemo.execute(jedis -> {
            System.out.println(jedis.ping());
        });
    }
}
复制代码

4 启动

4 lettuce简介

lettuce参考

1 创建maven项目 添加其依赖

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>
复制代码

2 测试

public class LettuceTest {
    public static void main(String[] args) {
        // 密码和host直接写在一起
        RedisClient redisClient = RedisClient.create("redis://密码@你的host");
        StatefulRedisConnection<String, String> connect = redisClient.connect();
        RedisCommands<String, String> sync = connect.sync();
        sync.set("name""kitty");
        String name = sync.get("name");
        System.out.println(name);
    }
}
复制代码

3 启动

5 小结

jedis -> 连接池的改进 添加异常 添加语法糖 强约束 通过接口 jedis和lettuce对比

  • jedis直接连接redis 线程不安全 多个线程间共享一个jedis实例 想多线程 得加连接池 保证每个线程都有自己的jedis实例
  • lettuce由netty nio构建(解决jedis中线程不安全的问题 封装的更凶) 并且支持同步 异步 响应调用 多个线程共享一个实例
文章分类
后端
文章标签