0


⑩【Redis Java客户端】:Jedis、SpringDataRedis、StringRedisTemplate

在这里插入图片描述

个人简介: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);}}

标签: redis java 数据库

本文转载自: https://blog.csdn.net/ebb29bbe/article/details/134622246
版权归原作者 .29. 所有, 如有侵权,请联系我们删除。

“⑩【Redis Java客户端】:Jedis、SpringDataRedis、StringRedisTemplate”的评论:

还没有评论