目录
Jedis快速入门
Jedis的官网地址: https://github.com/redis/jedis
- 新建一个Maven工程并引入以下依赖
<!--引入Jedis依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.0</version>
</dependency>
<!--引入单元测试依赖-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
- 编写测试类并与Redis建立连接
private Jedis jedis;
@BeforeEach //被该注解修饰的方法每次执行其他方法前自动执行
void setUp(){
jedis = new Jedis("127.0.0.1",6379);
jedis.select(0);
}
- 最后不要忘记编写一个释放资源的方法
@AfterEach //被该注解修饰的方法会在每次执行其他方法后执行
void tearDown(){
// 1.释放资源
if (jedis != null){
jedis.close();
}
}
- 执行
testString()
方法后测试结果如图所示
Jedis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用Jedis连接池代替Jedis的直连方式
public class JedisConnectionFactory {
private static final JedisPool JEDIS_POOL;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(8);
jedisPoolConfig.setMaxIdle(8);
jedisPoolConfig.setMaxIdle(0);
jedisPoolConfig.setMaxWaitMillis(200);
JEDIS_POOL = new JedisPool(jedisPoolConfig,"127.0.0.1",6379,1000);
}
public static Jedis getJedis(){
return JEDIS_POOL.getResource();
}
}
替代原来的连接
@BeforeEach
void setUp() {
// jedis = new Jedis("127.0.0.1", 6379);
jedis = JedisConnectionFactory.getJedis();
jedis.select(0);
}
SpringDataRedis介绍
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做
官网地址: https://spring.io/projects/spring-data-redisSpringDataRedis
- 提供了对不同Redis客户端的整合(
Lettuce
和Jedis
) - 提供了
RedisTemplate
统一API来操作Redis - 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
SpringDataRedis快速入门
- 引入依赖
<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>
- 编写配置文件
application.yml
(连接池的配置在实际开发中是根据需求来的)
spring:
redis:
port: 6379
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100
host: localhost
- 编写测试类执行测试方法
@SpringBootTest
class DemoRedisApplicationTests {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("name", "xin");
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name:" + name);
}
}
RedisSerializer配置
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化
,得到的结果是这样的
缺点:
- 可读性差
- 内存占用较大
那么如何解决以上的问题呢?我们可以通过自定义RedisTemplate序列化的方式来解决。
- 编写一个配置类
RedisConfig
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
{
//创建 RedisTemplate 对象
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
//设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
//创建JSON序列化工具
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置key的序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
//设置value序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
//返回
return redisTemplate;
}
}
- 此时我们已经将RedisTemplate的key设置为
String序列化
,value设置为Json序列化
的方式,再来执行方法测试
- 由于我们设置的value序列化方式是Json的,因此我们可以直接向redis中插入一个对象
@Test
void testSaveUser() {
redisTemplate.opsForValue().set("user:100",new User("cheese",21));
User user = (User) redisTemplate.opsForValue().get("user:100");
System.out.println("user:"+user);
}
尽管Json序列化可以满足我们的需求,但是依旧存在一些问题。
如上图所示,为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
那么我们如何解决这个问题呢?我们可以通过下文的 StringRedisTemplate
来解决这个问题。
StringRedisTemplate
为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程
- 我们可以直接编写一个测试类使用StringRedisTemplate来执行以下方法
@SpringBootTest
class DemoRedisStringApplicationTests {
@Resource
private StringRedisTemplate stringRedisTemplate;
private static final ObjectMapper MAPPER = new ObjectMapper();
@Test
void testStringTemplate() throws JsonProcessingException {
//创建对象
User user = new User("xin", 21);
//手动序列化
String json = MAPPER.writeValueAsString(user);
//写入数据
stringRedisTemplate.opsForValue().set("user:200", json);
//获取数据
String val = stringRedisTemplate.opsForValue().get("user:200");
//手动反序列化
User user1 = MAPPER.readValue(val, User.class);
System.out.println("user1" + user1);
}
}
执行完毕回到Redis的图形化客户端查看结果