Springboot 通过Template 整合 redis

前言

       在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既要排序又要查重,对内存的消耗是最大的,所以一般不使用。

上一篇:在mac电脑上写入文件到NTFS格式的移动硬盘的解决办法


下一篇:springboot整合redis