目录
缓存供应商变更:jetCache
一、远程缓存方案
1、基本配置
maven坐标
yml文件配置
启用缓存开关
启动redis
2.重要代码
3.演示
二、本地缓存方案
maven坐标
yml文件配置
代码介绍
三、jetCache方法缓存方案
配置
代码展示
开启方法注解
这个可以看做一个框架,对其他的缓存进行了整合。
com.alicp.jetcache
jetcache-starter-redis
2.6.2
# 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);
}
}
启动服务器
启动客户端
类似集合的操作
@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 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);
}
}
与远程缓存方案坐标相同
此处是本地缓存方案
# 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
其他情况时的配置 (这个我暂时没看懂)
其他代码和本地一个样,只不过在这里指定了一下使用本地缓存
acheType = CacheType.LOCAL
// cacheType 指定缓存使用本地还是远程,也可以同时使用本地或者远程
@CreateCache(name = "jetCache_",expire = 3600,timeUnit = TimeUnit.SECONDS,cacheType = CacheType.LOCAL)
private Cache jetCache;
可以注意,下面我们在redis配置中多加了一条
keyConvertor: fastjson 如果,没有这一条的话,会报空指针异常
原因: 下图调用时,如果我们没有配置keyConvertor,就是null,此处导致了空指针异常
除此之外,还应该添加
# 转出去的时候是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 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 getAll() {
return bookDao.selectList(null);
}
}
执行两次postman