• 猿创征文|Redis的知识总结与项目应用


    前言:
    本文参考了与Redis相关的课程,主要记录了Redis在项目中的应用,以及相关的面试题,非常详细,适合小白和复习的大佬
    如果文章中有什么不准确或者需要改进的地方,还请大佬不吝赐教
    在这里先感谢各位大佬😙😚😙
    在这里插入图片描述

    🏠个人主页:小威要向诸佬学习呀
    🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
    目前状况🎉:24届毕业生,在一家满意的央企公司实习👏👏

    🎁如果大佬在准备面试,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

    以下正文开始

    🍰Redis简单介绍

    Redis是一个C语言编写的key-value存储系统,同时是一个非常快速的开源非关系型数据库,它存储了五种不同类型值的键映射,包括string(字符串)list(链表)set(集合)zset(sorted set --有序集合)hash(哈希类型)
    这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
    为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
    redis是非关系型数据库(NoSQl)
    在这里插入图片描述

    🍖项目中使用Redis

    1.导入Redis依赖

    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    
    <dependency>
        <groupId>org.apache.commonsgroupId>
        <artifactId>commons-pool2artifactId>
        <version>2.6.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.在项目中添加Redis配置

    @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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    3.在接口中添加缓存

    缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存(数据库)中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行

    作用:
    降低后端负载
    提高读写效率,降低响应时间

    解释:当用户第一次查询数据库中的数据时,会访问数据库,因为这个时候没有缓存,当访问数据库后,读取的数据就存在了缓存中,下次用户再查询数据时从缓存中查询即可。从缓存中查询数据是比访问数据库的速度快的多的。同时当改变数据库中的数据后,也可同步改变缓存中相应的数据。
    并且当很多用户同时访问数据库时,数据库很可能崩溃,因此我们可以把数据库中的数据移到缓存中,这样一部分用户在访问数据库时,可以直接从缓存中获取数据。

    我们可以将更新不频繁的数据放到Redis缓存中,首页访问量相对较大,所以我们可以把首页接口数据缓存到redis缓存中,减少数据库压力和提高访问速度。
    在这里插入图片描述

    🍧Spring Boot中的缓存注解

    1.缓存@Cacheable
    根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

    2.缓存@CachePut
    使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。

    3.缓存@CacheEvict
    使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上。
    在这里插入图片描述

    🍷Redis相关配置

    首先修改Redis在Ymal中的配置:

    spring.redis.host=自己的IP地址
    spring.redis.port=6379
    spring.redis.database= 0
    spring.redis.timeout=1800000
    spring.redis.lettuce.pool.max-active=20
    spring.redis.lettuce.pool.max-wait=-1
    #最大阻塞等待时间(负数表示没限制)
    spring.redis.lettuce.pool.max-idle=5
    spring.redis.lettuce.pool.min-idle=0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    接着修改接口实现类,添加Redis的注解:

    @Service
    public class CrmBannerServiceImpl extends ServiceImpl<CrmBannerMapper, CrmBanner> implements CrmBannerService {
        @Cacheable(value = "banner", key = "'selectIndexList'")
        @Override
        public List<CrmBanner> selectIndexList() {
            List<CrmBanner> list = baseMapper.selectList(new QueryWrapper<CrmBanner>().orderByDesc("sort"));
            return list;
        }
        @Override
        public void pageBanner(Page<CrmBanner> pageParam, Object o) {
            baseMapper.selectPage(pageParam,null);
        }
        @Override
        public CrmBanner getBannerById(String id) {
            return baseMapper.selectById(id);
        }
        @CacheEvict(value = "banner", allEntries=true)
        @Override
        public void saveBanner(CrmBanner banner) {
            baseMapper.insert(banner);
        }
        @CacheEvict(value = "banner", allEntries=true)
        @Override
        public void updateBannerById(CrmBanner banner) {
            baseMapper.updateById(banner);
        }
        @CacheEvict(value = "banner", allEntries=true)
        @Override
        public void removeBannerById(String id) {
            baseMapper.deleteById(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    🥫Redis进阶知识点

    Redis进阶知识点是面试中经常问到的地方,博主在面试了很多家公司之后,发现这块比较常考,由于之前写过此类的文章,在此不做过多赘述了,此处放上博文链接Redis缓存相关的知识点:Redis缓存详解,这里是Redis集群中常被问到的知识点:Redis集群面试详解

    在这里插入图片描述

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
    希望能和诸佬们一起努力,今后进入到心仪的公司
    再次感谢各位小伙伴儿们的支持🤞

    在这里插入图片描述

  • 相关阅读:
    MaTiJi - MT3143 - 试管装液
    Android中的适配器,你知道是做什么的吗?
    Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因
    谷歌沉浸式内容负责人:更看好开放的Web AR技术
    WebDAV之葫芦儿·派盘+读出通知
    ROS源码安装应用,VSCode
    使用prometheus监控java服务
    驱动开发:内核特征码搜索函数封装
    ​【原创】基于SSM的学院排课管理系统(排课管理系统毕业设计源代码)
    第二十二章 源代码文件 REST API 参考(四)
  • 原文地址:https://blog.csdn.net/qq_53847859/article/details/126775942