目录
一、介绍
二、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;@Testpublic 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;@Testpublic 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.1port: 6379lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-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 {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid 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;@Testpublic 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;@Testpublic 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 {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Testpublic void run(){redisTemplate.opsForValue().set("redisTemplateNew","successNew");String o = (String) redisTemplate.opsForValue().get("redisTemplateNew");System.out.println(o);}
}
执行结果:
数据库展示: