目录
一、介绍
二、Jedis的使用
三、SpringDataRedis的使用
创建:
一、介绍
在Redis官网,提供了多种编程语言的客户端,如Java、C++等,官网地址:Clients | Redis
而对于Java的客户端有很多,但是用的最多的就是下图的前两个:
二、Jedis的使用
创建一个普通javamaven项目:
在pom.xml文件中引入依赖:
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
建立连接:
创建测试类:
package com.jedis.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import redis.clients.jedis.Jedis;
@RunWith(JUnit4.class)
public class JedisTest {
private Jedis jedis;
@Test
public void run(){
jedis=new Jedis("127.0.0.1",6379);
jedis.select(0);
String jedisTest = jedis.set("jedisTest", "123");
System.out.println(jedisTest);
String s = jedis.get("jedisTest");
System.out.println(s);
if(jedis!=null){
jedis.close();
}
}
}
运行结果:
jedis提供的方法和指令名称是相同的,因此比较好上手。
通过上述操作,我们可以看出jedis的使用,还是非常方便的,只需要三步就可以实现:
1、导入依赖。
2、建立连接。
3、执行方法(和命令同名)。
jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此,我们使用jedis连接池来代替上述这种直连的方式。
package com.jedis.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@RunWith(JUnit4.class)
public class JedisTest {
private JedisPool jedisPool;
@Test
public void run2(){
JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
//最大连接
jedisPoolConfig.setMaxTotal(8);
//最大空闲连接
jedisPoolConfig.setMaxIdle(8);
//最小空闲连接数量
jedisPoolConfig.setMinIdle(0);
//设置最长等待时间
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool=new JedisPool(jedisPoolConfig,"127.0.0.1",6379,1000);
//通过连接池获取连接
Jedis resource = jedisPool.getResource();
String myTest = resource.set("myTest", "1234");
System.out.println(myTest);
String s = resource.get("myTest");
System.out.println(s);
}
}
输出结果:
三、SpringDataRedis的使用
SpringData是Spring中数据操作的模块,官网地址:Spring Data Redis
包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis
提供了对不同Redis客户端的整合(Lettuce和Jedis)
提供了RedisTemplate统一API来操作Redis
支持Redis的发布订阅模型
支持Redis哨兵和Redis集群
支持基于Lettuce的响应式编程
支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化支持基于Redis的JDKCollection实现
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。RedisTemplate,是根据命令种类来分类的方法。并且将不同数据类型的操作API封装到了不同的类型中:
创建:
SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单。
首先,创建SpringBoot项目:
导入相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
在resource目录下创建application.yaml文件:
并填充内容:
spring:
redis:
host: 127.0.0.1
port: 6379
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100
测试代码:
package com.example.springdataredistest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class SpringDataRedisTestApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("redisTemplate","success");
String o = (String) redisTemplate.opsForValue().get("redisTemplate");
System.out.println(o);
}
}
运行结果:
但是我们发现,Redis数据库中存入的并非我们所想的内容:
这是因为采用了SpringDataRedis默认的序列化方式。
RedisTemplate可以接收任意0bject作为值写入Redis,只不过写入前会把0bject序列化为字节形式,默认是采用IDK序列化,得到的结果是上面这样的。
这种方式有很大的缺点:1、可读性差。2、内存占用大。
因此,我们可以自定义序列化方式,来得到我们想要的结果。
我们创建一个配置类:
package com.jedis.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@RunWith(JUnit4.class)
public class JedisTest {
private Jedis jedis;
@Test
public void run(){
jedis=new Jedis("127.0.0.1",6379);
jedis.select(0);
String jedisTest = jedis.set("jedisTest", "123");
System.out.println(jedisTest);
String s = jedis.get("jedisTest");
System.out.println(s);
if(jedis!=null){
jedis.close();
}
}
private JedisPool jedisPool;
@Test
public void run2(){
JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
//最大连接
jedisPoolConfig.setMaxTotal(8);
//最大空闲连接
jedisPoolConfig.setMaxIdle(8);
//最小空闲连接数量
jedisPoolConfig.setMinIdle(0);
//设置最长等待时间
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool=new JedisPool(jedisPoolConfig,"127.0.0.1",6379,1000);
//通过连接池获取连接
Jedis resource = jedisPool.getResource();
String myTest = resource.set("myTest", "1234");
System.out.println(myTest);
String s = resource.get("myTest");
System.out.println(s);
}
}
导入依赖:
<!-- Jackson依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
测试方法:
package com.example.springdataredistest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
public class Test2 {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Test
public void run(){
redisTemplate.opsForValue().set("redisTemplateNew","successNew");
String o = (String) redisTemplate.opsForValue().get("redisTemplateNew");
System.out.println(o);
}
}
执行结果:
数据库展示: