承接上篇環境搭建,本文展示如何在 Struts2 + Spring + Hibernate (SSH) 架構中,通過 RedisTemplate 實現課程(Clas)實體的 Redis 緩存增刪改查,並同步雙寫 MySQL,保證數據一致性。
RedisService 接口:封裝 String、Hash、List 操作。RedisTool.getRedisService():單例獲取服務實例。ClasService:Hibernate 業務層,負責 MySQL 持久化。public class RClasAction extends ActionSupport {
@Autowired private ClasService clasService;
private RedisService rs = RedisTool.getRedisService();
private Clas clas;
public String execute() {
saveClas(clas);
return SUCCESS;
}
private void saveClas(Clas c) {
// 1. 從 Redis 列表獲取最大 ID
List ids = rs.getList("clas:id");
int newId = Integer.parseInt(ids.get(ids.size() - 1)) + 1;
// 2. 更新 ID 列表與計數器
rs.rightPushList("clas:id", String.valueOf(newId));
int count = Integer.parseInt(rs.get("clas:count"));
rs.set("clas:count", String.valueOf(count + 1), -1);
// 3. 寫入 Hash 結構:clas:{id} → {ID, NAME, COMMENT}
Map map = new HashMap<>();
map.put("ID", String.valueOf(newId));
map.put("NAME", c.getName());
map.put("COMMENT", c.getComment());
rs.addHash("clas:" + newId, map);
// 4. 同步 MySQL
clasService.saveClas(c);
}
}
public class RClasDeleteAction extends ActionSupport {
@Autowired private ClasService clasService;
private RedisService rs = RedisTool.getRedisService();
private int id;
public String execute() {
deleteClas(id);
clasService.deleteClas(id); // 同步 MySQL
return SUCCESS;
}
private void deleteClas(int id) {
rs.del("clas:" + id); // 刪除 Hash
int count = Integer.parseInt(rs.get("clas:count"));
rs.set("clas:count", String.valueOf(count - 1), -1); // 計數器 -1
rs.delListItem("clas:id", String.valueOf(id)); // 從 ID 列表移除
}
}
public class RClasUpdateAction extends ActionSupport {
@Autowired private ClasService clasService;
private RedisService rs = RedisTool.getRedisService();
private Clas clas;
public String execute() {
Map map = new HashMap<>();
map.put("ID", String.valueOf(clas.getId()));
map.put("NAME", clas.getName());
map.put("COMMENT", clas.getComment());
rs.putHash("clas:" + clas.getId(), map); // 覆蓋更新 Hash
clasService.updateClas(clas); // 同步 MySQL
return SUCCESS;
}
}
// Hash 新增
public synchronized void addHash(K key, Map map) {
redisTemplate.opsForHash().putAll(key, map);
}
// Hash 更新
public synchronized void putHash(K key, Map map) {
redisTemplate.boundHashOps(key).putAll(map);
}
// List 刪除指定元素(相當於 LREM key 1 value)
public synchronized void delListItem(K key, V value) {
redisTemplate.opsForList().remove(key, 1, value);
}
@Transactional,確保 MySQL 操作原子性。