Redis的JAVA客户端
文章目录
- Redis的JAVA客户端
- 一、Redis的Java客户端的种类
- 二、Jedis
- 2.1、使用步骤
- 2.2、Jedis连接池
- 三、[SpringDataRedis](https://spring.io/projects/spring-data-redis)
- 3.1、介绍
- 3.2、RedisTemplate
- 3.3、SpringDataRedis使用步骤
- 3.4、SpringDataRedis的序列化方式
- 四、StringRedisTemplate
- 4.1、解决方法
- 4.2、**ObjectMapper介绍**
- 4.3、StringRedisTemplate类
- 五、其它结构的使用
一、Redis的Java客户端的种类
二、Jedis
Jedis是一个用于连接和与Redis服务器进行交互的Java客户端库。Redis是一个高性能的内存数据存储系统,Jedis允许Java应用程序通过简单的API与Redis进行通信。
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency>
2.1、使用步骤
- 获取Jedis连接
//设置主机地址和端口号
Jedis jedis = new Jedis("192.168.74.1xx", 6379);
- 给Jedis设置redis密码
// 设置密码认证
jedis.auth("123456");
- 操作
HashMap<String,String> map=new HashMap<>();map.put("id","1");map.put("name","radan");jedis.hset("user:1",map);System.out.println(jedis.hgetAll("user:1"));
- 释放连接
jedis.close();
2.2、Jedis连接池
Jedis本身就是线程不安全的,并且频繁的创建和销毁会有性能的损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。(JedisPool)
JedisConnectionFactory 连接池配置类
public class JedisConnectionFactory {private static JedisPool jedisPool = null;static {// 配置连接池JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();// 最大连接数jedisPoolConfig.setMaxIdle(8);// 最大空闲连接jedisPoolConfig.setMaxIdle(8);// 最小空闲连接jedisPoolConfig.setMinIdle(0);// 设置最长等待时间 msjedisPoolConfig.setMaxWaitMillis(200);jedisPool = new JedisPool(jedisPoolConfig,"192.168.74.128",6379);}// 获取Jedis对象public static Jedis getJedis(){return jedisPool.getResource();}public static void closeJedis(){jedisPool.close();}
}
三、SpringDataRedis
3.1、介绍
Spring Data Redis是Spring框架的一个模块,用于简化在Java应用程序中与Redis数据库进行交互的过程。它提供了高级别的抽象和易于使用的API,使得在Spring应用中使用Redis变得更加容易。
Spring Data Redis的一些关键特点和用途
-
Redis操作抽象化: Spring Data Redis抽象了与Redis数据库的交互,允许你以面向对象的方式操作数据。你可以将Java对象存储在Redis中,而不必担心底层的Redis命令。
-
注解支持: Spring Data Redis支持注解,使得在Java类中定义Redis数据模型更加方便。你可以使用注解来标记实体类、字段和方法,以指定它们与Redis数据之间的映射关系。
-
连接池管理: Spring Data Redis集成了连接池管理,确保有效地管理Redis连接。这有助于提高性能和资源利用率。
-
声明式事务: 你可以使用Spring的声明式事务管理来确保Redis操作的一致性。这使得在多个Redis命令之间进行原子性操作更加容易。
-
缓存支持: Spring Data Redis还提供了与Spring框架的缓存抽象集成,使得可以轻松地将Redis用作应用程序的缓存存储。
-
查询支持: 该模块允许你使用Spring表达式语言(SpEL)构建自定义查询,以根据不同的条件检索数据。
-
Pub/Sub支持: Spring Data Redis支持发布/订阅模式,允许你创建消息发布者和订阅者,以便实现实时消息传递。
3.2、RedisTemplate
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型当中:
3.3、SpringDataRedis使用步骤
SpringBoot已经提供了对SpringBootDataRedis的支持,使用非常方便:
- 引入依赖
<!-- 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><version>2.11.1</version></dependency>
- 配置文件
spring:redis:host: 192.168.74.128port: 6379password: 123456lettuce:pool:max-active: 8 # 最大连接max-idle: 8 # 最大空闲连接max-wait: 100 # 最小等待时间min-idle: 0 # 连接等待时间
- 注入RedisTemplate
@Autowiredprivate RedisTemplate redisTemplate;
- 测试
void test001(){// 插入一条数据redisTemplate.opsForValue().set("name","李四");// 读取一条数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name="+name);}
解决方法:
3.4、SpringDataRedis的序列化方式
可以自定义RedisTemplate的序列化方式,代码如下:
- 引入依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
- 编写配置类
要求RedisTemplate对象的键使用String类型,值使用Object对象类型
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){// 创建RedisTemplate对象RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置Key的序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// 设置Value的序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);// 返 回return redisTemplate;}}
- 测试结果
@Testvoid test002(){// 插入一条数据redisTemplate.opsForValue().set("user:20",new User("张三",28));// 读取一条数据Object name = redisTemplate.opsForValue().get("user:20");System.out.println("name="+name);}
这样也有缺点:为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入redis,会带来额外的开销。
四、StringRedisTemplate
解决:JSON序列化器会将类的class类型写入json结果中,存入redis,会带来额外的开销这一问题
4.1、解决方法
为了节省内存空间,我们并不会使用JSON序列化器来处理Value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,需要手动完成对象的序列化和反序列化。
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自义RedisTemplate的过程:
4.2、ObjectMapper介绍
是Java编程语言中常用的库,用于将Java对象与JSON(JavaScript对象表示法)数据之间进行转换。它是Jackson库的一部分,提供了一套用于在Java中处理JSON的数据处理工具。
ObjectMapper主要使用方法:
// 将Java对象序列化为JSON字符串String jsonString = objectMapper.writeValueAsString(person);
// 将JSON字符串反序列化为Java对象Person deserializedPerson = objectMapper.readValue(jsonString, 需要待转的对象类.class);
4.3、StringRedisTemplate类
StringRedisTemplate类的使用:
@SpringBootTest
public class RedisString {@Autowiredprivate StringRedisTemplate stringRedisTemplate;//引入ObjectMapperJSON处理类private static final ObjectMapper objectMapper = new ObjectMapper();@Testvoid testString() throws JsonProcessingException {User user = new User("李四", 14);// 1.存数据// 将User对象转换为Json数据String jsonString = objectMapper.writeValueAsString(user);System.out.println(jsonString); // {"username":"李四","age":14}stringRedisTemplate.opsForValue().set("name",jsonString);// 2.取数据String name = stringRedisTemplate.opsForValue().get("name");System.out.println(name); // {"username":"李四","age":14}// 将JSON数据转为对象格式User user1 = objectMapper.readValue(name, User.class);System.out.println(user1); // User(username=李四, age=14)}
}
之前的问题得到了解决:
五、其它结构的使用
Hash结构的使用:使用基本没有太大差别,更多的是偏向Java代码的这种分格
代码:
@Testvoid test002(){// 存数据stringRedisTemplate.opsForHash().put("user:23","name","小王");stringRedisTemplate.opsForHash().put("user:23","age","6");// 取一个字段Object name = stringRedisTemplate.opsForHash().get("user:23", "name");System.out.println(name);// 取所有的字段Map<Object, Object> objectMap = stringRedisTemplate.opsForHash().entries("user:23");System.out.println(objectMap);}
测试: