• 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", 6379, 20000, "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中线程不安全的问题 封装的更凶) 并且支持同步 异步 响应调用 多个线程共享一个实例
    作者:以罗伊
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    vim使用基础
    linux基本命令随笔
    linux学习笔记
    中台建设随笔
    数据密集型系统响应优化
    TCP断开连接的问题
    多渠道接入系统总结
    关于实践的认识
    博客说明
    python下载图片的问题思考
  • 原文地址:https://www.cnblogs.com/my-ordinary/p/12613470.html
Copyright © 2020-2023  润新知