在Spring Boot中,我们可以通过配置来自定义一个属于我们自己的RedisTemplate。
在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce,Jedis和Lettuce都是Redis Client,他两的区别是:
jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接 池!更像 BIO 模式
lettuce : 采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据 了,更像 NIO 模式
序列化:
spring-data-redis中序列化类有以下几个:
GenericToStringSerializer:可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer:序列化Object对象为json字符串。与JacksonJsonRedisSerializer相同
JdkSerializationRedisSerializer:序列化java对象
StringRedisSerializer:简单的字符串序列化
packagecom.xing.study.config; importcom.fasterxml.jackson.annotation.JsonAutoDetect; importcom.fasterxml.jackson.annotation.JsonTypeInfo; importcom.fasterxml.jackson.annotation.PropertyAccessor; importcom.fasterxml.jackson.databind.ObjectMapper; importcom.fasterxml.jackson.databind.SerializationFeature; importcom.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; importcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule; importorg.springframework.context.annotation.Bean; importorg.springframework.data.redis.connection.RedisConnectionFactory; importorg.springframework.data.redis.core.RedisTemplate; importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; importorg.springframework.data.redis.serializer.StringRedisSerializer; importjava.net.UnknownHostException; publicclassRedisConfig { publicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryredisConnectionFactory) throwsUnknownHostException { RedisTemplate<String, Object>template=newRedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // Json序列化配置Jackson2JsonRedisSerializer<Object>jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer<>(Object.class); ObjectMapperobjectMapper=newObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 解决jackson2无法反序列化LocalDateTime的问题objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.registerModule(newJavaTimeModule()); // 该方法过时// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);// 上面 enableDefaultTyping 方法过时,使用 activateDefaultTypingobjectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // String 的序列化StringRedisSerializerstringRedisSerializer=newStringRedisSerializer(); // key采用String的序列化方式template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer); // 设置值(value)的序列化采用FastJsonRedisSerializer。// 设置键(key)的序列化采用StringRedisSerializer。template.afterPropertiesSet(); template.afterPropertiesSet(); returntemplate; } }
如果使用lettuce,只要把注入参数改成 LettuceConnectionFactory 即可。
publicRedisTemplate<String, Serializable>redisCacheTemplate(LettuceConnectionFactoryredisConnectionFactory) { RedisTemplate<String, Serializable>template=newRedisTemplate<>(); template.setKeySerializer(newStringRedisSerializer()); template.setValueSerializer(newGenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); returntemplate; }
在官网文档上可以找到应用的配置属性:
spring.application.name=studyserver.port=8889#服务器主机。默认localhostspring.redis.host=${REDIS-HOST:127.0.0.1} #Redis服务器端口。默认6379spring.redis.port=${REDIS-PORT:6379} #redis服务器的登录用户名。#spring.redis.username=#redis服务器的登录密码。spring.redis.password=${REDIS-PASW:Y4WyYKR5} #连接工厂使用的数据库索引。默认0spring.redis.database=${REDIS-DB:1} #连接池在给定时间可以分配的最大连接数(使用负值表示没有限制)默认8spring.redis.jedis.pool.max-active=8#连接池中空闲连接的最大数量。使用负值表示无限数量的空闲连接。默认8spring.redis.jedis.pool.max-idle=8#连接池中的最小空闲连接数。此设置仅在驱逐运行之间的时间和时间均为正时才有效。默认0spring.redis.jedis.pool.min-idle=0#连接池耗尽时,在抛出异常之前连接分配的最大阻塞等待时间。使用负值无限期阻止。默认-1msspring.redis.jedis.pool.max-wait=3000#连接超时时间(毫秒)spring.redis.timeout=30000##连接超时。##spring.redis.connect-timeout=##要在与CLIENTSENATE的连接上设置的客户端名称。#spring.redis.client-name=##要使用的客户端类型。默认情况下,根据类路径自动检测。##spring.redis.client-type=###跨集群执行命令时要遵循的最大重定向数。#spring.redis.cluster.max-redirects=##用于与哨兵进行身份验证的密码。#spring.redis.sentinel.password=##以逗号分隔的“host:port”对列表,用于引导。这表示集群节点的“初始”列表,并且需要至少有一个条目。#spring.redis.cluster.nodes=##空闲对象驱逐线程运行之间的时间。当为正时,空闲对象驱逐线程启动,否则不执行空闲对象驱逐。#spring.redis.jedis.pool.time-between-eviction-runs=##是否应使用使用所有可用刷新触发器的自适应拓扑刷新。默认false#spring.redis.lettuce.cluster.refresh.adaptive=##是否发现并查询所有集群节点以获取集群拓扑。当设置为false时,只有初始种子节点用作拓扑发现的源。默认true##spring.redis.lettuce.cluster.refresh.dynamic-refresh-sources=true##集群拓扑刷新周期。#spring.redis.lettuce.cluster.refresh.period=##池在给定时间可以分配的最大连接数。使用负值表示没有限制。默认8#spring.redis.lettuce.pool.max-active=8##池中“空闲”连接的最大数量。使用负值表示无限数量的空闲连接。默认8#spring.redis.lettuce.pool.max-idle=8##当池耗尽时,在抛出异常之前连接分配应该阻塞的最长时间。使用负值无限期阻止。默认-1ms#spring.redis.lettuce.pool.max-wait=-1ms##池中要维护的最小空闲连接数的目标。此设置仅在驱逐运行之间的时间和时间均为正时才有效。默认0#spring.redis.lettuce.pool.min-idle=0##空闲对象驱逐线程运行之间的时间。当为正时,空闲对象驱逐线程启动,否则不执行空闲对象驱逐。#spring.redis.lettuce.pool.time-between-eviction-runs=##关机超时。默认100ms#spring.redis.lettuce.shutdown-timeout=100ms##Redis服务器的名称。#spring.redis.sentinel.master=##逗号分隔的“主机:端口”对列表。#spring.redis.sentinel.nodes=##是否启用SSL支持。默认#spring.redis.ssl=false##连接网址。覆盖主机、端口和密码。用户被忽略。示例:redis://user: password@example.com :6379#spring.redis.url=
总结:
每个公司或者个人都会自己搞一个RedisTemplate和封装一个RedisUtil。每个版本都会有API被弃用,有啥就上官方文档查吧。
奥里给!!!
END