罗列

  • 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,如果提交失败则立刻回滚),除非缓存数据源同样支持事务,否则没有意义。