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=# 连接池最大连接数(应用负值示意没有限度) 默认 8spring.redis.lettuce.pool.max-active=8# 连接池最大阻塞等待时间(应用负值示意没有限度) 默认 -1spring.redis.lettuce.pool.max-wait=-1# 连接池中的最大闲暇连贯 默认 8spring.redis.lettuce.pool.max-idle=8# 连接池中的最小闲暇连贯 默认 0spring.redis.lettuce.pool.min-idle=0

3、增加Redis配置类

自定义一个RedisCacheManager
@Configurationpublic 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@SpringBootApplicationpublic class BlogApplication {   public static void main(String[] args) {      SpringApplication.run(BlogApplication.class, args);   }}

5、应用@Cacheable注解进行缓存

@Cacheable次要针对办法配置,可能依据办法的申请参数对其后果进行缓存

@Servicepublic 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服务器开发/后盾开发-学习视频

原理:

  1. 办法运行之前,先去查问Cache(缓存组件),依照cacheNames指定的名字获取
  2. 没有查到缓存就调用指标办法,并将指标办法的返回的后果放进缓存中
  3. 查到了缓存就间接应用缓存,就不会再去数据库查问数据

执行完以上步骤即应用实现。

踩过的坑:反序列化获取数据产生类型转换异样

往Redis中存储Long类型的数据时,反序列化时产生Integer转Long类型转换异样;

我明明存的是Long类型的数据啊,怎么存进去就变成Integer类型了呢?

这要从自定义CacheManager说起......

@Configurationpublic 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:

@Beanpublic 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")@Overridepublic Long getTotalBlogs() {    return blogMapper.getTotalBlogs();}