UserService.java
package com.cjh.docker.service;
import com.cjh.docker.entities.User;
import com.cjh.docker.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @projectName: docker_boot
* @package: com.cjh.docker.service
* @className: UserService
* @author: tinkouka
* @date: 2023/2/7 22:48
* @version: 1.0
*/
@Service
@Slf4j
public class UserService {
public static final String CACHE_KEY_USER = "user:";
@Resource
private UserMapper userMapper;
@Resource
private RedisTemplate redisTemplate;
/**
* addUser
* @param user
*/
public void addUser(User user)
{
//1 正常にmysqlにデータを追加
int i = userMapper.insertSelective(user);
if(i > 0)
{
//2 追加したデータを再検索
user = userMapper.selectByPrimaryKey(user.getId());
//3 検索したデータをredisに保存、MySQLとの一貫性を保つ。
String key = CACHE_KEY_USER+user.getId();
redisTemplate.opsForValue().set(key,user);
}
}
/**
* findUserById
* @param id
* @return
*/
public User findUserById(Integer id)
{
User user = null;
String key = CACHE_KEY_USER+id;
//1 まずredisからデータを検索、ある場合はその結果を返す。ない場合は更にMySQLから検索
user = (User) redisTemplate.opsForValue().get(key);
if(user == null)
{
//2 redisから見つからない場合、更にMySQLから検索
user = userMapper.selectByPrimaryKey(id);
if(user == null)
{
//3.1 redis+mysql ともにデータない場合、nullのユーザをそのまま返す
return user;
}else{
//3.2 MySQLから見つかった場合、データをredisに保存
redisTemplate.opsForValue().set(key,user);
}
}
return user;
}
public void deleteUser(Integer id) {
User user = null;
user = userMapper.selectByPrimaryKey(id);
if(user != null){
userMapper.deleteByPrimaryKey(id);
redisTemplate.delete(id);
}
}
public void updateUser(User user) {
if(user != null){
userMapper.updateByPrimaryKey(user);
// 更新する際はredis中のデータも合わせて更新
redisTemplate.opsForValue().set(CACHE_KEY_USER+user.getId(),user);
}
}
}