Java的客户端
在Redis官网中提供了各种语言的客户端,地址: https://redis.io/clients
jedis
jedis的官网地址: https://github.com/redis/jedis
1. 引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.0</version>
</dependency>
2. 建立连接
private Jedis jedis;
@BeforeEach
void setUp() {
// 建立连接
jedis = new Jedis("192.168.150.101", 6379);
//设置密码
jedis.auth("123321");
// 选择库
jedis.select(0);
3.测试string
@Test
void testString() {
//插入数据,方法名称就是redis命令名称,非常简单
String result = jedis.set("name","张三");
System.out.println("result =" + result);
//获取数据
String name = jedis.get("name");
System.out.println("name = u + name);
4.释放资源
@AfterEach
void tearDown() {
//释放资源
if (jedis != null){
jedis.close();
}
}
Jedis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐大家使用]edis连接池代替Jedis的直连方式
package com;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author hyk~
*/
public class JedisConnectionFactory {
private static final JedisPool jedispool;
static {
//配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
//最大连接数
poolConfig.setMaxTotal(8);
//最大空闲连接
poolConfig.setMaxIdle(8);
//最小空闲连接
poolConfig.setMinIdle(0);
//等待时长
poolConfig.setMaxWaitMillis(1000);
//创建连接池对象
jedispool = new JedisPool(poolConfig,"localhost",6379,1000,"123456");
}
public static Jedis getJedis(){
return jedispool.getResource();
}
}
SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis
官网地址: https://spring.io/projects/spring-data-redis
提供了对不同Redis客户端的整合 (Lettuce和Jedis)
提供了RedisTemplate统一API来操作Redis
支持Redis的发布订阅模型
支持Redis哨兵和Redis集群
支持基于Lettuce的响应式编程
支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
支持基于Redis的JDKCollection实现
RedisTemplate工具类
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
RedisTemplate在Java中的作用
RedisTemplate
是 Spring Data Redis 提供的一个类,用于在 Java 应用程序中与 Redis 进行交互。它提供了高层次的抽象和便捷的操作方法,使开发者可以方便地执行 Redis 的各种操作(如字符串操作、哈希操作、列表操作、集合操作、有序集合操作等)。以下是 RedisTemplate
的主要作用:
-
数据操作的简化:
RedisTemplate
提供了一系列简化的 Redis 操作方法,使开发者不必直接使用低层次的 Redis 命令,从而提高了开发效率。 -
支持多种数据类型:
RedisTemplate
支持 Redis 的多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 -
事务支持:
RedisTemplate
支持 Redis 事务操作,可以在一个事务中执行多个命令,确保操作的原子性。 -
序列化:
RedisTemplate
提供了多种序列化方式,默认使用JdkSerializationRedisSerializer
,但也可以配置其他序列化方式(如 JSON 序列化、字符串序列化等)。
SpringDataRedis快速入门
1.引入依赖
<!--redis依赖-->
<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>
2.配置文件
spring:
redis:
host: localhost
port: 6379
#password: 密码未设置可以不写
lettuce:
pool:
max-active: 8 #最大连接
max-idle: 8 #最大空闲连接
min-idle: 0 #最小空闲连接
max-wait: 100ms #连接等待时间
3.注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4.编写测试
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
//写入一条String数据
redisTemplate.opsForValue().set("name","jack");
//获取String数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
运行成功
总结
SpringDataRedis的使用步骤:
1.引入spring-boot-starter-data-redis依赖
2.在application.yml配置Redis信息
3.注入RedisTemplate
SpringDataRedis的序列化方式
RedisTemplate可以接收任意0bject作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用]DK序列化,得到的结果是这样的:
可读性差 内存占用较大
可以自定义SpringDataRedis的序列化方式
代码如下:
@Configuration
public class redisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(redisConnectionFactory);
//创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置Key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//设置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashKeySerializer(jsonRedisSerializer);
//返回
return template;
}
}
在测试代码中加入泛型:
在pom.xml文件中写入Jackson依赖
<!--引入Jackson依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
运行代码
再次点开图形化工具查看:
实践:写入对象是否会序列化
1.创建user类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
}
2. 编写测试方法
@Test
void testSaveUser(){
//写入数据
redisTemplate.opsForValue().set("user:100",new User("tom",22));
//获取数据
Object user = redisTemplate.opsForValue().get("user:100");
System.out.println("user="+user);
}
3.运行
4.查看可视化图形
由此可见是可以实现的
StringRedisTemplate
尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图:
为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:
@Autowired
private StringRedisTemplate stringRedisTemplate;
//手动序列化工具
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testSaveUser() throws JsonProcessingException {
//创建对象
User user = new User("tom",22);
//手动序列化
String json = mapper.writeValueAsString(user);
//写入数据
stringRedisTemplate.opsForValue().set("user:200",json);
//获取数据
String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
//手动反序列化
User user1 = mapper.readValue(jsonUser,User.class);
System.out.println("user="+user);
}
运行结果:
可视化图形界面
RedisTemplate的两种序列化实践方案
方案一:
1.自定义RedisTemplate
2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
方案二:
1.使用StringRedisTemplate
2.写入Redis时,手动把对象序列化为JSON
3.读取Redis时,手动把读取到的JSON反序列化为对象
Hash结构的用法
示例:
@Test
void testHash(){
stringRedisTemplate.opsForHash().put("user:400","name","牛马");
stringRedisTemplate.opsForHash().put("user:400","age","22");
Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
System.out.println("entries="+entries);
}
运行结果:
可视化图形:
标签:Java,name,Redis,jedis,user,序列化,RedisTemplate,客户端 From: https://blog.csdn.net/weixin_53891720/article/details/139403659