1、Jedis基本使用
Jedis的基本使用很是简单,只须要建立Jedis对象的时候指定host,port, password便可。固然,Jedis对象又不少构造方法,都大同小异,只是对应和Redis链接的socket的参数不同而已。redis
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对象的建立和销毁过程数据库
2、链接池使用
Jedis链接池是基于apache-commons pool2实现的。在构建链接池对象的时候,须要提供池对象的配置对象,及JedisPoolConfig(继承自GenericObjectPoolConfig)。咱们能够经过这个配置对象对链接池进行相关参数的配置(如最大链接数,最大空数等)。apache
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方法将会是把链接对象返回到对象池,若不是则关闭链接。能够查看以下代码api
public void close() { if (this.dataSource != null) { if (this.client.isBroken()) { this.dataSource.returnBrokenResource(this); } else { this.dataSource.returnResource(this); } } else { this.client.close(); } }
3、Redis的订阅
Redis为咱们提供了publish/subscribe(发布/订阅)功能。咱们能够对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布)消息时,redis就会通知咱们,这样咱们能够收到别人发布的消息。 做为Java的redis客户端,Jedis提供了publish/subscribe的接口app
/** * 消息接收器 */ 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"; }
4、jides经常使用apisocket
(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");//查看键对应值的数据类型ide
(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的元素从小到大排序this
(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