前言
在springboot框架中,通过RedisTemplate中封装好的方法去操作redis中的各种数据类型,完成增删改查操作。
本项目将数据序列化为json格式,分别以set、zset、hash的结构存入数据库中,完成查询所有数据、通过id查询单个数据,新增数据的操作。
实体类
public class User {
private int id;
private String name;
private String password;
}
yml配置文件
用于配置redis的ip、端口、数据库、连接池等
spring:
redis:
port: 6379
host: 127.0.0.1
database: 1
password: 123456
jedis:
pool:
max-active: 8
max-idle: 8
max-wait: 1ms
timeout: 5000ms
config配置
将实体类数据序列化为json格式
import java.text.SimpleDateFormat;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object, Object> template = new RedisTemplate<>();
//ObjectMapper 指定在转成json的时候的一些转换规则
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// 把自定义的objectMapper设置到jackson2JsonRedisSerializer
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// RedisTemplate默认的序列化方式使用的是jdk的序列化
// 设置了key的序列化方式
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(jackson2JsonRedisSerializer); // 配置hash格式
// 设置了value序列化方式
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer); // 配置hash格式
return template;
}
}
在启动类中需要使用@ComponentScan()注解扫描配置文件
hash
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RedisTemplate redisTemplate;
/**
* 获取所有数据
*
* @return
*/
@RequestMapping("/getuser")
public AjaxMessage getUserList() {
// 设置过期时间
redisTemplate.expire("userHash", 5, TimeUnit.SECONDS);
if (redisTemplate.opsForHash().size("userHash") <= 0) {
// 如果redis缓存没有,则去数据库中寻找
List<User> userList = userService.queryAllUsers();
if (userList == null) {
return new AjaxMessage(false, "没有数据", null);
} else {
for (User user : userList) {
redisTemplate.opsForHash().put("userHash", user.getId(), user);
}
return new AjaxMessage(true, "从sqlserver获取的数据", userList);
}
} else {
// 直接从redis中获取数据
return new AjaxMessage(true, "从Redis获取userHash数据", redisTemplate.opsForHash().values("userHash"));
}
}
/**
* 根据id获取单条数据
* @param id
* @return
*/
@RequestMapping("/getuserid/{id}")
public AjaxMessage getUser(@PathVariable("id") int id) {
// User user = userService.querUserById(id);
// if (user != null) {
// return new AjaxMessage(true, "", user);
// }else {
// return new AjaxMessage(false, "没有数据", null);
// }
return new AjaxMessage(true, "从Redis获取userHash数据", redisTemplate.opsForHash().get("userHash", id));
}
/**
* 添加数据
* @param user
* @return
*/
@RequestMapping("/add")
public String addUser(@RequestBody User user) {
int res = userService.addUser(user);
if (res > 0) {
// 添加成功后,将数据写入redis数据库
redisTemplate.opsForHash().put("userHash", user.getId(), user);
return "添加成功";
} else {
return "添加失败";
}
}
}
zset
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RedisTemplate redisTemplate;
/**
* 获取所有数据
* @return
*/
@RequestMapping("/getuser")
public AjaxMessage getUserList() {
if (redisTemplate.opsForZSet().zCard("userZset")<=0) {
// 如果redis缓存没有,则去数据库中寻找
List<User> userList = userService.queryAllUsers();
if (userList == null) {
return new AjaxMessage(false, "没有数据", null);
} else {
for (User user : userList) {
redisTemplate.opsForZSet().add("userZset", user,user.getId());
}
return new AjaxMessage(true, "从sqlserver获取的数据", userList);
}
}else {
// 直接从redis中获取数据
return new AjaxMessage(true,"从Redis获取的userZset数据",redisTemplate.opsForZSet().range("userZset", 0, -1));
}
}
/**
* 根据id获取单条数据
* @param password
* @return
*/
@RequestMapping("/getuserid/{id}")
public AjaxMessage getUser(@PathVariable("id") int id) {
// User user = userService.querUserById(id);
// if (user != null) {
// return new AjaxMessage(true, "", user);
// }else {
// return new AjaxMessage(false, "没有数据", null);
// }
return new AjaxMessage(true,"从Redis中获取userZset数据",redisTemplate.opsForZSet().range("userZset", id-1, id-1));
}
/**
* 添加数据
* @param user
* @return
*/
@RequestMapping("/add")
public String addUser(@RequestBody User user) {
int res = userService.addUser(user);
if(res>0) {
// 添加成功后,将数据写入redis数据库
redisTemplate.opsForZSet().add("userZset", user, user.getId());
return "添加成功";
}else {
return "添加失败";
}
}
}
set
使用set格式,无法根据id获取指定数据
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RedisTemplate redisTemplate;
/**
* 查询所有数据
* @return
*/
@RequestMapping("/getuser")
public AjaxMessage getUserList() {
if (redisTemplate.opsForSet().size("userSet")<=0) {
// 如果redis缓存没有,则去数据库中寻找
List<User> userList = userService.queryAllUsers();
if (userList == null) {
return new AjaxMessage(false, "没有数据", null);
} else {
for (User user : userList) {
redisTemplate.opsForSet().add("userSet", user);
}
return new AjaxMessage(true, "从sqlserver获取的数据", userList);
}
}
else {
// 直接从redis中获取数据
return new AjaxMessage(true,"从Redis中获取userSet数据",redisTemplate.opsForSet().members("userSet"));
}
}
/**
* 添加数据
* @param user
* @return
*/
@RequestMapping("/add")
public String addUser(@RequestBody User user) {
int res = userService.addUser(user);
if (res > 0) {
// 添加成功后,将数据写入redis数据库
redisTemplate.opsForSet().add("userSet", user);
return "添加成功";
} else {
return "添加失败";
}
}
}
注意
执行添加操作时要注意,当sqlserver数据库添加成功而redis添加失败的情况。
在hash、set、zset中,zset既要排序又要查重,对内存的消耗是最大的,所以一般不使用。