目录

缓存供应商变更:jetCache

一、远程缓存方案

1、基本配置

  maven坐标

yml文件配置

启用缓存开关

启动redis

2.重要代码

3.演示

二、本地缓存方案

maven坐标

yml文件配置

 代码介绍

三、jetCache方法缓存方案

配置

代码展示

开启方法注解


缓存供应商变更:jetCache

springboot使用缓存 springboot常用缓存技术_缓存

这个可以看做一个框架,对其他的缓存进行了整合。

一、远程缓存方案

springboot使用缓存 springboot常用缓存技术_redis_02

1、基本配置

  maven坐标

<dependency>
            <groupId>com.alicp.jetcache</groupId>
            <artifactId>jetcache-starter-redis</artifactId>
            <version>2.6.2</version>
        </dependency

yml文件配置

#  jetcache配置
jetcache:
#  远程连接方案
  remote:
#   只有一种情况的时候,就用default
    default:
#      使用redis
      type: redis
      host: localhost
      port: 6379
#      这个地方最少要给一条,不然会报错
      poolConfig:
        maxTotal: 50
#   定义另外一组配置
    sms:
      #      使用redis
      type: redis
      host: localhost
      port: 6379
      #      这个地方最少要给一条,不然会报错
      poolConfig:
        maxTotal: 50

启用缓存开关

在启动类添加@EnableCreateCacheAnnotation 注解

@SpringBootApplication
@EnableCreateCacheAnnotation  //启用使用注解的方式创建缓存
public class Springboot19CacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot19CacheApplication.class, args);
    }

}

启动redis

启动服务器

springboot使用缓存 springboot常用缓存技术_大数据_03

 启动客户端

springboot使用缓存 springboot常用缓存技术_大数据_04

2.重要代码

   类似集合的操作

@Service
public class SMSCodeServiceImpl implements SMSCodeService {


    @Autowired
    private CodeUtils codeUtils;

//  area指定配置(如果不指定默认default配置)  name 缓存空间   expire 缓存过期时间,默认是秒 timeUnit是指定expire的单位
    @CreateCache(area = "sms",name = "jetCache_",expire = 3600,timeUnit = TimeUnit.SECONDS)
//  用com.alicp.jetcache.Cache
//  泛型根据实际情况进行指定
    private Cache<String,String> jetCache;

    @Override

    public String sendCodeToSMS(String tele) {
//        通过电话号码得到我们想要的验证码
      String code=  codeUtils.generator(tele);

//      放入缓存
        jetCache.put(tele,code);

        return code;
    }

    @Override
    public boolean checkCode(SMSCode smsCode) {
//        取出内存中的验证码与传递过来的验证码进行对比,如果相同,返回true
        //用户输入的验证码以及电话号码
        String code = smsCode.getCode();

        //这是缓存中的验证码,因为tele是key,所以在此处要传入一个tele(正确的验证码)
        String cacheCode =jetCache.get(smsCode.getTele());

        return code.equals(cacheCode);
    }
}

3.演示

springboot使用缓存 springboot常用缓存技术_大数据_05

springboot使用缓存 springboot常用缓存技术_redis_06

二、本地缓存方案

maven坐标

与远程缓存方案坐标相同

yml文件配置

    此处是本地缓存方案

#  jetcache配置
jetcache:
#  本地连接方案
  local:
    default:
#     本地的缓存有两种,这里我们使用linkedhashmap
      type: linkedhashmap
#      key转换成字符串的工具(这里使用fastjson)
      keyConvertor: fastjson

本地缓存和远程缓存可以共同配置,如下图所示

#  jetcache配置
jetcache:
#  本地连接方案
  local:
    default:
#     本地的缓存有两种,这里我们使用linkedhashmap
      type: linkedhashmap
#      key转换成字符串的工具(这里使用fastjson)
      keyConvertor: fastjson
#  远程连接方案
  romote:
#   只有一种情况的时候,就用default
    default:
#      使用redis
      type: redis
      host: localhost
      port: 6379
#      这个地方最少要给一条,不然会报错
      poolConfig:
        maxTotal: 50

当然也可以远程方案和本地方案一起配置,如下面所示

#  jetcache配置
jetcache:
  #  本地连接方案
  local:
    default:
      #     本地的缓存有两种,这里我们使用linkedhashmap
      type: linkedhashmap
      #      key转换成字符串的工具(这里使用fastjson)
      keyConvertor: fastjson
  #  远程连接方案
#  远程连接方案
  remote:
#   只有一种情况的时候,就用default
    default:
#      使用redis
      type: redis
      host: localhost
      port: 6379
#      这个地方最少要给一条,不然会报错
      poolConfig:
        maxTotal: 50
#   定义另外一组配置
    sms:
      #      使用redis
      type: redis
      host: localhost
      port: 6379
      #      这个地方最少要给一条,不然会报错
      poolConfig:
        maxTotal: 50

其他情况时的配置 (这个我暂时没看懂)

springboot使用缓存 springboot常用缓存技术_大数据_07

 代码介绍

其他代码和本地一个样,只不过在这里指定了一下使用本地缓存

acheType = CacheType.LOCAL
//    cacheType 指定缓存使用本地还是远程,也可以同时使用本地或者远程
    @CreateCache(name = "jetCache_",expire = 3600,timeUnit = TimeUnit.SECONDS,cacheType = CacheType.LOCAL)
    private Cache<String,String> jetCache;

三、jetCache方法缓存方案

配置

 可以注意,下面我们在redis配置中多加了一条


keyConvertor: fastjson 如果,没有这一条的话,会报空指针异常


原因:  下图调用时,如果我们没有配置keyConvertor,就是null,此处导致了空指针异常

springboot使用缓存 springboot常用缓存技术_redis_08

除此之外,还应该添加

#     转出去的时候是java对象
      valueEncode: java
#      转回来的时候也是java对象
      valueDecode: java 

此两个配置,不添加的话,仍然会报异常(进出格式统一)

注意,上述针对的是远程redis配置

#  jetcache配置
jetcache:
#  每过多久,在控制台上显示一次统计数据(分钟)
  startIntervalMinutes: 1
  #  本地连接方案
  local:
    default:
      #     本地的缓存有两种,这里我们使用linkedhashmap
      type: linkedhashmap
      #      key转换成字符串的工具(这里使用fastjson)
      keyConvertor: fastjson
  #  远程连接方案
#  远程连接方案
  remote:
#   只有一种情况的时候,就用default
    default:
#      使用redis
      type: redis
      host: localhost
      port: 6379

      keyConvertor: fastjson

#     转出去的时候是java对象
      valueEncode: java
#      转回来的时候也是java对象
      valueDecode: java
#      这个地方最少要给一条,不然会报错
      poolConfig:
        maxTotal: 50
#   定义另外一组配置
    sms:
      #      使用redis
      type: redis
      host: localhost
      port: 6379
      #      这个地方最少要给一条,不然会报错
      poolConfig:
        maxTotal: 50

代码展示

开启方法注解

@EnableMethodCache()

@SpringBootApplication
//jetCache启动缓存开关
@EnableCreateCacheAnnotation

//开启方法缓存 (与@EnableCreateCacheAnnotation配合使用)
@EnableMethodCache(basePackages = "com.company")

public class Springboot21JetCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot21JetCacheApplication.class, args);
    }

}

此代码在BookService层的方法

前提: Book实习类实现序列化

@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements BookService {

    @Autowired
    private BookDao bookDao;


    @Override
//  @Cached(name="book",key = "#id" ,expire = 3600,cacheType = CacheType.LOCAL)   本地
    @Cached(name="book_",key = "#id" ,expire = 3600)  //远程
    @CacheRefresh(refresh = 5)//五秒刷新一次
    public Book getById(Integer id){
        Book queryBook = bookDao.selectById(id);
        return queryBook;
    }


    @Override
    public boolean save(Book book) {
        return bookDao.insert(book) >0;
    }

    @Override
//  类似键值对的形式 , key就是id,
//  为了以防我们的数据更改了,但是我们缓存中的数据并没有更改,这就是@CacheUpdate注解的作用,接着把缓存中对应的数据一块更改
    @CacheUpdate(name="book_",key = "#book.id",value="#book")
    public boolean update(Book book) {
        return bookDao.updateById(book) >0;
    }

    @Override
    @CacheInvalidate(name="book_",key = "#id")
    public boolean delete(Integer id) {
        return bookDao.deleteById(id) >0;
    }

    @Override
    public List<Book> getAll() {
        return bookDao.selectList(null);
    }
}

执行两次postman 

springboot使用缓存 springboot常用缓存技术_springboot使用缓存_09

 控制台只有一条信息打印

springboot使用缓存 springboot常用缓存技术_redis_10