Java连接Redis
一、Java连接Redis的方法
1.1、创建Maven工程并导入需要的依赖
<dependencies>
<!-- Jedis-->
<dependency>
<groupld>redis.clients</groupld>
<artifactld>jedis</artifactld>
<version>2.9.0</version>
</dependency>
< !--2、Junit测试-->
<dependency>
<groupld>j unit</groupld>
<artifactld>j unit</artifactld>
<version>4.12</version>
</dependency>
<!--3、 Lombok-->
<dependency>
<groupld>org.projectlombok</groupld>
<artifactld>lombok</artifactld>
<version>1.16.20</version>
</dependency>
〈/dependencies〉
1.2、测试代码
public class Denol {
@Test
public void set(){
//1 .连接Redis
Jedis jedis = new Jedis("192.168.199.109",6379);
//2.操作Redis -因为Redis的命令是什么,Jedis的方法就是什么 jedis.set("name'*,"李四”);
//3.释放资源
jedis.close();
}
@Test
public void get(){
//1 .连接Redis
Jedis jedis = new Jedis('192.168.199.109",6379);
〃2.操作Redis -因为Redis的命令是什么,Jedis的方法就是什么 String value = jedis.get("name");
System.out.println(value);
//3.释放资源
jedis.close();
}
}
二、Jedis存储一个对象到Redis以byte[]的形式
2.1、准备一个实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String name;
private Date birthday;
//省略get/set方法
}
2.2、导入依赖
< !― 4.导入spring-context —>
<dependency>
<groupld>org.springframework</groupId>
<artifactld>spring-context</artifactld>
<version>4.3.18.RELEASE</version>
</dependency>
2.3、业务实现
public class Demo2 {
//存储对象-以byte[]形式存储在Redis中
@Test
public void setByteArray(){
//1.连接Redis服务
Jedis jedis = new Jed is("192.168.199.109 ", 6379);
〃2.1 准备 key(St ring)-value (User)
String key = "user";
User value = new User(1,"张三",new Date());
//2.2 将key和value转换为byte[]
byte[] byteKey = SerializationUtils.serialize(key);
byte[] byteValue = SerializationUtils.serialize(value); //2.3 将key和value存储到Redis
jedis.set(byteKey,byteValue);
//3.释放资源
jedis.close();
}
//获取对象-以byte[]形式在Redis中获取
@Test
public void getByteArray(){
//1.连接Redis服务
Jedis jedis = new Jed is("192.168.199.109",6379);
//2.1 准备 key
String key = "user";
//2.2 将key转换为byte[]
byte[] byteKey = SerializationUtils.serialize(key);
//2.3 jedis去Redis中获取value
byte[] value = jedis.get(byteKey);
//2.4将value反序列化为User对象
User user = (User) SerializationUtils.deserialize(value): 〃2.5輸出
System.out.printIn("user: + user);
//3.释放资源
jedis.close():
}
}
三、Jedis存储一个对象到Redis以String的形式
3.1、导入依赖
<!--导入fastJSON -->
<dependency>
<groupld>com.alibaba</groupld>
<artifactld>fastj son</artifactld>
<version>1.2.47</version>
</dependency>
3.2、测试代码
public class Demo3 {
//存储对象-以String形式存储
@Test
public void setString(){
//1.连接Redis
Jedis jedis = new Jed is(H192.168.199.109",6379);
//2.1 准备 key(St ring)-value (User)
String stringKey = stringllser ';
User value = new User(2,"李四",new Date());
//2.2使用fastJSON将value转化为json字符串
String stringValue = JSON.toJSONString(value);
//2.3存储到Redis中
jedis.set(stringKey,stringValue);
//3.释放资源
jedis.close();
}
//获取对象-以String形式获取
@Test
public void getString()(
//1.连接Redis
Jedis jedis = new Jedis("192.168.199.109",6379);
//2.1准备一个key
String key = "stringUser";
//2.2 去Redis中查询value
String value = jedis.get(key):
//2.3将value反序列化为User
User user = JSON.parseObject(value, User.class);
//2.4輸出
System.out.printIn('user: + user);
//3.释放资源
jedis.close();
}
}
四、Jedis连接池的操作
使用连接池操作Redis,避免频繁创建和销毁链接对象消耗资源
@Test
public void pool2(){
//I.创建连接池配置信息
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(100); //连接池中最大的活跃数
poolConfig.setMaxIdle(10); // 最大空闲数
poolConfig.setMinIdle(5); // 最小空闲数
poolConfig.setMaxWaitMillis(3000); //当连接池空了之后,多久没获取至JJedis对象,就超时
//,创建连接池
JedisPool pool = new JedisPool( poolConfig, u 192.168.199.10911,6379);
//3.通过连接池获取jedis对象
Jedis jedis = pool.getResource();
//4.操作
String value = jedis.get( stringUser");
System.out.printIn("user: + value);
//5.释放资源
jedis.close();
}
五、Redis的管道操作
因为在操作Redis的时候,执行一个命令需要先发送请求到Redis服务器,这个过程需要经历网络的延退,Redis还需要给客户端一个响+应。
如果我需要一次性执行很多个命令,上述的方式效率很低,可以通过Redis的管道,先将命令放到客户端的一个Pipeline中,之后一次 性的将全部命令都发送到Redis服务,Redis服务一次性的将全部的返回结果响应给客户端。
// Redis管道的操作
@Test
public void pipeline(){
//1 .创建连接池
JedisPool pool = new JedisPool("192.168.199.109",6379);
long q= System.currentTimeMillis();
//2.获取一个连接对象
Jedis jedis = pool.getResource();
//3.创建管道
Pipeline pipelined = jedis.pipelined();
//3.执行incr - 100080次放到管道中
for (int i = 0; i < 100000; i++) { pipelined.incr("qq”);
}
//4.执行命令
pipelined.syncAndReturnAll();
//5.释放资源
jedis.close();
System.out.printIn(System.currentTimeMiIlls() - q);
}