likeButton.setOnClickListener(v -> {
if (alreadyLiked) {
Toast.makeText(this, "已贊過", Toast.LENGTH_SHORT).show();
return;
}
likeButton.setEnabled(false); // 防止連點
api.like(postId, new Callback() {
@Override public void onSuccess() {
alreadyLiked = true;
likeCount++;
updateUI();
}
@Override public void onFailure() {
likeButton.setEnabled(true);
}
});
});
device_id。likes (post_id, device_id) 建立唯一複合索引。INSERT IGNORE 或 ON DUPLICATE KEY UPDATE,回傳是否新增成功。String key = "like:" + postId + ":" + deviceId;
Boolean acquired = redisTemplate.opsForValue().setIfAbsent(key, "1", 24, TimeUnit.HOURS);
if (!acquired) return "已贊過";
// 寫入 DB、更新計數...
前端攔截提升體驗,後端唯一索引/分散式鎖保證資料正確性,兩者結合才能有效防刷。