一、Redis和数据库的结合
使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题。
例如,T1时刻以将 key1 保存数据到 Redis,T2时刻刷新进入数据库,但是T3时刻发生了其他业务需要改变数据库同一条记录的数据,但是采用了 key2 保存到Redis中,然后又写入了更新数据到数据库中,这就导致 Redis 中key1 的数据是脏数据,和数据库中的数据不一致。
1.Redis和数据库读操作
数据缓存往往会在 Redis 上设置超时时间,当设置 Redis 的数据超时后,Redis 就没法读出数据了,这个时候就会触发程序读取数据库,然后将读取数据库数据写入 Redis,并给数据重设超时时间,这样程序在读取的过程中就能按一定的时间间隔刷新数据了。
public DataObject readMethod(args) { DataObject data = getRedis(key); if(data != null){ data = getFromDataBase(); writeRedis(key, data); setRedisExpire(key, 5); } return data; }
2. Redis 和数据库写操作
写操作要考虑数据一致的问题,尤其是那些重要的业务数据,所以首先应该考虑从数据库中读取最新的数据,然后对数据进行操作,最后把数据写入 Redis 缓存中。
写入业务数据时,应该先从数据库中读取最新数据,然后进行业务操作,更新业务数据到数据库后,再将数据刷新到 Redis 缓存中,这样就能避免将脏数据写入数据库中。
public DataObject writeMethod(args) { DataObject data = getFromDataBase(args); ExecLogic(data); updateDataBase(data); updateRedisData(data); }
二、使用Spring缓存机制整合Redis
1.定义一个POJO类和Mybatis
package com.ssm.chapter21.pojo; import java.io.Serializable; public class Role implements Serializable { private static final long serialVersionUID = -1194462093889377366L; private Long id; private String roleName; private String note; /**** setter and getter ****/ }