管道
客户端和Redis使用TCP协议连接。不论是客户端向Redis发送命令还是Redis向客户端返回命令的执行结果,都需要经过网络传输。这两个部分的总耗时称为往返时延。
根据网络性能不同,往返时延也不同,大致来说本地回环地址的往返时延在数量级上相当于处理一条简单命令的时间。
如果执行较多的命令,每个命令的往返时延累加起来对性能还是有一定影响的。
在执行多个命令时每条命令都需要等待上一条命令执行完(即收到Redis的返回结果)才能执行。
即使命令不需要上一条命令的执行结果。
Redis的底层通信协议对管道提供了支持,通过管道可以一次性发送多条命令并在执行完后一次性地将结果返回。
当一组命令中每条命令都不依赖于之前命令地执行结果时就可以将这组命令一起通过管道发出。
管道通过减少客户端和Redis地通信次数来实现降低往返时延累计值地目的。
接下来我们会具体地结合在编程地时候如何使用管道
使用JAVA操作Redis
我们必须使用Redis的JAVA客户端才能在JAVA应用中使用Redis。我们一般选择使用Jedis这个开源并且方便的Redis JAVA客户端。
入门案例
(1)首先我们在JAVA中使用Jedis,需要导入jedis.jar和commons-pool.jar包
public class RedisDemo {
public static void main(String[] args) {
//获取连接 构造参数为空则默认为localhost 和 6379端口
Jedis jedis=new Jedis("192.168.127.129",6379);
jedis.set("Hello","JAVA");
//关闭连接
jedis.close();
}
}
操作五种数据类型
使用Jedis非常简单,因为Jedis提供的方法和Redis的命令是一样的,这里我们简单的示范几个命令即可,不再一一的去使用。
public class RedisDemo {
public static void main(String[] args) {
Jedis jedis=new Jedis("192.168.127.129",6379);
//设置字符串类型值
jedis.set("Hello","JAVA");
//获取字符串类型值
String stringValue=jedis.get("Hello");
System.out.println(stringValue);
//设置带过期时间的字符串类型键
jedis.setex("expireKey",20,"ABC");
//设置hash类型键
jedis.hset("car","name","bmw");
jedis.hset("car","price","5000");
//获取hash类型值
Map<String, String> car = jedis.hgetAll("car");
Set<String> carSet = car.keySet();
for(String key:carSet){
String value=car.get(key);
System.out.println(value);
}
//设置列表类型值
jedis.lpush("listKey","a","b","c");
jedis.rpush("listKey","d","e","f");
//弹出列表类型值
String lpop = jedis.lpop("listKey");
System.out.println(lpop);
String rpop = jedis.rpop("listKey");
System.out.println(rpop);
//获取列表类型所有值
List<String> listKey = jedis.lrange("listKey", 0, -1);
System.out.println(listKey);
//设置集合类型值
jedis.sadd("setKey","java","c++","asm");
//获取集合类型值
Set<String> setKey = jedis.smembers("setKey");
System.out.println(setKey);
//设置有序集合类型值
jedis.zadd("zsetKey",60,"数学");
jedis.zadd("zsetKey",70,"语文");
jedis.zadd("zsetKey",80,"英语");
//获取有序集合类型值
Set<String> zsetKey = jedis.zrange("zsetKey", 0, -1);
System.out.println(zsetKey);
//关闭连接
jedis.close();
}
}
在Jedis中使用管道
public class RedisDemo {
public static void main(String[] args) {
Jedis jedis=new Jedis("192.168.127.129",6379);
Pipeline pipelined = jedis.pipelined();
pipelined.set("key1","value1");
pipelined.sadd("key2","value2","value3");
Response<String> key1 = pipelined.get("key1");
Response<Set<String>> key2 = pipelined.smembers("key2");
//一次性发送命令
pipelined.sync();
System.out.println(key1.get());
System.out.println(key2.get());
jedis.close();
}
}
在Jedis中使用事务
public class RedisDemo {
public static void main(String[] args) {
Jedis jedis=new Jedis("192.168.127.129",6379);
jedis.set("count","100");
//开启事务,使用事务对象执行在事务里的操作
Transaction transaction = jedis.multi();
Response<Long> count = transaction.incrBy("count", 50);
Response<Long> count1 = transaction.incrBy("count", 500);
//执行事务
transaction.exec();
System.out.println(count.get());
System.out.println(count1.get());
jedis.close();
}
}
在Jedis中使用连接池
public class RedisDemo {
public static void main(String[] args) {
//获取连接池对象,这里使用默认配置,我们还可以自己指定配置
JedisPool jedisPool=new JedisPool("192.168.127.129",6379);
//获取Jedis连接
Jedis jedis = jedisPool.getResource();
jedis.set("pool","test");
String pool = jedis.get("pool");
System.out.println(pool);
//归还连接
jedis.close();
}
}