Redis基础day02

Redis基础day02
一、Jedis1. Jedis官网地址https://github.com/redis/jedis2. 快速入门1引入Maven依赖dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion3.7.0/version/dependency2建立Redis直连privateJedisjedis;BeforeEachvoidsetUp(){//建立连接jedisnewJedis(192.168.100.129,6379);//设置密码jedis.auth(1234);//选择数据库jedis.select(0);}3测试String类型操作TestvoidtestString(){//添加Stringresultjedis.set(name,阳哥);System.out.println(result);//获取Stringnamejedis.get(name);System.out.println(name);}4释放连接资源AfterEachvoidtearDown(){if(jedis!null){jedis.close();}}3. Jedis连接池使用原因Jedis原生直连线程不安全频繁创建、销毁TCP连接会产生大量性能开销项目生产环境推荐使用Jedis连接池复用连接。连接池工具类publicclassJedisConnectionFactory{privatestaticJedisPooljedisPool;static{// 配置连接池参数JedisPoolConfigpoolConfignewJedisPoolConfig();poolConfig.setMaxTotal(8);// 最大总连接数poolConfig.setMaxIdle(8);// 最大空闲连接数poolConfig.setMinIdle(0);// 最小空闲连接数poolConfig.setMaxWaitMillis(1000);// 获取连接最大等待毫秒数// 初始化连接池jedisPoolnewJedisPool(poolConfig,192.168.100.129,6379,1000,1234);}// 从连接池获取Jedis连接publicstaticJedisgetJedis(){returnjedisPool.getResource();}}二、SpringDataRedis简介SpringDataRedis是Spring家族中用于数据访问的子模块专门封装Redis客户端操作底层支持Lettuce默认基于Netty异步非阻塞与Jedis两种客户端提供统一RedisTemplateAPI简化Redis各类数据类型操作。核心能力统一封装Redis五大常用数据类型操作API原生支持发布订阅、哨兵、Redis集群支持响应式编程、多种序列化方案提供集合封装可直接用Java集合方式操作Redis1. 快速入门1导入依赖!-- SpringBoot Redis Starter --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- 连接池依赖 --dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency2application.yml 配置文件spring:data:redis:host:192.168.100.129port:6379password:1234lettuce:pool:max-active:8max-idle:8min-idle:0max-wait:1003注入模板并测试AutowiredprivateRedisTemplateredisTemplate;TestvoidtestString(){//写入数据redisTemplate.opsForValue().set(name,小王);//获取数据ObjectnameredisTemplate.opsForValue().get(name);System.out.println(name);}RedisTemplate 分类API对照表API返回值类型说明redisTemplate.opsForValue()ValueOperations操作String字符串类型redisTemplate.opsForHash()HashOperations操作Hash哈希类型redisTemplate.opsForList()ListOperations操作List列表类型redisTemplate.opsForSet()SetOperations操作Set无序集合类型redisTemplate.opsForZSet()ZSetOperations操作SortedSet有序集合redisTemplate 本身RedisTemplate通用Redis全局命令删除key、设置过期时间、查询key等三、SpringDataRedis 序列化机制详解1. 默认序列化规则与问题RedisTemplate默认使用JDK原生序列化存入Redis时会把Java对象序列化为二进制字节数组读取时再反序列化转回对象。两大缺点可读性极差Redis客户端查看key/value会显示乱码二进制串对应你截图里的\xac\xed前缀乱码无法直观查看存储内容内存冗余大JDK序列化会附带类路径、版本号等额外元信息占用更多Redis存储空间。2. 两种主流优化序列化方案方案一自定义RedisTemplate全局JSON序列化替换默认JDK序列化器Key/HashKey使用字符串序列化Value/HashValue使用Jackson JSON序列化存入Redis为标准JSON格式兼顾可读性与便捷性。ConfigurationpublicclassRedisConfig{BeanpublicRedisTemplateString,ObjectredisTemplate(RedisConnectionFactoryfactory){//创建RedisTemplate对象RedisTemplateString,ObjecttemplatenewRedisTemplate();//设置连接工厂template.setConnectionFactory(factory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializerjsonRedisSerializernewGenericJackson2JsonRedisSerializer();//设置key、hashKey 序列化方式为字符串template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());//设置value、hashValue 序列化方式为JSONtemplate.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);template.afterPropertiesSet();returntemplate;}}优点直接存入Java对象框架自动序列化/反序列化业务代码极简缺点JSON中会额外携带class字段记录实体类全限定名依旧存在少量内存浪费。方案二使用原生 StringRedisTemplate推荐SpringBoot内置StringRedisTemplate所有key、value强制只能存储String字符串无任何默认序列化乱码问题。需要存储Java对象时手动借助ObjectMapper完成 对象 ↔ JSON字符串 互转。示例代码// Jackson提供负责Java对象与JSON字符串双向转换privatestaticfinalObjectMapperobjectMappernewObjectMapper();TestvoidtestUser(){//创建实体对象UserusernewUser(虎哥,21);//手动序列化Java对象 → JSON字符串StringjsonobjectMapper.writeValueAsString(user);//写入RedisstringRedisTemplate.opsForValue().set(user:200,json);//读取Redis字符串StringjsonUserstringRedisTemplate.opsForValue().get(user:200);//手动反序列化JSON字符串 → Java对象Useruser1objectMapper.readValue(jsonUser,User.class);System.out.println(user1);}优点Redis存储纯JSON文本无多余字段内存占用最小、无乱码、排查数据极其方便缺点存取对象需要手动序列化与反序列化少量增加代码量。补充说明ObjectMapper属于Jackson框架核心工具类SpringBoot web依赖已自动引入无需额外导包