使用Redis达到的目的:
1.查询数据时先从cache中取数据,存在则返回,没有则从数据库中查找,从数据库中查找的结果再放入cache中,以便下次查找使 用cache。
2.更新或删除操作,在操作数据库后删除cache。
使用如下:
项目是在该片博文基础上直接增加的,https://blog.youkuaiyun.com/x_san3/article/details/81634699
1.pom.xml文件添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.application.properties文件添加Redis配置信息:
# Redis配置
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1s
# 连接超时时间(毫秒)
spring.redis.timeout=60s
3.写一个Redis配置类:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, User> template = new RedisTemplate<String, User>();
Jackson2JsonRedisSerializer<User> jrs = new Jackson2JsonRedisSerializer<User>(User.class);
template.setValueSerializer(jrs);
template.setHashValueSerializer(jrs);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setConnectionFactory(factory);
template.afterPropertiesSet();
return template;
}
}
4.controller中添加:
@Autowired
private RedisTemplate<String, User> rt;
@RequestMapping("/redis")
@ResponseBody
public String add() {
User u = new User();
u.setUser_name("hello");
u.setUser_pwd("world");
rt.opsForValue().set("user", u);
System.out.println(rt.opsForValue().get("user"));
return "success";
}
@RequestMapping("/rfuser")
@ResponseBody
public User find(@RequestParam("id") int id) {
return userService.findUserById(id);
}
@RequestMapping("/rupduser")
@ResponseBody
public int uodate(@RequestParam("id") int id, @RequestParam("name") String name) {
return userService.updateUser(id, name);
}
@RequestMapping("/rdeluser")
@ResponseBody
public int delete(@RequestParam("id") int id) {
return userService.deleteUser(id);
}
5.serviceImpl类中添加:
public User findUserById(Integer id) {
// 从缓存中获取城市信息
String key = "user_" + id;
ValueOperations<String, User> operations = rt.opsForValue();
// 缓存存在
if (rt.hasKey(key)) {
User User = operations.get(key);
System.out.println("findUserById() : 从缓存中获取了用户 >> ");
return User;
}
// 从 DB 中获取城市信息
User User = userDao.selectUserById(id);
// 插入缓存
operations.set(key, User);
System.out.println("findUserById() : User信息插入缓存 >> ");
return User;
}
@Override
public int updateUser(int id, String name) {
// 更新数据库
int result = userDao.updateUser(id, name);
// 若缓存存在,删除缓存
String key = "user_" + id;
if (rt.hasKey(key)) {
rt.delete(key);
System.out.println("updateUser() : 从缓存中删除城市 >> ");
}
return result;
}
@Override
public int deleteUser(int id) {
// 删除数据库
int result = userDao.deleteUser(id);
// 若缓存存在,删除缓存
String key = "User_" + id;
if (rt.hasKey(key)) {
rt.delete(key);
System.out.println("deleteUser() : 从缓存中删除城市 ID >> ");
}
return result;
}
6.Dao接口添加:
@Select("select user_name, user_pwd from t_user where user_name=#{name}")
public User findByUsername(@Param("name") String name);
@Update("update t_user set user_name=#{name} where user_id=#{id}")
public int updateUser(@Param("id") int id, @Param("name") String name);
@Delete("delete from t_user where user_id=#{id}")
public int deleteUser(int id);
OK,浏览器输入地址即可验证:
第一次查询后台打印了findUserById() : User信息插入缓存 >>,说明cache没有,从数据库查的,
第二次查询后台打印了findUserById() : 从缓存中获取了用户 >>,说明直接从cache中获取数据了。
更新删除也一样,看打印语句或debug即可。
源码下载:点击下载