介紹
RedisTemplate 對象在底層默認會轉成字節,造成了內存的開銷很大,這是他底層進行處理的,造成可讀性差,如需要轉成簡單的字符串存儲需要進行序列化的配置。
RedisTemplate
配置類
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<String,Object> template =new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer =new GenericJackson2JsonRedisSerializer();//序列號工具template.setKeySerializer(RedisSerializer.string());//字符串類型的Key為字符串類型template.setHashKeySerializer(RedisSerializer.string());//哈希類型的key也為字符串類型template.setValueSerializer(genericJackson2JsonRedisSerializer); //值的序列號 JSONtemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);return template;}}
經過配置,值為轉成的鍵值對類型
取值轉為實體對象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String name;private Integer age;
}
讀寫序列化
@RestController
public class BasicController {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@GetMapping("/hello")public User hello( ) {redisTemplate.opsForValue().set("user:login:123", new User("dpc",20));//設置值User user =(User)redisTemplate.opsForValue().get("user:login:123");//取出值return user;}
}
返回結果
{“name”:“dpc”,“age”:20}
Redis存儲結果
通過 “@class”: “com.example.demo.demos.web.User”,這個屬性映射到實體類上,@class是JSON序列化類自動添加的,不可以去除。
當然也可以直接手動的序列化和反序列化節省內存空間。這樣就不會出現改屬性
StringRedisTemplate
Spring默認提供了一個StringRedisTemplate類,它的key和value的序列化方式默認就是String方式。省去了我們自定義RedisTemplate的過程,也就是說上面的的@Configuration配置類可以不用寫了
字符串存取
@Autowiredprivate StringRedisTemplate stringRedisTemplate;
stringRedisTemplate.opsForValue().set("name","dpc");String str =stringRedisTemplate.opsForValue().get("name");
實體類對象串存取
@RestController
public class BasicController {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final ObjectMapper obj=new ObjectMapper();//手動序列化工具@GetMapping("/hello")public User hello( ) throws JsonProcessingException {User user= new User("dpc",20);//實體類對象String json =obj.writeValueAsString(user);//將實體類轉成JSON 也就是字符串stringRedisTemplate.opsForValue().set("user:login:123", json);//設置值 json格式寫入 也就是字符串User userMsg =obj.readValue(stringRedisTemplate.opsForValue().get("user:login:123"),User.class) ;//取出JSON字符串 轉成java對象return userMsg;}}
效果一致
原理是將對象轉成JSON字符串,然后取出時將json字符串轉成實體類就可以了