文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Redis的知识总结与项目应用

极客之心

极客之心

2024-12-24 13:37

关注


# ????Redis简单介绍


Redis是一个C语言编写的key-value存储系统,同时是一个非常快速的开源非关系型数据库,它存储了五种不同类型值的键映射,包括**string(字符串)**、**list(链表)**、**set(集合)**、**zset(sorted set --有序集合)**和**hash(哈希类型)**。

这些数据类型**都支持push/pop**、**add/remove及取交集并集和差集及更丰富的操作**,而且这些操作都是**原子性**的。在此基础上,redis支持各种不同方式的排序。

为了保证效率,**数据都是缓存在内存中**。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

redis是非关系型数据库(NoSQl)


# ????项目中使用Redis

1.导入Redis依赖

```xml

<!-- redis -->

<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<!-- spring2.X集成redis所需common-pool2-->

<dependency>

   <groupId>org.apache.commons</groupId>

   <artifactId>commons-pool2</artifactId>

   <version>2.6.0</version>

</dependency>

```

2.在项目中添加Redis配置类


```java

@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;

   }

}

```


3.在接口中添加缓存


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


> 作用:

>  **降低后端负载**

>  **提高读写效率,降低响应时间**



解释:当用户第一次查询数据库中的数据时,会访问数据库,因为这个时候没有缓存,当访问数据库后,读取的数据就存在了缓存中,下次用户再查询数据时从缓存中查询即可。**从缓存中查询数据是比访问数据库的速度快的多的**。同时当改变数据库中的数据后,也可同步改变缓存中相应的数据。

并且当很多用户同时访问数据库时,数据库很可能崩溃,因此我们可以把数据库中的数据移到缓存中,这样一部分用户在访问数据库时,可以直接从缓存中获取数据。


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



# ????Spring Boot中的缓存注解


1.缓存@Cacheable

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



2.缓存@CachePut

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


3.缓存@CacheEvict

使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上。




# ????Redis相关配置

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

```xml

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

```



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


```java

@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);

   }

}

```



# ????Redis进阶知识点

Redis进阶知识点是面试中经常问到的地方,博主在面试了很多家公司之后,发现这块比较常考,由于之前写过此类的文章,在此不做过多赘述了,此处放上博文链接Redis缓存相关的知识点:[Redis缓存详解](https://blog.csdn.net/qq_53847859/article/details/124508747?spm=1001.2014.3001.5501),这里是Redis集群中常被问到的知识点:[Redis集群面试详解](https://blog.csdn.net/qq_53847859/article/details/124536891?spm=1001.2014.3001.5502)。


![在这里插入图片描述](https://img-blog.csdnimg.cn/9bf9b34eed904c8d96da425b5095e30c.gif#pic_center)

> 文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论????

> 希望能和诸佬们一起努力,今后进入到心仪的公司

>  再次感谢各位小伙伴儿们的支持????


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯