当前位置:   article > 正文

Springboot学习笔记(缓存介绍及缓存在springboot中的应用)_springboot如何使用缓存

springboot如何使用缓存

目录

缓存

Springboot使用缓存

Springboot中提供的缓存方案:

 模拟案例:

Cache替换步骤

Ehcache例子

Redis例子

Memcache例子


缓存

缓存是一种介于数据永久存储与数据应用之间的数据临时存储介质。

使用缓存可以有效的减少低速数据读取过程的次数,提供系统性能。

缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间 。

Springboot使用缓存

1.导入依赖

2.在springboot启动类中添加注解开启缓存

 

参数value是存储空间的名字(可以随便起),key是唯一值,方便查找,我们通过key查找缓存

Springboot中提供的缓存方案:

 模拟案例:

  1. 1.引入依赖
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-cache</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-test</artifactId>
  14. <scope>test</scope>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.projectlombok</groupId>
  18. <artifactId>lombok</artifactId>
  19. <version>1.18.8</version>
  20. <scope>compile</scope>
  21. </dependency>
  22. </dependencies>
  1. 2.启动cache
  2. @SpringBootApplication
  3. @EnableCaching
  4. public class PracticeApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(PracticeApplication.class, args);
  7. }
  8. }
  9. 3.写实体类
  10. @Data
  11. public class SMSCode {
  12. private String tele;
  13. private String code;
  14. }
  15. 4.写业务层接口
  16. public interface SMSCodeService {
  17. public String sendCodeToSMS(String tele);
  18. public boolean checkCode(SMSCode smsCode);
  19. }
  20. 5.写对应实现类
  21. @Service
  22. public class SMSCodeServiceImpl implements SMSCodeService {
  23. @Autowired
  24. private CodeUtils codeUtils;
  25. @Override
  26. // @Cacheable(value = "smsCode",key = "#tele")//往缓存中放和取
  27. @CachePut(value = "smsCode",key = "#tele")//仅往缓存中放数据
  28. public String sendCodeToSMS(String tele) {
  29. String code = codeUtils.generator(tele);
  30. return code;
  31. }
  32. @Override
  33. public boolean checkCode(SMSCode smsCode) {
  34. //取出内存中的验证码与传过来的验证码比较,看是否一致
  35. String code=smsCode.getCode();
  36. String cacheCode=codeUtils.get(smsCode.getTele());
  37. return code.equals(cacheCode);
  38. }
  39. }
  40. 6.写工具类(生成验证码算法)
  41. @Component
  42. public class CodeUtils {
  43. private String [] patch={"00000","0000","000","00","0",""};
  44. //设计验证码生成算法
  45. public String generator(String tele){
  46. int hash = tele.hashCode();
  47. int encryption=2020666;
  48. long result = hash ^ encryption;
  49. long nowTime=System.currentTimeMillis();
  50. result=result^nowTime;
  51. long code=result%1000000;
  52. code=code<0?-code:code;
  53. String codeStr=code+"";
  54. int length=codeStr.length();
  55. return patch[length-1]+codeStr;
  56. }
  57. //需要被加载成bean,才能运行cache注解,不能在实现类中直接引用
  58. @Cacheable(value = "smsCode",key = "#tele")//往缓存中放和取
  59. public String get(String tele){
  60. return null;
  61. }
  62. // public static void main(String[] args) {
  63. // System.out.println(new CodeUtils().generator("15713001545"));
  64. // }
  65. }
  66. 7.写控制类
  67. @RestController
  68. @RequestMapping("/sms")
  69. public class SMSCodeController {
  70. @Autowired
  71. private SMSCodeService smsCodeService;
  72. @GetMapping
  73. public String getCode(String tele){
  74. String code = smsCodeService.sendCodeToSMS(tele);
  75. return code;
  76. }
  77. @PostMapping
  78. public boolean checkCode(SMSCode smsCode){
  79. return smsCodeService.checkCode(smsCode);
  80. }
  81. }

以上为简单验证码实现步骤。

Cache替换步骤

Ehcache例子

  1. 1.导入依赖
  2. <dependency>
  3. <groupId>net.sf.ehcache</groupId>
  4. <artifactId>ehcache</artifactId>
  5. </dependency>
  6. 2.在核心配置文件中加入以下代码
  7. spring:
  8. cache:
  9. type: ehcache
  10. ehcache:
  11. config: ehcache.xml
  12. 3.导入相应配置文件ehcache.xml
  13. <?xml version="1.0" encoding="UTF-8"?>
  14. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  15. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
  16. <!-- 磁盘缓存位置 -->
  17. <diskStore path="D:\ehcache"/>
  18. <!-- 默认缓存 -->
  19. <!--
  20. name:缓存名称。
  21. maxElementsInMemory:缓存最大个数。
  22. eternal:对象是否永久有效,一但设置了,timeout将不起作用。
  23. timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。
  24. 仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
  25. timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。
  26. 仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
  27. overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
  28. diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
  29. maxElementsOnDisk:硬盘最大缓存个数。
  30. diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
  31. diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
  32. memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。
  33. 默认策略是LRU(最近最少使用)。
  34. 你可以设置为FIFO(先进先出)
  35. 或是LFU(较少使用)。
  36. clearOnFlush:内存数量最大时是否清除。
  37. -->
  38. <defaultCache
  39. maxElementsInMemory="10"
  40. eternal="false"
  41. diskPersistent="false"
  42. timeToIdleSeconds="3600"
  43. timeToLiveSeconds="3600"
  44. overflowToDisk="true"
  45. memoryStoreEvictionPolicy="LRU"/>
  46. <!-- smsCode缓存 -->
  47. <cache name="smsCode"
  48. maxElementsInMemory="10"
  49. eternal="false"
  50. diskPersistent="false"
  51. timeToIdleSeconds="60"
  52. timeToLiveSeconds="60"
  53. overflowToDisk="false"
  54. memoryStoreEvictionPolicy="LRU"/>
  55. </ehcache>

其他的不用动,实现方式都一致。

配置文件中的cache替换策略(操作系统中的缓存知识)

 LRU:最近最久未使用算法                  LFU:最不经常使用页置换算法

Redis例子

  1. 1.引入依赖
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. 2.配置
  7. spring:
  8. cache:
  9. type: redis
  10. redis:
  11. host: localhost
  12. port: 6379
  13. 3.打开redis客户端和服务器端
  14. 4.redis配置解析
  15. #Redis本地服务器地址,注意要开启redis服务,即那个redis-server.exe
  16. spring.redis.host=127.0.0.1
  17. #Redis服务器端口,默认为6379.若有改动按改动后的来
  18. spring.redis.port=6379
  19. #Redis服务器连接密码,默认为空,若有设置按设置的来
  20. spring.redis.password=
  21. #连接池最大连接数,若为负责则表示没有任何限制
  22. spring.redis.jedis.pool.max-active=8
  23. #连接池最大阻塞等待时间,若为负责则表示没有任何限制
  24. spring.redis.jedis.pool.max-wait=-1
  25. #连接池中的最大空闲连接
  26. spring.redis.jedis.pool.max-idle=8
  27. spring:
  28. redis:
  29. # Redis本地服务器地址,注意要开启redis服务,即那个redis-server.exe
  30. host: 127.0.0.1
  31. # Redis服务器端口,默认为6379.若有改动按改动后的来
  32. port: 6379
  33. #Redis服务器连接密码,默认为空,若有设置按设置的来
  34. password:
  35. jedis:
  36. pool:
  37. # 连接池最大连接数,若为负数则表示没有任何限制
  38. max-active: 8
  39. # 连接池最大阻塞等待时间,若为负数则表示没有任何限制
  40. max-wait: -1
  41. # 连接池中的最大空闲连接
  42. max-idle: 8

Memcache例子

下载与安装(用管理员模式打开cmd)

 

 实现步骤:

  1. 1.导入依赖
  2. <dependency>
  3. <groupId>com.googlecode.xmemcached</groupId>
  4. <artifactId>xmemcached</artifactId>
  5. <version>2.4.7</version>
  6. </dependency>
  7. 2.在核心配置文件中自定义属性
  8. memcached:
  9. servers: localhost:11211
  10. poolSize: 10
  11. opTimeout: 3000
  12. 3.创建bean引用属性
  13. @Component
  14. @ConfigurationProperties(prefix = "memcached")
  15. @Data
  16. public class XMemcachedProperties {
  17. private String servers;
  18. private int poolSize;
  19. private long opTimeout;
  20. }
  21. 4.编写配置类
  22. @Configuration
  23. public class XMemcachedConfig {
  24. @Autowired
  25. private XMemcachedProperties xMemcachedProperties;
  26. @Bean
  27. public MemcachedClient getMemcachedClient() throws IOException {
  28. MemcachedClientBuilder memcachedClientBuilder=new XMemcachedClientBuilder(xMemcachedProperties.getServers());
  29. memcachedClientBuilder.setConnectionPoolSize(xMemcachedProperties.getPoolSize());
  30. memcachedClientBuilder.setOpTimeout(xMemcachedProperties.getOpTimeout());
  31. MemcachedClient memcachedClient=memcachedClientBuilder.build();
  32. return memcachedClient;
  33. }
  34. }
  35. 5.改写业务实现类
  36. @Service
  37. public class SMSCodeServiceImpl implements SMSCodeService {
  38. @Autowired
  39. private CodeUtils codeUtils;
  40. @Autowired
  41. private MemcachedClient memcachedClient;
  42. @Override
  43. public String sendCodeToSMS(String tele) {
  44. String code = codeUtils.generator(tele);
  45. try {
  46. memcachedClient.set(tele,0,code);
  47. } catch (TimeoutException e) {
  48. e.printStackTrace();
  49. } catch (InterruptedException e) {
  50. e.printStackTrace();
  51. } catch (MemcachedException e) {
  52. e.printStackTrace();
  53. }
  54. return code;
  55. }
  56. @Override
  57. public boolean checkCode(SMSCode smsCode) {
  58. //取出内存中的验证码与传过来的验证码比较,看是否一致
  59. String code = null;
  60. try {
  61. code = memcachedClient.get(smsCode.getTele()).toString();
  62. } catch (TimeoutException e) {
  63. e.printStackTrace();
  64. } catch (InterruptedException e) {
  65. e.printStackTrace();
  66. } catch (MemcachedException e) {
  67. e.printStackTrace();
  68. }
  69. return smsCode.getCode().equals(code);
  70. }
  71. }

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

闽ICP备14008679号