本博客仅为个人笔记,无指导和教学作用。
参考博客: https://segmentfault.com/a/1190000039341264
-
什么是redis?
一种内存性非关系数据库,存储使用键值对的方式,查询速度极快。带有5种专属数据类型和操作命令。
五种数据类型为:
STRING:字符串或浮点型
LIST:链表,每个节点包含了一个字符串
SET:无序集合
HASH:无序散列表
ZSET:字符串成员与浮点数分值之间的有序映射
关于每种数据类型的基本操作,查看redis实战里面有详细介绍。 -
在SpringBoot中配置redis
总结步骤为:配置->初始化factory->创建redistemplate实例->连接factory
1)采用docker来启动redis。
运行: docker run -itd --name redis -p 6379:6379 redis,输入docker exec -it redis redis-cli进入容器查看redis是否运行成功。
如果输出127.0.0.1:6379就表明成功
2)在工程项目中添加依赖:
implementation’org.springframework.boot:spring-boot-starter-data-redis’
implementation’org.apache.commons:commons-pool2’
(groupId):(artifactId)
3)自定义配置参数
· spring:
redis:
host: 127.0.0.1
port: 6379
password:
lettuce:
pool:
#最大连接数
max-active: 32
#连接超时(ms)
max-wait: 300
#最大空闲数
max-idle: 16
#最小空闲数
min-idle: 8
4)编写配置类
· 首先在启动类上面添加@EnableSpringCaching注解
·
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
@Configuration
public class RedisConfig {
@Bean
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
//猜测:仍然是配键值对
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
redisCacheConfiguration.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
Map<String, RedisCacheConfiguration> redisExpireConfig = new HashMap<>();
//设置超时配置 - 一分钟
redisExpireConfig.put("1min", RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.entryTtl(Duration.ofMinutes(1)).disableCachingNullValues());
RedisCacheManager redisCacheManager = RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration)
.withInitialCacheConfigurations(redisExpireConfig)
.transactionAware()
.build();
return redisCacheManager;
}
}
代码见demo,可以设置甚于生存时间,当时间到达后就会清除掉这个缓存。
5)在接口上用@Cacheable开启缓存
@RestController
@RequestMapping(value = "/user")
public class UserController {
//Cacheable是开启缓存,接口返回的数据将会被缓存,value是缓存的名称,key是缓存的键值;除此之外,可以用@Cacheable(value = {"1min"}, key = "uid")指定多个名称
@GetMapping(value = "/info")
@Cacheable(value = "user", key = "#uid")
public User getUser(@RequestParam(value = "uid") String uid) {
System.out.println("getUser====>" + uid);
User user = new User();
user.setUid(uid);
user.setEmail(uid + "@definesys.com");
user.setName(uid + ":" + System.currentTimeMillis());
return user;
}
}
可以在请求该接口,会返回对应常见的对象:
➜ redisDemo git:(tmp) ✗ curl http://localhost:8080/user/info\?uid\=malco
{"name":"malco:1637505726083","uid":"malco","email":"malco@definesys.com"}%
进入容器内部看看:
>docker exec -it redis redis-cli
>127.0.0.1:6379> ttl user::malco
(integer) -1
返回-1说明user::malco这个key-value对象永远不超时,可以设置ttl让它生存时间只有1分钟,时间到了之后就会清除这个缓存。