redis+rabbitmq
之前遇到一個郁悶的問題,日志中時不時的會報出一個如下的錯誤。
org.apache.ibatis.exceptions.PersistenceException:
### Error updating DATABASE. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found WHEN trying TO GET LOCK; try restarting TRANSACTION
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: UPDATE tbl_marketing_coupon_scheme SET coupon_count = coupon_count+? WHERE id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found WHEN trying TO GET LOCK; try restarting TRANSACTION
觀察後發現應該是並發數太大,導致更新mysql數據庫發生死鎖。
coupon_count的實時性要求高,且追求准確度。
苦思而不得解決辦法,最近發現用redis+rabbitmq能比較好的解決這個問題。
解決此辦法的思路是,將coupon_count存入redis緩存中。讀數據的時候,通過redis緩存讀取。
在更新數據的時候,首先更新redis緩存,其次通過消息隊列(采用了rabbitmq)更新mysql數據庫。
因為消息隊列是線性的,故不會發生死鎖。
有一種情況是,更新緩存成功,但是更新數據庫失敗了。這時候怎麼辦呢,只要再次更新緩存,問題就解決了。