- redis我还没有深入学习,对他的印象停留在可以用各种数据格式去存储复杂结构的数据,拿取的时候可以快速取出比从数据库拿数据的速度要快,是适合存储操作数据量大,但是不需要经常变动的数据。从而达到接口减少直接和数据库交互的次数,提高系统性能的一种技术。
- 在springboot框架中引用redisd的pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置文件application.properties
#redis缓存管理
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
#spring.redis.password=
spring.redis.database=0
#spring.redis.pool.max-active=8
#spring.redis.pool.max-idle=8
#spring.redis.pool.max-wait=-1
#spring.redis.pool.min-idle=0
#spring.redis.timeout=0
- 定义redis的key值生成规则和数据存储方式,json,集合,xml等等格式。
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
/*
* 定义缓存数据 key 生成策略的bean 包名+类名+方法名+所有参数
*/
@Bean
public KeyGenerator wiselyKeyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
/*springboot 2.0RedisCacheManager没有解析RedisTemplate报错
* RedisCacheManager取消了1.0版本中的public RedisCacheManager(RedisOperations redisOperations)的这个构造方法,所以我们无法再用RedisTemplate作为参数来自定义CacheManager。
* */
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//初始化一个RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//设置CacheManager的值序列化方式为json序列化
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
.fromSerializer(jsonSerializer);
RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(pair);
//设置默认超过期时间是一天
defaultCacheConfig.entryTtl(Duration.ofSeconds(86400));
//初始化RedisCacheManager
return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}
// 1.项目启动时此方法先被注册成bean被spring管理,如果没有这个bean,则redis可视化工具中的中文内容(key或者value)都会以二进制存储,不易检查。
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
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.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
public class TestController {
@Autowired
private UserInterface userInterface;
@RequestMapping("get/testcache")
public List<UserEntity> findone(String account) {
if(account==null){
account="haha";
}
return userInterface.userlist(account);
}
@RequestMapping("get/adduser")
public UserEntity Adduser() {
UserEntity userEntity=new UserEntity();
userEntity.setId("1234");
userEntity.setAccount("haha");
userInterface.Adduser(userEntity);
return userEntity ;
}
}
public interface UserInterface {
List<UserEntity> userlist(String account);
UserEntity Adduser(UserEntity userEntity);
}
@Service("UserService")
@CacheConfig(cacheNames = "users")
public class UserService implements UserInterface {
@Autowired
private UserRepository userRepository;
//就是这里让我找了两天,引用不对一直没办法缓存数据进到redis
@org.springframework.cache.annotation.Cacheable(key = "'user_list'")
public List<UserEntity> userlist(String account){
System.out.println("这里在读数据库");
return userRepository.userlist(account);
}
@CachePut(key="'userCache'")
public UserEntity Adduser(UserEntity userEntity){
userRepository.save(userEntity);
return userEntity;
}
}
- 访问接口http://localhost:8080/get/testcache和http://localhost:8080/get/adduser。


- redis截图

- 总结:在引用@Cacheable注解的时候,会出现这三个不同包的名字,第二个才是对的。
