一、Jedis基本使用
Jedis的基本使用非常简单,只需要创建Jedis对象的时候指定host,port, password即可。当然,Jedis对象又很多构造方法,都大同小异,只是对应和Redis连接的socket的参数不一样而已。

jedis = new Jedis("localhost", 6379);  //指定Redis服务Host和port
jedis.auth("xxxx"); //如果Redis服务连接需要密码,制定密码
String value = jedis.get("key"); //访问Redis服务
jedis.close(); //使用完关闭连接

Jedis基本使用十分简单,在每次使用时,构建Jedis对象即可。在Jedis对象构建好之后,Jedis底层会打开一条Socket通道和Redis服务进行连接。
所以在使用完Jedis对象之后,需要调用Jedis.close()方法把连接关闭,不然会占用系统资源。当然,如果应用非常平凡的创建和销毁Jedis对象,对应用的性能是很大影响的,因为构建Socket的通道是很耗时的(类似数据库连接)。我们应该使用连接池来减少Socket对象的创建和销毁过程

二、连接池使用
Jedis连接池是基于apache-commons pool2实现的。在构建连接池对象的时候,需要提供池对象的配置对象,及JedisPoolConfig(继承自GenericObjectPoolConfig)。我们可以通过这个配置对象对连接池进行相关参数的配置(如最大连接数,最大空数等)。

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(8);
config.setMaxTotal(18);
JedisPool pool = new JedisPool(config, "127.0.0.1", 6379, 2000, "password");
Jedis jedis = pool.getResource();
String value = jedis.get("key");
......
jedis.close();
pool.close();

使用Jedis连接池之后,在每次用完连接对象后一定要记得把连接归还给连接池。Jedis对close方法进行了改造,如果是连接池中的连接对象,
调用Close方法将会是把连接对象返回到对象池,若不是则关闭连接。可以查看如下代码

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

三、Redis的订阅
Redis为我们提供了publish/subscribe(发布/订阅)功能。我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布)消息时,redis就会通知我们,这样我们可以收到别人发布的消息。 作为Java的redis客户端,Jedis提供了publish/subscribe的接口

/**
 * 消息接收器
 */
public class JedisReceiveMsg extends Thread {
    
    @Override
    public void run() {
        System.out.println("...频道一....");
        Jedis jedis = JedisUtils.getJedis();

        JedisPubSub jedisPubSub=new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                // 执行订阅消息
                super.onMessage(channel, message);
                //终止订阅
                //super.unsubscribe();
                System.out.println(message);
            }
        };
        jedis.subscribe(jedisPubSub,"channel1");
    }
}
/**
 * 定义消息发送方法和消息监听器,继承JedisPubSub
 */
public class JedisChannel extends JedisPubSub {
    private static boolean ifOpen=false;

    static {
      if(ifOpen==false){
          ifOpen=true;
          System.out.println("初始化消息接收器");
          JedisReceiveMsg jedisReceiveMsg=new JedisReceiveMsg();
          jedisReceiveMsg.start();
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
    }
    
    //发布消息
    public  void sendMessage(String message){
        System.out.println("sendMessage.."+message);
        Jedis jedis = JedisUtils.getJedis();
        jedis.publish("channel1", message);
    }
}
/**
 * 测试
 * @return
 */
@RequestMapping("/test5")
@ResponseBody
public String test5() {
    JedisChannel jedisChannel=new JedisChannel();
    jedisChannel.sendMessage("hello hello");
    return "ok";
}

四、jides常用api

(1).键的操作
jedis.flushDB();//清空数据
jedis.set("key1","value1");//设置数据
jedis.exists("key1");//判断键是否存在
Set<String> keys= jedis.keys("*");//获取所有键
jedis.del("key1");//删除键
jedis.expire("key1",10);//设置键过期/秒
jedis.ttl("key1");//获取键的剩余生存时间
jedis.type("key1");//查看键对应值的数据类型

(2).字符串的操作
jedis.set("key","value");//增加或覆盖数据项
jedis.setnx("key","value");//非覆盖增加
jedis.setex("key",3,"value");//增加数据项并设置过期时间
jedis.get("key");//获取key的数据项
jedis.append("key","1");//在key的value后面追加1,如果key不存在就创建
jedis.mset("key1","value1","key2","value2");//增加多个键值对
List<String> strs=jedis.mget("key1","key2");//获取多个key对应value
jedis.del(new String[]{"key1","key2"});//删除多个key
jedis.getSet("key","123");//获取value并更新value

(3).整数和浮点数操作
jedis.set("key","1");//value为可转化的数字
jedis.incr("key");//value加1
jedis.incrBy("key",2);//value加n
jedis.decr("key");//value减1
jedis.decrBy("key",2);//value减n

(4).List操作
jedis.lpush("key","1","2","3");//添加一个list
jedis.rpush("key","1","2","3");//添加一个list
jedis.lpop("key");//对应list左出栈一个元素
jedis.rpop("key");//对应list右出栈一个元素
jedis.llen("key");//获取key对应list长度
jedis.lset("key",1,"f");//修改key对应list下标n对应的元素
jedis.lindex("key",1);//获取key对应list下标n对应元素
jedis.sort("key");//key对应list的元素从小到大排序

(5).set操作
jedis.sadd("key","1","2","3","4");//添加一个set
jedis.sadd("key1","12","2","33","4");//添加一个set
Set<String> strings= jedis.smembers("key");//获取set对应元素
jedis.srem("key","1");//删除set下值为1的元素
jedis.spop("key");//随机出栈set里的某个元素
jedis.scard("key");//获取set里元素个数
strings=jedis.sinter("key","key1");//获取key和key1下对应元素的交集
strings=jedis.sunion("key","key1");//获取key和key1下对应元素的并集
strings=jedis.sdiff("key","key1");//获取key和key1下对应元素的差集

(6).hash操作
jedis.hmset("key",map);//添加hashMap
jedis.hset("key","a","2");//修改hashMap中key=a的元素
Map<String,String> map2=jedis.hgetAll("key");//获取hashMap下所有key-value元素
Set<String> keys =jedis.hkeys("key");//获取hashMap下的所有key
List<String> hvals =jedis.hvals("key");//获取hashMap下的所有value
jedis.hexists("key","a");//判断hashMap中是否存在key=a
jedis.hlen("key");//获取key下的元素个数

(7).有序集合操作
Map<String,Double> map=new HashMap<>();//key=member,value=score
map.put("1",1.51);
map.put("2",8.51);
map.put("3",3.51);
map.put("4",4.51);
map.put("5",2.71);
jedis.zadd("key",map);//添加zset
jedis.zadd("key",1.18,"6");//插入zset
Set<Tuple>strings= jedis.zrangeWithScores("key",0,2);//获取区间内score-member
long n=jedis.zcard("key");//获取元素个数
double score=jedis.zscore("key","1");//获取map下member=1的score
n=jedis.zrank("key","6");//获取map下member=6在所有score中的排名
jedis.zrem("key","1");//移除map下member=1的元素

(8).排序操作
jedis.lpush("key","5","3","10","1","2");
List<String> list= jedis.sort("key",new SortingParams().desc());
for (int i=0;i<list.size();i++){
System.out.println(list.get(i));
}

文章参考:https://www.jianshu.com/p/a1038eed6d44

12-21 17:57