上海网站建设的意义,浙江省一建建设集团网站首页,杭州信贷网站制作,电商设计软件文章目录 1. SpringDataRedis 概述2. 快速入门2.1 导入pom坐标2.2 配置文件2.3 测试代码2.4 数据序列化器2.5 StringRedisTemplate2.6 总结 1. SpringDataRedis 概述
SpringData 是Spring 中数据操作的模块#xff0c;包含对各种数据库的集成#xff0c;其中对Redis的集成模… 文章目录 1. SpringDataRedis 概述2. 快速入门2.1 导入pom坐标2.2 配置文件2.3 测试代码2.4 数据序列化器2.5 StringRedisTemplate2.6 总结 1. 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封装到了不同的类型中 2. 快速入门
SpringBoot 已经提供了对 SpringDataRedis 的支持使用非常简单
2.1 导入pom坐标
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.7/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.snow/groupIdartifactIdstudyRedis/artifactIdversion1.0/versionpropertiesjava.version1.8/java.versionmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependencies!--redis依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!--common-pool--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.70/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project2.2 配置文件
spring:redis:host: 192.168.98.98port: 6379password: snowlettuce:pool:max-active: 8 #最大连接max-idle: 8 #最大空闲连接min-idle: 0 #最小空闲连接max-wait: 100ms #连接等待时间2.3 测试代码
SpringBootTest
class RedisDemoApplicationTests {Autowiredprivate RedisTemplateString, Object redisTemplate;Testvoid testString() {// 写入一条String数据redisTemplate.opsForValue().set(age, 20);// 获取string数据Object age redisTemplate.opsForValue().get(age );System.out.println(age age );}
}2.4 数据序列化器
RedisTemplate 可以接收任意 Object 作为值写入 Redis。
只不过写入前会把Object序列化为字节形式默认是采用JDK序列化得到的结果是这样的 缺点
可读性差内存占用较大
我们可以自定义 RedisTemplate 的序列化方式代码如下
Configuration
public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory){// 创建 RedisTemplate 对象RedisTemplateString, Object template new RedisTemplate();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建 Fastjson 序列化工具FastJsonRedisSerializerObject jsonRedisSerializer new FastJsonRedisSerializer(Object.class);// 设置 Key 序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置 Value 序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}这里采用了 JSON 序列化来代替默认的 JDK 序列化方式。最终结果如图 整体可读性有了很大提升并且能将Java对象自动的序列化为JSON字符串并且查询时能自动把JSON反序列化为Java对象。
不过其中记录了序列化时对应的 class 名称目的是为了查询时实现自动反序列化。这会带来额外的内存开销。 2.5 StringRedisTemplate
尽管之前 JSON 的序列化方式可以满足我们的需求但依然存在一些问题如图 为了在反序列化时知道对象的类型JSON序列化器会将类的class类型写入json结果中存入Redis会带来额外的内存开销。
为了减少内存的消耗我们可以采用手动序列化的方式换句话说就是不借助默认的序列化器而是我们自己来控制序列化的动作同时我们只采用String的序列化器这样在存储value时我们就不需要在内存中就不用多存储数据从而节约我们的内存空间 这种用法比较普遍因此 SpringDataRedis 就提供了 RedisTemplate 的子类StringRedisTemplate它的key和value的序列化方式默认就是String方式。
省去了我们自定义RedisTemplate的序列化方式的步骤而是直接使用
SpringBootTest
class RedisStringTests {Autowiredprivate StringRedisTemplate stringRedisTemplate;Testvoid testSaveUser() {// 写入一条String数据ValueOperationsString, String opsForValue stringRedisTemplate.opsForValue();Student student new Student(2, swallow, 12);opsForValue.set(swallow, JSON.toJSONString(student));}}此时我们再来看一看存储的数据小伙伴们就会发现那个class数据已经不在了节约了我们的空间(节约了一半呢~~~)~ 当使用了 fastjson 作为序列化方式后也可以使用 redisTemplate Testvoid testString3() {// 写入一条String数据ValueOperations opsForValue redisTemplate.opsForValue();Student student new Student(12, 刘德华, 42);opsForValue.set(liudehua, student);System.out.println(liudehua: opsForValue.get(liudehua));}2.6 总结
RedisTemplate的两种序列化实践方案 方案一 自定义RedisTemplate 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer 会占用额外的内存空间 记录字节码 方案二 使用StringRedisTemplate写入Redis时手动把对象序列化为JSON读取Redis时手动把读取到的JSON反序列化为对象