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