罗列
- CacheConcurrencyStrategy.NONE
不进行缓存 - CacheConcurrencyStrategy.READ_ONLY
数据对象只读,发生修改则抛出错误 - CacheConcurrencyStrategy.NONSTRICT_READ_WRITE
数据对象可读写,在数据更新前后都删除一次缓存 - CacheConcurrencyStrategy.READ_WRITE
数据对象可读写,更新数据时先给数据“加锁”,表示当前数据对象无法使用缓存访问,而所有对当前数据对象的访问都会请求到数据库 - CacheConcurrencyStrategy.TRANSACTIONAL
使用 XA 事务,将缓存当作另一个数据源来保证二者的一致性
一致性问题
READ_ONLY
不允许修改数据库,没有一致性问题
NONSTRICT_READ_WRITE
可能引发一致性的问题,考虑这样一种场景:
请求1 | 请求2 |
---|---|
删除缓存 | |
缓存未命中,读取数据库 data0 | |
更新数据库 data1 | |
删除缓存 | |
更新缓存 data0 |
READ_WRITE
加锁期间所有的数据访问都会请求到数据库上,没有一致性问题,但是会造成缓存击穿
TRANSACTIONAL
将缓存作为另外一个数据源,实现一个 XA 事务,二者的修改将会由 hibernate 同步,之后一起提交(例如在数据库事务所有操作已经完成之后,同时的 commit 以及更新 redis,如果提交失败则立刻回滚),除非缓存数据源同样支持事务,否则没有意义。