zoukankan      html  css  js  c++  java
  • 在多线程环境中使用Jedis

    Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口。


    Jedis不是线程安全的。故不应该在多线程环境中共用一个Jedis实例。可是。也应该避免直接创建多个Jedis实例,由于这样的做法会导致创建过多的socket连接,性能不高。


    要保证线程安全且获得较好的性能。能够使用JedisPool。JedisPool是一个连接池,既能够保证线程安全,又能够保证了较高的效率。


    能够声明一个全局的JedisPool变量来保存JedisPool对象的引用,然后在其它地方使用。要知道。JedisPool是一个线程安全的连接池。

    JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

    使用JedisPool来获得一个Jedis实例的方法例如以下,

    Jedis jedis = null;
    try {
        jedis = pool.getResource();
        /// ... 运行相关的Redis操作
        jedis.set("foo", "bar");
        String foobar = jedis.get("foo");
        jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
        Set<String> sose = jedis.zrange("sose", 0, -1);
    } finally {
        if (jedis != null) {
            jedis.close();
        }
    }
    /// ... 当关闭应用程序时:
    pool.destroy();

    上面的程序首先通过pool.getResource()获得一个Jedis实例。然后利用这个Jedis实例向Redisserver发送相关的指令操作,最后调用Jedis类的close方法。将这个Jedis实例归还给JedisPool。


    Jedis类的close方法例如以下,

    public void close() {
        if (dataSource != null) {
            if (client.isBroken())
                this.dataSource.returnBrokenResource(this);
            else
                this.dataSource.returnResource(this);
        } else {
          client.close();
        }
    }

    能够看到,假设是从JedisPool取得的Jedis实例(Jedis的dataSource成员不为空。即指向 一个JedisPool),会进行对应的归还给JedisPool的操作。假设是单独生成的一个Jedis实例(Jedis的dataSource成员为空),则会直接断开与Redisserver的连接。

    參考资料
    Jedis wiki

  • 相关阅读:
    使用signalr不使用连接服务器和前台的js的方法
    signalR client属性中的大致方法
    创建一个简单的signalr项目
    设计模式之工厂模式
    VS2012下没有ADO.NET实体数据模型
    迷你极客主机Station M1 开箱体验
    制作Station M1主机的Armbian启动卡
    StationP1的Ubuntu上安装gedit
    Station OS播放网络共享文件夹的媒体资源
    体验StationOS的推荐应用功能
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5234049.html
Copyright © 2011-2022 走看看