目录
对比 StringRedisTemplate 和 RedisTemplate
概述
Redis : 一个NoSQL数据库, 常用作 缓存使用 (cache)。
Redis的数据类型: string , hash ,set ,zset , list。
Redis是一个中间件: 是一个独立的服务器。
java中著名的客户端: Jedis , lettuce , Redisson。
Spring,SpringBoot中有 一个RedisTemplate(StringRedisTemplate) ,处理和redis交互。
配置Windows版本的redis
说明:如果在实际开发中使用redis的话要在Linux服务器上使用,我之前的文章也介绍过如何在Linux操作系统下安装redis。这里是为了偷懒(Linux虚拟机删掉了)就搞了一个windows版本的redis。
创建工程
RedisTemplate 使用的 lettuce 客户端库
<!--redis起步依赖: 直接在项目中使用RedisTemplate(StringRedisTemplate)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
data-redis使用的 lettuce 客户端库在程序中使用RedisTemplate类的方法 操作redis数据, 实际就是调用的lettuce 客户端的中的方法
配置redis信息
Redis操作(RedisTemplate)
RedisTemplate里的方法
添加数据到redis
创建一个Controller来进行操作
package com.redistest.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author summer
* @date 2022-05-05 9:31
*/
@RestController
public class RedisController {
/**
* 注入redistemplate,名字最好跟我保持一致,因为框架
* 会创建一个跟这个名字一样的对象,这样根据名字来找比较好
*/
@Autowired
private RedisTemplate redisTemplate;
/**
* 添加数据到redis,这里添加的是String
* */
@PostMapping("/addData")
public String addData() {
//添加String类型的数据先获取ValueOperations对象
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("name","lisi哈");
return "add Success";
}
}
从redis获取数据
在Controller中添加方法
测试
使用postman工具
查看客户端有乱码
Redis操作(StringRedisTemplate)
我们使用StringRedisTemplate看是否会有乱码呢?
客户端查看不乱码
对比 StringRedisTemplate 和 RedisTemplate
StringRedisTemplate : 把k,v 都是作为String处理, 使用的是String的序列化 , 可读性好
RedisTemplate : 把k,v 经过了序列化存到redis。 k,v 是序列化的内容, 不能直接识别.
默认使用的jdk序列化, 可以修改为前提的序列化
设置RedisTemplate序列化就不会乱码了
package com.redistest.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}