Docker 装置 Redis(如果已装置请跳过这一步)
1、拉取 Redis 镜像(默认最新版本)
docker pull redis
如果下载比较慢的话倡议配置阿里云镜像
查看阿里云镜像:阿里云官网 –> 产品 –> 搜寻容器镜像服务 –> 治理控制台
左侧边栏下方的镜像加速器:
点进去能够看到下方有一个减速地址和应用办法:
把大括号及大括号里的内容复制进 /etc/docker/daemon.json 文件中:
vim /etc/docker/daemon.json
从新加载 daemon 文件和 docker 即增加镜像胜利
systemctl daemon-reload
systemctl restart docker
–
2、装置完 redis 镜像后查看是否装置胜利
==========================
docker images
–
3、运行 redis
docker run -d -p 6379:6379 --name myredis redis
4、查看是否运行胜利
===============
docker ps
疾速应用 Redis
1、导入 Redis 的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、增加配置文件
# Redis 数据库索引(默认为 0)spring.redis.database=0
# Redis 服务器地址(默认为 localhost)spring.redis.host=localhost
# Redis 服务器连贯端口(默认为 6379)spring.redis.port=6379
# Redis 服务器连贯明码(默认为空)spring.redis.password=
# 连接池最大连接数(应用负值示意没有限度)默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(应用负值示意没有限度)默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大闲暇连贯 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小闲暇连贯 默认 0
spring.redis.lettuce.pool.min-idle=0
3、增加 Redis 配置类
自定义一个 RedisCacheManager
@Configuration
public class MyRedisConfig {
@Bean
public RedisCacheManager defaultRedisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(6)) // 设置缓存过期工夫为 6 小时
.disableCachingNullValues() // 禁用缓存空值,不缓存 null 校验
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
GenericJackson2JsonRedisSerializer())); // 设置 CacheManager 的值序列化形式为 json 序列化
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build(); // 设置默认的 cache 组件}
}
4、开启基于注解的缓存:@EnableCaching
@EnableCaching
@SpringBootApplication
public class BlogApplication {public static void main(String[] args) {SpringApplication.run(BlogApplication.class, args);
}
}
5、应用 @Cacheable 注解进行缓存
@Cacheable 次要针对办法配置,可能依据办法的申请参数对其后果进行缓存
@Service
public class BlogServiceImpl implements BlogService {
@Autowired
private BlogMapper blogMapper;
@Cacheable(cacheNames = "totalBlog")
@Override
public Long getTotalBlogs() {return blogMapper.getTotalBlogs();
}
}
Linuxc/c++ 服务器开发高阶视频学习材料 +qun720209036 获取
内容包含 C /C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,K8S,Docker,TCP/IP,,Linux 内核,协程,DPDK 多个高级知识点。
视频链接:C/C++Linux 服务器开发 / 后盾开发 - 学习视频
原理:
- 办法运行之前,先去查问 Cache(缓存组件),依照 cacheNames 指定的名字获取
- 没有查到缓存就调用指标办法,并将指标办法的返回的后果放进缓存中
- 查到了缓存就间接应用缓存,就不会再去数据库查问数据
执行完以上步骤即应用实现。
踩过的坑:反序列化获取数据产生类型转换异样
往 Redis 中存储 Long 类型的数据时,反序列化时产生 Integer 转 Long 类型转换异样;
我明明存的是 Long 类型的数据啊,怎么存进去就变成 Integer 类型了呢?
这要从自定义 CacheManager 说起 ……
@Configuration
public class MyRedisConfig {
@Bean
public RedisCacheManager defaultRedisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(6)) // 设置缓存过期工夫为 6 小时
.disableCachingNullValues() // 禁用缓存空值,不缓存 null 校验
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
GenericJackson2JsonRedisSerializer())); // 设置 CacheManager 的值序列化形式为 json 序列化
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build(); // 设置默认的 cache 组件}
}
咱们自定义 CacheManager 的时候,应用的是 GenericJackson2JsonRedisSerializer 序列化器,而 GenericJackson2JsonRedisSerializer 在反序列化的时候会对立将缓存反序列化为 Object 类型,又因为咱们存的值是小于 Integer.MAX_VALUE 的,自然而然的就转为了 Integer。
而咱们要解决这种状况的话,只有在存数据的时候就指定数据类型,能够应用 Jackson2JsonRedisSerializer:
@Bean
public RedisCacheManager longRedisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(6)) // 设置缓存过期工夫为 6 小时
.disableCachingNullValues() // 禁用缓存空值,不缓存 null 校验
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
Jackson2JsonRedisSerializer<Long>(Long.class))); // 设置 CacheManager 的值序列化形式为 json 序列化,指定咱们所存的数据为 Long 类型,取出时天然会帮咱们反序列化成 Long 类型
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build(); // 设置默认的 cache 组件}
当存在两个或两个以上的 RedisCacheManager 的时候,咱们必须在某个 RedisCacheManager 上标注 @Primary 注解,来示意这个 RedisCacheManager 是次要的;当然在应用缓存注解来进行缓存的时候,如果须要应用指定的 RedisCacheManager,就能够应用 cacheManager 属性进行指定,如果没有指定,就默认应用标注了 @Primary 注解的 RedisCacheManager
@Cacheable(cacheNames = "totalBlog",cacheManager = "longRedisCacheManager")
@Override
public Long getTotalBlogs() {return blogMapper.getTotalBlogs();
}