Redis快速入门,分两个客户端:Jedis和SpringDataRedis
使用Jdedis
1、引入依赖
redis.clients
jedis
3.7.0
org.junit.jupiter
junit-jupiter
5.7.0
test
2、创建测试类:
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
/**
* @author 凯哥Java
*/
public class JedisTest {
private Jedis jedis;
@BeforeEach
public void initJedis(){
jedis = new Jedis("192.168.50.135",6379);
}
@Test
public void testString(){
String result = jedis.set("name","kaige");
System.out.println("set Result"+result);
String nameValue = jedis.get("name");
System.out.println("v:"+nameValue);
}
@Test
public void hashTest(){
Map value = new HashMap();
value.put("id","1");
value.put("name","hset1");
value.put("age","23");
Long result = jedis.hset("persion_1",value);
System.out.println("set Result"+result);
String age = jedis.hget("persion_1","age");
System.out.println("age:"+age);
}
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}
}
说明:
如果生产环境就这么使用,会出问题的。jedis是线程不安全的,而且创建、销毁也是很消耗的。所以使用连接池方式:
创建连接池:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author 凯哥Java
* @description jedis连接池
*/
public class JedisFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig poolConfig = new JedisPoolConfig();
//最大连接数
poolConfig.setMaxTotal(8);
//最大空闲连接
poolConfig.setMaxIdle(8);
//等待市场
poolConfig.setMaxWaitMillis(1000);
//最小空闲连接
poolConfig.setMinIdle(0);
jedisPool = new JedisPool(poolConfig,"192.168.50.135",6379);
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
使用:
二:springDataRedis
springData介绍:
springDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同类型中:
spring 默认使用的是lettuce客户端的。如果要使用jedis的话,需要自己引入相关依赖。
使用springdataRedis步骤:
1:引入依赖
dependency>
<groupId
<artifactId
dependency>
dependency>
<groupId
<artifactId
dependency>
2:配置Redis
application.yaml文件:
spring:
redis:
host: 192.168.50.135
port: 6379
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100ms
3:写测试类:
需要注意:在测试类上,一定要写入@RunWith(SpringRunner.class)这个注解。如果不写,会报redisTemplate空指针异常。
执行完成之后,我们到Redis库中查看:
为什么存入进去的数据,是乱码的呢?而且,有一个name,是我们自己set的,乱码的这个是我们通过RedisTemplate插入的,我们来看看RedisTemplate源码
RedisTemplate需要设置序列化:
我们跟set源码,会发现,set是使用了value的序列化:
跟着源码,我们知道,默认使用的是jdk自带的序列化工具。
为了解决两个name(一个是正常的name,一个是乱码的name)问题,乱码的缺点:
1:可读性差
2:内存占用较大
我们可以自定义RedisTemplate的序列化方式,代码如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
/**
* @author 凯哥Java
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){
// 创建RedisTemplate对象
RedisTemplate template = new RedisTemplate();
// 设置连接工厂
template.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
// 设置Key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 设置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
// 返回
return template;
}
}
配置好自定义的之后,再次执行,就可以了。
通过自定义序列化之后,我们在Redis中存入一个user对象:
存入值,我们发现在Redis库中,对象中多了类全路径。
这样有个缺点:增加了额外的内存开销的。那么这个时候怎么办呢?
我们可以规定,在使用String类型的时候,存入对象的是,需要先将对象序列化,然后获取后,在将对象反序列即可。
本系列教程其他文章
大家好,我是凯哥Java(kaigejava),乐于分享技术文章,欢迎大家关注“凯哥Java”,及时了解更多。让我们一起学Java。也欢迎大家有事没事就来和凯哥聊聊~~~
领取专属 10元无门槛券
私享最新 技术干货