项目目录:
1.新建springboot项目,在pom文件中加入redis相关的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.为了方便起见,这里使用JPA,首先创建entity:
@Entity
public class Person implements Serializable{
private static final long serialVersionUID = 7693462130910291809L;
@Id
// @GeneratedValue
private long id;
@Column(nullable = false,unique = true)
private String name;
@Column(nullable = false)
private int age;
// 必须要有构造函数
public Person() {
}
public Person(long id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public long getId() {
return id;
}
public void setId(Long d) {
this.id = d;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
如果嫌上边写的太多,也可以使用lombok的@Data注解,相信这个类看起来会清爽不少。
3.接下来写dao层
public interface PersonRepository extends JpaRepository<Person, Long> {
Person findById(long id);
void deleteById(Long id);
}
4.写service
public interface PersonService {
public List<Person> getPersonList();
public Person findPersonById(long id);
public void save(Person person);
public void edit(Person person);
public void delete(long id);
}
service实现
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
PersonRepository personsitory;
@Override
public List<Person> getPersonList() {
return personsitory.findAll();
}
@Override
public Person findPersonById(long id) {
return personsitory.findById(id);
}
@Override
public void save(Person person) {
personsitory.save(person);
}
@Override
public void edit(Person person) {
personsitory.save(person);
}
@Override
public void delete(long id) {
personsitory.deleteById(id);
}
}
5.在写Controller之前,因为要用到redis,所以我们先对redis配置一下,以便更好地使用:
@Configuration
public class RedisConfig {
/**
* redisTemplate 序列化使用的jdkSerializeable, 存储二进制字节码, 所以自定义序列化类
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
由于示例的需要,我对RedisTemplate做了String,Object序列化的处理,方便进行数据的存取。
6.要写conreoller了:
// @RestController
@Controller
public class PersonController {
@Autowired
PersonService personService;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Resource
RedisTemplate<String, Person> redisTemplate;
@RequestMapping(value = "/")
private String personList() {
return "redirect:/list";
}
@RequestMapping("/list")
public String list(Model model) {
List<Person> person = personService.getPersonList();
model.addAttribute("personlist", person);
return "/list";
}
@RequestMapping("/toAdd")
public String toAdd(Person person) {
return "/add";
}
@RequestMapping("/add")
public String add(Person person) {
Long d = System.currentTimeMillis();
person.setId(d);
String id = d+"";
personService.save(person);
redisTemplate.opsForValue().set(id, person);
System.out.println("缓存数据保存成功......");
return "redirect:/list";
}
@RequestMapping("/toEdit")
public String toEdit(Model model, Long id) {
String s = id + "";
Person person = (Person)redisTemplate.opsForValue().get(s);
System.out.println("从缓存中取出要更新的数据......");
// Person person = personService.findPersonById(id);
model.addAttribute("person", person);
return "/updata";
}
@RequestMapping("/edit")
public String edit(Person person) {
String s = person.getId() + "";
redisTemplate.opsForValue().set(s, person);
System.out.println("缓存数据更新成功......" + redisTemplate.opsForValue().get(s));
personService.edit(person);
return "redirect:/list";
}
@RequestMapping("/delete")
public String delete(Long id) {
String ids = id + "";
System.out.println("从数据库中删除数据......");
personService.delete(id);
if (redisTemplate.hasKey(ids)) {
System.out.println("从缓存中删除数据......");
redisTemplate.delete(ids);
}
return "redirect:/list";
}
@RequestMapping(value = "/findone/{id}", method = RequestMethod.GET)
@ResponseBody
public Person findOne(@PathVariable("id") Long id) {
if (id != null) {
Person p = (Person) redisTemplate.opsForValue().get(id + "");
System.out.println("从缓存中取数据------->" + p);
return p;
} else {
personService.findPersonById(id);
Person p = personService.findPersonById(id);
System.out.println("从数据库中取数据------->" + p);
return p;
}
}
}
写Controller这部分时有个小插曲,当时在entity中给主键配置的自增,在测试时都是在原有数据基础上进行缓存的修改和删除,后来发现添加一直有问题,只能在缓存中加入最后一次添加的数据,所以在数据保存后,记得取一下存入数据的id值,否则缓存数据在RDM中键会为空值,当然就取不到了。
前台是使用的模板写的,在这里也一并贴出来,给大家参考:
list.html
add.html
updata.html
结果: