• Redis的客户端的远程操作


    在Spring Boot 1.x中默认是Jedis作为客户端,但是在Spring Boot2.x后,默认就是Lettuce

    Redis的远程连接,默认是不支持的,需要手动开启

    修改config文件:

    1. 注释掉bind:127.0.0.1
    2. 开启密码校验,去掉requireprass的注释

    使用jedis客户端:

       jedis的GitHub地址:https://github.com/xetorthio/jedis

    如何远程连接:

    //构造一个jedis对象
    Jedis jedis=new Jedis("127.0.0.1");
    //有密码的话要认证
    jedis.auth("root");
    //测试是否连接成功
    String  ping =jedis.ping();
    //返回pong表示成功
    System.out.println(ping);

    jedis中的方法API和redis中的操作数据的命令一致,所以使用起来很方便。

    在实际应用中,Jedis实例一般用连接池获取,因为java本来就是多线程的,而jedis对象不是线程安全的,所以要使用连接池,从连接池中获取Jedis,用完之后再还给连接池。保证他的线程是安全的。

    如何创建Jedis连接池

    //1.构造一个jedis连接池
    JedisPool pool=new JedisPool("127.0.0.1",6379);
    //2.从连接池中获取一个jedis连接
    Jedis jedis=pool.getResource();
    //3.测试是否连接成功
    String  ping =jedis.ping();
    //返回pong表示成功
    System.out.println(ping);
    //4.归还连接
    jedis.close();

    如果第三步,也就是我们的业务代码出问题的话,是无法进行到第四步的,我们可以做一个优化,在业务代码块中try catch给close加一个finally,并在finally中判断jedis不为空的情况下给他归还。这样的话,就可以保证每次都归还jedis对象了。

    但是这种的明显感觉很臃肿,而且约束性不强,因此可以再优化,就是以接口和接口实现的形式去处理,需要调用的时候再去实现这个接口:

    创建接口:

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

    创建接口的实现

    public class Redis {
        private JedisPool pool;
        public Redis() {
            GenericObjectPoolConfig config = new GenericObjectPoolConfig();
            //连接池最大空闲数
            config.setMaxIdle(300);
            //最大连接数
            config.setMaxTotal(1000);
            //连接最大等待时间,如果是 -1 表示没有限制
            config.setMaxWaitMillis(30000);
            //在空闲时检查有效性
            config.setTestOnBorrow(true);
            /**
             * 1. Redis 地址
             * 2. Redis 端口
             * 3. 连接超时时间
             * 4. 密码
             */
            pool = new JedisPool(config, "192.168.91.128", 6379, 30000, "root");
       }
        public void execute(CallJedis callJedis) {
            try (Jedis jedis = pool.getResource()) {
                callJedis.call(jedis);
           }
       }
    }

    调用接口:

    Redis redis = new Redis();
    redis.execute(jedis -> {
        System.out.println(jedis.ping());
    });

    使用Lettuce客户端:

    GitHub地址:https://github.com/lettuce-io/lettuce-core

    Lettuce和Jedis比较

       Jedis在实现过程中是直接连接redis的,在多个线程之间共享一个jedis实例,是线程不安全的,如果想在多线程场景下使用jedis,就得使用连接池,这样,每个线程都有自己的jedis实例,但是有一个弊端,就是会消耗过多的物理资源。

     Lettuce是线程安全的,因为使用了Netty NIO框架构建。支持同步,异步,以及响应调用,多个线程可以共享一个Lettuce实例,不用担心多线程的并发问题。

    在java中如何使用:

       1.添加依赖。

       2.测试

         //创建连接root是密码,127.0.0.1是服务端地址
         RedisClient redisClient =RedisClient.create("redis://root@127.0.0.1");
         //创建连接通道
         StatefulRedisConnection<String, String> connect = redisClient.connect();
         //获取同步调用对象
          RedisCommands<String, String> sync = connect.sync();
          //赋值
          sync.set("name", "zl");
          //取值
           String name = sync.get("name");
         //测试
           System.out.println(name);
       }

        

  • 相关阅读:
    设置VS&IE8控件调试
    VR模型优化技巧
    MFC的资源切换AFX_MANAGE_STATE (转载)
    3D图形学资源收集
    关于C++运算符重载
    Valve(维尔福软件公司) Half Life(半条命) CS(反恐精英)
    MySQL导入SQL文件及常用命令
    折磨了我3天的IIS服务器不能运行asp页面故障
    3721奇遇
    SMS2.0软件测量及出现的故障
  • 原文地址:https://www.cnblogs.com/javazl/p/12658516.html
Copyright © 2020-2023  润新知