【Redis基础篇】Redis的Java客户端 温馨提示建议在PC端浏览~Redis的Java客户端在Redis官网中提供了各种语言的客户端地址https://redis.io/clientsJedis客户端Jedis的官网地址https://github.com/redis/jedis我们先来个快速入门1、引入依赖dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion3.7.0/version/dependency2、创建Jedis对象建立连接privateJedisjedis;BeforeEachvoidsetUp(){// 建立连接jedisnewJedis(192.168.100.128,6379);// 设置密码jedis.auth(123321);// 选择库jedis.select(0);}3、使用Jedis方法名与Redis命令一致TestvoidtestString(){// 插入数据方法名称就是redis命令名称非常简单Stringresultjedis.set(name,张三);System.out.println(result result);// 获取数据Stringnamejedis.get(name);System.out.println(name name);}4、释放资源AfterEachvoidtearDown(){// 释放资源if(jedis!null){jedis.close();}}Jedis连接池Jedis本身是线程不安全的并且频繁的创建和销毁连接会有性能损耗因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。publicclassJedisConnectionFactory{privatestaticfinalJedisPooljedisPool;static{JedisPoolConfigjedisPoolConfignewJedisPoolConfig();// 最大连接jedisPoolConfig.setMaxTotal(8);// 最大空闲连接jedisPoolConfig.setMaxIdle(8);// 最小空闲连接jedisPoolConfig.setMinIdle(0);// 设置最长等待时间 msjedisPoolConfig.setMaxWaitMillis(200);jedisPoolnewJedisPool(jedisPoolConfig,192.168.150.101,6379,1000,123321);}// 获取Jedis对象publicstaticJedisgetJedis(){returnjedisPool.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实现SpringDataRedis中提供了RedisTemplate工具类其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中SpringDataRedis快速入门SpringBoot已经提供了对SpringDataRedis的支持使用非常简单1、引入依赖!--Redis依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!--连接池依赖--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency2、在application.yml配置Redis信息spring:redis:host:192.168.100.128port:6379password:123321lettuce:pool:max-active:8#最大连接max-idle:8#最大空闲连接min-idle:0#最小空闲连接max-wait:100#连接等待时间3、注入RedisTemplateAutowiredprivateRedisTemplateredisTemplate;4、编写测试SpringBootTestpublicclassRedisTest{AutowiredprivateRedisTemplateredisTemplate;TestvoidtestString(){// 插入一条string类型数据redisTemplate.opsForValue().set(name,李四);// 读取一条string类型数据ObjectnameredisTemplate.opsForValue().get(name);System.out.println(name name);}}SpringDataRedis的序列化方式RedisTemplate可以接收任意Object作为值写入Redis只不过写入前会把Object序列化为字节形式默认是采用JDK序列化得到的结果是这样的缺点可读性差内存占用较大我们可以自定义RedisTemplate的序列化方式代码如下BeanpublicRedisTemplateString,ObjectredisTemplate(RedisConnectionFactoryredisConnectionFactory)throwsUnknownHostException{// 创建TemplateRedisTemplateString,ObjectredisTemplatenewRedisTemplate();// 设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置序列化工具GenericJackson2JsonRedisSerializerjsonRedisSerializernewGenericJackson2JsonRedisSerializer();// key和 hashKey采用 string序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value和 hashValue采用 JSON序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);returnredisTemplate;}StringRedisTemplate尽管JSON的序列化方式可以满足我们的需求但依然存在一些问题如图为了在反序列化时知道对象的类型JSON序列化器会将类的class类型写入json结果中存入Redis会带来额外的内存开销。为了节省内存空间我们并不会使用JSON序列化器来处理value而是统一使用String序列化器要求只能存储String类型的key和value。当需要存储Java对象时手动完成对象的序列化和反序列化。Spring默认提供了一个StringRedisTemplate类它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程AutowireprivateStringRedisTemplatestringRedisTemplate;// JSON工具privatestaticfinalObjectMappermappernewObjectMapper();TestvoidtestStringTemplate()throwsJsonProcessingException{// 准备对象UserusernewUser(虎哥,18);// 手动序列化Stringjsonmapper.writeValueAsString(user);// 写入一条数据到redisstringRedisTemplate.opsForValue().set(user:200,json);// 读取数据StringvalstringRedisTemplate.opsForValue().get(user:200);// 反序列化Useruser1mapper.readValue(val,User.class);System.out.println(user1 user1);}小结RedisTemplate的两种序列化实践方案方案一1、自定义RedisTemplate2、修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer方案二1、使用StringRedisTemplate2、写入Redis时手动把对象序列化为JSON3、读取Redis时手动把读取到的JSON反序列化为对象