2.源码分析
@AutoConfiguration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) public class RedisAutoConfiguration { @Bean //默认的redisTemplate 没有过多的设置,redis对象都是需要序列化。 @ConditionalOnMissingBean(name = "redisTemplate") //我们可以自定义一个redisTemlate来替换这个默认的。 @ConditionalOnSingleCandidate(RedisConnectionFactory.class) // 两个泛型都是Object 的类型,我们后面使用的话需要强制转化 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean @ConditionalOnSingleCandidate(RedisConnectionFactory.class) public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { return new StringRedisTemplate(redisConnectionFactory); } }
可以配置的参数
@ConfigurationProperties(prefix = "spring.redis") public class RedisProperties { /** * Database index used by the connection factory. */ private int database = 0; /** * Connection URL. Overrides host, port, and password. User is ignored. Example: * redis://user:password@example.com:6379 */ private String url; /** * Redis server host. */ private String host = "localhost"; /** * Login username of the redis server. */ private String username; /** * Login password of the redis server. */ private String password; /** * Redis server port. */ private int port = 6379; /** * Whether to enable SSL support. */ private boolean ssl; /** * Read timeout. */ private Duration timeout; /** * Connection timeout. */ private Duration connectTimeout; /** * Client name to be set on connections with CLIENT SETNAME. */ private String clientName; /** * Type of client to use. By default, auto-detected according to the classpath. */ private ClientType clientType; private Sentinel sentinel; private Cluster cluster;
3.导入配置链接
application.properties
# 链接远程主机 spring.redis.host=IP #端口 spring.redis.port=6379 #密码 spring.redis.password=*****
4.测试
package com.jsxs; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisTemplate; import javax.annotation.Resource; @SpringBootTest class Redis02SpringBootApplicationTests { @Resource RedisTemplate redisTemplate; @Test void contextLoads() { // redisTemplate-》操作不同的类型 // 操作字符串opsForValue() // 操作List opsForList() // 操作SET opsForSet() // 操作Hash opsForHash() // 操作地图 opsForGeo() // 除了基本的操作,我们常用的方法都可以直接redisTemplate来调用,比如事务和基本的增删改查。 // RedisConnection connection = redisTemplate.getConnectionFactory().getConnection(); 获取链接对象 redisTemplate.opsForValue().set("myKey","jsxs"); System.out.println(redisTemplate.opsForValue().get("myKey")); } }
5.设置中文乱码问题展现💥
如果设置中文的话,在控制无误,但是会在redis-cli出错
以下是序列化配置
(九)、自定义RedisTemplate
1.对象通过json传入
在企业开发中,对象都是先转换为json字符串再进行传递
@Test void test() throws JsonProcessingException { // 真实开发一般都是使用json来传递对象 User user = new User("吉士先生", 22); // 将一个对象转换为json字符串的 String jsonUser = new ObjectMapper().writeValueAsString(user); redisTemplate.opsForValue().set("user", jsonUser); System.out.println(redisTemplate.opsForValue().get("user")); }
2.直接传递一个对象
假如我们直接传一个对象就会报错: 没有序列化
进行序列化之后。
在企业中,我们所有的pojo都会序列化
package com.jsxs.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; import java.io.Serializable; @Component @Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private String name; private int age; }
3.解决中文乱码问题 💥
我们在config中添加这个配置
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import java.net.UnknownHostException; @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { // 将template 泛型设置为 <String, Object> RedisTemplate<String, Object> template = new RedisTemplate(); // 连接工厂,不必修改 template.setConnectionFactory(redisConnectionFactory); /* * 序列化设置 */ // key、hash的key 采用 String序列化方式 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); // value、hash的value 采用 Jackson 序列化方式 template.setValueSerializer(RedisSerializer.json()); template.setHashValueSerializer(RedisSerializer.json()); template.afterPropertiesSet(); return template; } }
测试类一定要指向redisTemplate
package com.jsxs; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.jsxs.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import javax.annotation.Resource; @SpringBootTest class Redis02SpringBootApplicationTests { @Resource @Qualifier("redisTemplate") //指向配置类 RedisTemplate redisTemplate; @Test void test() throws JsonProcessingException { // 真实开发一般都是使用json来传递对象 User user = new User("吉士先生", 22); // 将一个对象转换为json字符串的 String jsonUser = new ObjectMapper().writeValueAsString(user); redisTemplate.opsForValue().set("user", user); System.out.println(redisTemplate.opsForValue().get("user")); } }







