个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
Jedis、SpringDataRedis、StringRedisTemplate
Redis的Java客户端使用
🚀Jedis快速入门
引入依赖
:
<dependencies><!--Redis的Java客户端:Jedis 相关依赖--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.0</version></dependency><!--单元测试依赖--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.2</version><scope>test</scope></dependency></dependencies>
测试Java客户端操作Redis
:
测试代码:
importorg.junit.jupiter.api.AfterEach;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;importredis.clients.jedis.Jedis;importjava.util.Map;/**
* @author .29.
* @create 2023-05-08 20:24
*/publicclassJedisTest{privateJedis jedis;//链接Redis@BeforeEachvoidsetUp(){//1.建立连接
jedis =newJedis("192.168.88.128",6379);//参数:ip地址、端口号//2.设置密码
jedis.auth("123456");//3.选择库
jedis.select(0);}//测试java客户端操作Redis(String类型操作)@Testpublicvoidtest1(){//存入数据String result = jedis.set("name",".29.");System.out.println("result = "+result);//获取数据String name = jedis.get("name");System.out.println("name = "+name);}//测试java客户端操作Redis(Hash类型操作)@Testpublicvoidtest2(){//存入数据
jedis.hset("user:1","name","Little29");
jedis.hset("user:1","age","19");//获取数据Map<String,String> result = jedis.hgetAll("user:1");System.out.println(result);}//关闭资源@AfterEachvoidtearDown(){if(jedis !=null){
jedis.close();}}}
测试结果:
⚪—操作String类型—⚪
⚪—操作hash类型—⚪
🚀Jedis连接池
为什么使用Jedis连接池
:
- Jedis本身是线程不安全 的,并且频繁创建和销毁连接会有性能损耗 ,因此推荐大家使用Jedis连接池代替Jedis的直连 方式。
Jedis连接池——配置工具类
:
importredis.clients.jedis.Jedis;importredis.clients.jedis.JedisPool;importredis.clients.jedis.JedisPoolConfig;importjava.time.Duration;/**
* @author .29.
* @create 2023-05-08 20:47
*/publicclassJedisConnectionFactory{//jedis连接池对象privatestaticfinalJedisPool jedisPool;static{JedisPoolConfig jedisPoolConfig =newJedisPoolConfig();//最大连接
jedisPoolConfig.setMaxTotal(8);//最大空闲连接
jedisPoolConfig.setMaxIdle(8);//最小空闲连接
jedisPoolConfig.setMinIdle(0);//设置最长等待时间,单位ms
jedisPoolConfig.setMaxWait(Duration.ofMillis(1000));//jedisPoolConfig.setMaxWaitMillis(1000);//较早版本方式//参数:连接池配置、ip地址、端口号、超时时间、密码
jedisPool =newJedisPool(jedisPoolConfig,"192.168.88.128",6379,1000,"123456");}//获取Jedis对象publicstaticJedisgetJedis(){return jedisPool.getResource();}}
🚀SpringDataRedis快速入门
SpringDataRedis简介
:
- SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做
SpringDataRedis
,官网网址:https://spring.io/projects/spring-data-redis - 功能介绍:
- 提供了对不同Redis客户端的整合(Lettuce和Jedis);- 提供RedisTemplate统一API来操作Reids;- 支持Redis的发布订阅模型;- 支持Reids哨兵和Redis集群;- 支持基于Lettuce的响应式编程;- 支持基于JDK、JSON、字符串、Spring对象的数据序列化和反序列化;- 支持基于Redis的JDKCollection实现;
引入依赖(需要是SpringBoot工程)
:
<!--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>
application.yml配置
spring:redis:host: 192.168.88.128
password:123456port:6379lettuce:pool:max-active:8#最大连接max-idle:8#最大空闲连接max-wait:100#连接等待时间min-idle:0#最小空闲连接
注入RedisTemplate,编写测试
importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.data.redis.core.RedisTemplate;@SpringBootTestclassSpringDataRedisDemoApplicationTests{//注入@AutowiredprivateRedisTemplate redisTemplate;@TestvoidcontextLoads(){//写入一条String数据
redisTemplate.opsForValue().set("age",19);//获取String数据Object age = redisTemplate.opsForValue().get("age");System.out.println("age = "+age);}}
SpringDataRedis的序列化方式
:
- RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化成字节形式,默认是采用JDK序列化。
- 但是此方式得到的结果:可读性差;内存占用大;(缺点)
🚀自定义RedisTemplate的序列化方式
自定义序列化
:
importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.RedisSerializer;/**
* @author .29.
* @create 2023-05-09 16:12
*/@ConfigurationpublicclassRedisConfig{@Bean@ConditionalOnSingleCandidatepublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactory connectionFactory){//创建RedisTemplate对象RedisTemplate<String,Object> redisTemplate =newRedisTemplate<>();//设置连接工厂
redisTemplate.setConnectionFactory(connectionFactory);//创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer =newGenericJackson2JsonRedisSerializer();//设置Key序列化(String类型)
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());//设置value序列化(JSON格式)
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);//返回return redisTemplate;}}
注意
:
- 需要导入SpringMVC依赖或Jackson依赖
Jackson依赖(SpringBoot项目,无须手动指定版本号):
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
测试
:
@SpringBootTestclassSpringDataRedisDemoApplicationTests{//注入@ResourceprivateRedisTemplate<String,Object> redisTemplate;//测试操作Redis@TestvoidcontextLoads(){//写入一条String数据
redisTemplate.opsForValue().set("age",19);
redisTemplate.opsForValue().set("name","自定义姓名");//获取String数据Object age = redisTemplate.opsForValue().get("age");Object name = redisTemplate.opsForValue().get("name");System.out.println("age = "+age);System.out.println("name = "+name);}}
注意
:
- JSON的序列化方式满足我们的需求,单仍然存在问题:为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
- 为了节省空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只存储String类型的key和value。当需要存储java对象时,手动完成对象的序列化和反序列化。
🚀StringRedisTemplate序列化
- Spring默认提供了一个StringRedisTemplate类,它的key和value的系列化默认方式为String方式,省去自定义RedisTemplate的过程。
示例
:
importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.StringRedisTemplate;importjavax.annotation.Resource;importjava.util.Map;@SpringBootTestclassRedisDemoApplicationTests{//使用StringRedisTemplate,手动进行序列化与反序列化@ResourceprivateStringRedisTemplate stringRedisTemplate;//JSON工具privatestaticfinalObjectMapper mapper =newObjectMapper();@TestpublicvoidStringRedisTemplateTest()throwsJsonProcessingException{//设置对象User user =newUser("name3",29);//手动序列化String set = mapper.writeValueAsString(user);//向Redis写入数据
stringRedisTemplate.opsForValue().set("user:3",set);//向Redis获取数据String get = stringRedisTemplate.opsForValue().get("user:3");//手动反序列化User value = mapper.readValue(get,User.class);System.out.println("user:3 = "+value);}@TestpublicvoidtestHash(){//向Redis存入Hash键值对
stringRedisTemplate.opsForHash().put("user:4","HashName","name4");//向Redis获取Hash键值对Map<Object,Object> entries = stringRedisTemplate.opsForHash().entries("user:4");System.out.println(entries);}}
本文转载自: https://blog.csdn.net/ebb29bbe/article/details/134622246
版权归原作者 .29. 所有, 如有侵权,请联系我们删除。
版权归原作者 .29. 所有, 如有侵权,请联系我们删除。