項目中用到redis,redis緩存是其中一個很重要的使用場景,如果讀寫數(shù)據(jù)的時候,讀取數(shù)據(jù)的時候可直接走內(nèi)存的,這樣的高并發(fā)訪問數(shù)據(jù)的時候,和查詢數(shù)據(jù)庫想比,redis讀取數(shù)據(jù)的高效性、快速的優(yōu)勢。
1.搭建redis環(huán)境
以下地址包括下載搭建和使用
redis搭建
2.安裝mysql
想必做java后臺開發(fā)的這個并不陌生,用數(shù)據(jù)工具,我用的是Navicat,我的文章中有相關(guān)的下載破解方法可以參考(Mac上Navicat破解與使用)
在本地連接的數(shù)據(jù)庫創(chuàng)建一個表,這里用的是User

image.png
3.準(zhǔn)備工作,搭建工程

image.png
pom.xml中添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
application.properties配置文件中添加redis配置
#Redis
spring.redis.database=1
#Redis服務(wù)器地址,可根據(jù)環(huán)境不同進行配置,此處是本機的
spring.redis.host=127.0.0.1
#Redis服務(wù)器連接端口,可根據(jù)自己服務(wù)器地址配置相應(yīng)端口,此處是本機的
spring.redis.port=6379
#Redis服務(wù)器連接密碼
spring.redis.password=123456
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=
spring.redis.jedis.pool.max-idle=4
spring.redis.jedis.pool.min-idle=2
spring.redis.timeout=1200
接下來User和數(shù)據(jù)庫中的user表對應(yīng),注意這里一定要序列化,因為redis保存對象的時候要求對象是序列化的;
User實體:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "name")
private String name;
@ApiModelProperty(value = "password")
private String password;
}
Service層:
具體是實現(xiàn)方法代碼如下:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
public User find(int id){
String key = "user_"+id;
ValueOperations<String,User>operations = redisTemplate.opsForValue();
boolean hasKey = redisTemplate.hasKey(key);
if (hasKey){
User user = operations.get(key);
System.out.println("從緩存中獲取的===="+ user.getName());
return user;
}else {
User user = userMapper.find(id);
System.out.println("從數(shù)據(jù)表中獲取的===="+ user.getName());
operations.set(key, user, 5, TimeUnit.HOURS);
return user;
}
}
public List<User>queryAll(){
return userMapper.queryAll();
}
public int updateUser(User user){
ValueOperations<String,User>operations = redisTemplate.opsForValue();
int result = userMapper.updateUser(user);
if(result != 0){
String key = "user"+user.getId();
boolean hasKey = redisTemplate.hasKey(key);
if (hasKey){
redisTemplate.delete(key);
System.out.println("刪除緩存中的數(shù)據(jù)");
}
//再更新新的數(shù)據(jù)到緩存中
User userNew = userMapper.find(user.getId());
if (userNew != null){
operations.set(key,userNew,3,TimeUnit.HOURS);
}
}
return result;
}
public int deleteUser(int id){
int result = userMapper.deleteUser(id);
String key = "user"+ id;
if(result != 0){
boolean hasKey = redisTemplate.hasKey(key);
if (hasKey){
redisTemplate.delete(key);
System.out.println("刪除緩存中的");
}
}
return result;
}
}
Controller層:
@RestController
public class UserController {
@Autowired
UserService userService;
@ApiOperation(value = "查找",nickname = "findUser")
@RequestMapping(value = "/users/find",method = RequestMethod.POST)
public User find(@RequestBody User user){
return userService.find(user.getId());
}
@ApiOperation(value = "查找所有",nickname = "queryAll")
@RequestMapping(value = "/users/queryAll",method = RequestMethod.POST)
public List<User> queryAll(){
return userService.queryAll();
}
@ApiOperation(value = "更新某個用戶",nickname = "updateUser")
@RequestMapping(value = "/users/updateUser",method = RequestMethod.POST)
public int updateUser(User user){
return userService.updateUser(user);
}
@ApiOperation(value = "刪除某個用戶",nickname = "deleteUser")
@RequestMapping(value = "/users/deleteUser",method = RequestMethod.POST)
public int deleteUser(int id){
return userService.deleteUser(id);
}
}
mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.redisdemo.demo.mapper.UserMapper">
<!--id對應(yīng)接口中的方法,名字要一樣,parameterType是方法的參數(shù)類型,
resultType是查詢返回的類型,需要注意的是,這里的SQL語句后面不能加分號,變量不能加引號-->
<resultMap id="BaseResultMap" type="com.redisdemo.demo.entity.User" >
<result column="id" property="id" />
<result column="name" property="name" />
<result column="password" property="password" />
</resultMap>
<select id="find" resultMap="BaseResultMap">
select * from user where id = #{id}
</select>
<select id="queryAll" resultMap="BaseResultMap">
select * from user
</select>
<update id="updateUser" parameterType="com.redisdemo.demo.entity.User">
update user set name = #{user.name},password = #{user.password} where id = #{user.id}
</update>
<delete id = "deleteUser">
delete from user where id = #{id}
</delete>
</mapper>
首次緩存中沒有數(shù)據(jù),從數(shù)據(jù)表中查詢,打印日志如下:

image.png
當(dāng)?shù)诙尉彺嬷杏袛?shù)據(jù),直接取出緩存中的數(shù)據(jù),打印日志如下:

image.png
同樣用RDM redis可視化工具看一下緩存中的數(shù)據(jù),具體如下:

image.png