Redis的Java客户端
Jedis
Jedist的官网地址:https:/github.com/redis/jedis
1. 引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
2. 单元测试
public class TestJedis {
private Jedis jedis;
@BeforeEach
void before() {
jedis = new Jedis("82.157.9.110", 6379);
jedis.auth("fengte");
jedis.select(0);
}
@Test
public void test01() {
String result = jedis.set("name", "张三");
System.out.println("result = " + result);
String name = jedis.get("name");
System.out.println("name = " + name);
}
@AfterEach
void after() {
if (jedis != null) {
jedis.close();
}
}
}
Jedis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用jedis连接池代替
jedis的直连方式。
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(8);
jedisPoolConfig.setMaxIdle(8);
jedisPoolConfig.setMinIdle(0);
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool = new JedisPool(jedisPoolConfig, "82.157.9.110", 6379,
1000, "fengte");
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redist的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis
- 提供了对不同Redis客户端的整合(Lettuce和edis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis:集群
- 支持基于Lettuce的响应式编程
- 支持基于引DK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的DKCollection实现
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redist的操作。并且将不同数据类型的操作
API封装到了不同的类型中:
API | 返回值类型 | 说明 |
---|
redisTemplate.opsForValue() | ValueOperations | 操作String类型数据 | redisTemplate.opsForHash() | HashOperations | 操作Hash类型数据 | redisTemplate.opsForList() | ListOperations | 操作List类型数据 | redisTemplate.opsForSet() | SetOperations | 操作Set类型数据 | redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet类型数据 | redisTemplate | | 通用命令 |
SpringBoot已经提供了对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>
spring:
redis:
port: 6379
host: 127.0.0.1
password: ******
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("name","ls");
String name = redisTemplate.opsForValue().get("name").toString();
System.out.println(name);
}
然而这样是有问题的
- 修改SpringDataRedisTemlate序列化方式
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
}
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Test
void testSaveUser() {
User user = new User("张三", 21);
redisTemplate.opsForValue().set("user:1", user);
Object o = redisTemplate.opsForValue().get("user:1");
System.out.println(o);
}
}
也存在一定的弊端,@class占用了一定的空间
为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储
String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
- 使用StringRedisTemplate,进行手动序列化
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testStringTemplate() throws JsonProcessingException {
User user = new User("李四",21);
String json = new ObjectMapper().writeValueAsString(user);
stringRedisTemplate.opsForValue().set("user:2",json);
String u = stringRedisTemplate.opsForValue().get("user:2");
User user1 = new ObjectMapper().readValue(u, User.class);
System.out.println(user1);
}
RedisTemplate的两种序列化实践方案:
方案一:
- 自定义RedisTemplate
- 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
方案二:
- 使用StringRedisTemplate
- 写入Redis时,手动把对象序列化为JSON
- 读取Redis时,手动把读取到的JSON反序列化为对象
|