当前位置:   article > 正文

一文学会redis在springBoot中的使用_springboot连接redis时需要打开redis吗

springboot连接redis时需要打开redis吗

“收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!

 

 

一、什么是redis缓存

Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

二、redis缓存的优缺点

优点:

  1. 高性能:Redis内存管理非常高效,速度非常快,并且可以利用多核。在访问速度要求高的场景下,使用Redis缓存可以显著提高系统性能,减轻后端系统的压力。
  2. 支持广泛:Redis支持多种数据类型和数据结构,如列表、哈希表、集合、有序集合等,可以应对多样化的缓存需求。
  3. 高可靠性:Redis支持数据持久化和冗余备份,可以确保数据的可靠性和高可用性。
  4. 可扩展性:Redis支持集群模式,可以方便地扩展缓存容量和负载均衡,满足不同规模和需求的系统。
  5. 简单易用:Redis的API简单易用,文档和社区资源丰富,让开发者能够快速上手和掌握。

一句话:

加快了响应速度,减少了对数据库的读操作,数据库的压力降低。

缺点:

  1. 需要占用内存:Redis缓存的数据都存储在内存中,需要占用一定的内存资源。如果缓存数据过多,会导致内存不足,影响系统性能。
  2. 数据持久化的损耗:Redis支持数据持久化,但是在某些情况下,数据持久化会对性能产生一定的损耗,如在高并发的情况下进行RDB持久化操作,会阻塞Redis服务器的IO操作,影响系统性能。
  3. 可靠性问题:Redis的主从架构和高可用性机制可以保证系统可靠性,但在节点故障和网络异常等情况下,仍有一定的风险。
  4. 一致性问题:Redis的缓存是强一致性的,在某些场景下,可能不适合使用。如分布式锁、分布式事务等,需要保证系统的弱一致性。
  5. 安全性问题:Redis的安全性需要开发者进行配置和加固,如果未正确配置,可能会面临信息泄露等安全风险。

一句话:

  • 数据存储在内存,主机断电则数据丢失
  • 存储容量受到物理内存的限制,只能用于小数据量的高性能操作
  • 在线扩容比较困难,系统上线时必须确保有足够的空间
  • 用于缓存时,易出现’缓存雪崩‘,’缓存击穿‘等问题

三、为什么使用redis缓存

  1. Redis 可以用几十 G 内存来做缓存,速度快
  2. Redis 缓存可以持久化,便于数据备份、恢复;
  3. Redis支持简单的事务,操作满足原子性
  4. Redis 可以实现分布式的缓存;
  5. Redis 可以处理每秒百万级的并发,是专业的缓存服务;
  6. Redis 缓存有过期机制;
  7. Redis 有丰富的 API,容易上手;
  8. 支持哨兵机制,实现自动故障转移;

使用redis作为缓存可以减少数据库的压力,特别是需要频繁查询大量数据的情形下。使用redis还可以提高访问速度,因为redis的数据会被保存在内存中。

四、redis支持的数据类型

字符串(string)
哈希表(hash)
列表(list)
集合(set)
有序集合(zset)
为了保证读取效率,Redis 把数据对象存储在内存中,并支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。

redis的特性决定了它的功能,它可以用来做以下这些事情!

排行榜,利用zset可以方便的实现排序功能
计数器,利用redis中原子性的自增操作,可以统计到阅读量,点赞量等功能
简单消息队列,list存储结构,满足先进先出的原则,可以使用lpush/rpop或rpush/lpop实现简单消息队列
session共享,分布式系统中,可以利用redis实现session共享。spring官方提供的分布式解决方案Spring Session就是利用redis 实现的。

五、springboot整合redis

1、引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

2、springboot启动类增加注解@EnableCaching,开启缓存功能,如下:

  1. /**
  2. *服务启动类
  3. */
  4. @SpringBootApplication(scanBasePackages = {"cn.xxx.common.redis","cn.xxx.task.*"})
  5. @EnableEurekaClient
  6. @EnableApolloConfig
  7. @EnableFeignClients
  8. @EnableDiscoveryClient
  9. @EnableTransactionManagement
  10. @MapperScan("cn.xxx.task.dao")
  11. @EnableScheduling
  12. @Transactional
  13. @EnableCaching
  14. public class TaskApplication {
  15. public static void main(String[] args) {
  16. SpringApplication.run(TaskApplication.class,args);
  17. }
  18. /**
  19. * 替换原生Decoder解析器,支持text/plain
  20. * @return
  21. */
  22. @Bean
  23. public Decoder feignDecoder(){
  24. WxMessageConverter wxConverter = new WxMessageConverter();
  25. ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(wxConverter);
  26. return new SpringDecoder(objectFactory);
  27. }
  28. }


 3、配置redis连接信息

  1. spring:
  2. redis:
  3. # redis库
  4. database: 0
  5. # redis 服务器地址
  6. host: localhost
  7. # redis 端口号
  8. port: 6379
  9. # redis 密码
  10. password:
  11. # 连接超时时间(毫秒)
  12. timeout: 1000
  13. lettuce:
  14. pool:
  15. # 连接池最大链接数(负数表示没有限制)
  16. max-active: 8
  17. # 连接池最大阻塞等待时间(负数表示没有限制)
  18. max-wait: -1
  19. # 连接池最大空闲连接数
  20. max-idle: 8
  21. # 连接池最小空闲连接数
  22. min-idle: 0

六、使用注解的方式使用redis缓存(重点内容)

1. 注解说明
@CacheConfig: 一般配置在类上,指定缓存名称,这个名称是和上面“置缓存管理器”中缓存名称的一致。
@Cacheable: 用于对方法返回结果进行缓存,如果已经存在该缓存,则直接从缓存中获取,缓存的key可以从入参中指定,缓存的 value 为方法返回值。
@CachePut: 无论是否存在该缓存,每次都会重新添加缓存,缓存的key可以从入参中指定,缓存的value为方法返回值,常用作于更新。
@CacheEvict: 用于清除缓存
@Caching: 用于一次性设置多个缓存。
2. 常用注解配置参数
value: 缓存管理器中配置的缓存的名称,这里可以理解为一个组的概念,缓存管理器中可以有多套缓存配置,每套都有一个名称,类似于组名,这个可以配置这个值,选择使用哪个缓存的名称,配置后就会应用那个缓存名称对应的配置。
key: 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。
condition: 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。
unless: 不缓存的条件,和 condition 一样,也是 SpEL 编写,返回 true 或者 false,为 true 时则不进行缓存。
3. 自动缓存
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。

如果添加了@Cacheable注解,那么方法被调用后,值会被存入redis,下次再调用的时候会直接从redis中取值返回。
 

  1. @Service
  2. @CacheConfig(cacheNames = "user")
  3. public class UserService {
  4. @Autowired
  5. private UserMapper userMapper;
  6. // 获取全部用户
  7. @Cacheable(key = "'allUsers'", unless = "#result==null")
  8. public List<Courses> findAll() {
  9. return userMapper.allUsers();
  10. }
  11. }

  1. /**
  2. * 登录用户信息缓存(部分,脱敏处理)
  3. * @param mUser
  4. * @return
  5. */
  6. @CachePut(value = "member", key = "'userinfo:' + #mUser.userId")
  7. public Map<String, Object> loginUserInfo(MUser mUser) {
  8. // 手机号加*处理
  9. String starPhone = PhoneUtil.star(mUser.getPhone());
  10. Map<String, Object> resMap = new HashMap<>();
  11. resMap.put("purePhoneNumber", starPhone);
  12. resMap.put("nickName", mUser.getUserName());
  13. resMap.put("avatarUrl", mUser.getHeadIcon());
  14. resMap.put("countryCode", mUser.getCountryCode());
  15. // resMap.put("resToken", resToken);
  16. resMap.put("wxAccount", mUser.getWxAccount());
  17. resMap.put("sex", mUser.getSex());
  18. resMap.put("sexName", mUser.getSexName());
  19. resMap.put("userState", mUser.getUserState());
  20. resMap.put("userStateName", mUser.getUserStateName());
  21. resMap.put("channelId", mUser.getChannelId());
  22. resMap.put("channelName", mUser.getChannelName());
  23. return resMap;
  24. }
  25. /**
  26. * 内部员工缓存信息
  27. * @param phone
  28. * @param status
  29. * @param b
  30. * @param messge
  31. * @return
  32. */
  33. @CachePut(value = "member#PT5M", key = "'employee:' + #phone")
  34. public Map<String, Object> employee(String phone,String status , boolean b ,String messge ) {
  35. Map<String, Object> resMap = new HashMap<>();
  36. resMap.put("phone", phone);
  37. resMap.put("status", status);
  38. resMap.put("flag", b);
  39. resMap.put("messge",messge);
  40. return resMap;
  41. }
  42. /**
  43. * 是否是内部员工缓存
  44. * @param phone
  45. * @return
  46. */
  47. @Cacheable(value = "member", key = "'employee:' + #phone")
  48. public Map<String, Object> getEmployee(String phone) {
  49. return null;
  50. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/892840
推荐阅读
相关标签
  

闽ICP备14008679号