Redis是用一个基于内存的Key-Value数据库,而Jedis是Redis官方推出的面向Java的Client,提供了很多接口和方法,可以让Java操作使用Redis,而Spring Data Redis是对Jedis进行了封装,集成了Jedis的一些命令和方法,可以与Spring整合。在后面的配置文件(spring-context.xml)中可以看到,Spring是通过Jedis类来初始化connectionFactory的。
spring-data-redis针对jedis提供了如下功能:
1. 连接池自动管理,提供了一个高度封装的RedisTemplate类
2. 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口 **RedisTemplate opsForXXX方法获得**
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
序列化类:
GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象
StringRedisSerializer: 简单的字符串序列化
3. 将事务操作封装,由容器控制。
//实现序列化
public class User implements Serializable {
private int id;
private String name;
private String password;
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
//省去getter和setter方法
}
public interface UserService {
void add(User user);
User getUser(String key);
}
@Service
public class UserServiceImpl implements UserService {
//RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
@Override
public void add(User user) {
//第一种方法需要实现序列化,并在配置中配置序列化方式
// ValueOperations valueOps = redisTemplate.opsForValue();
// valueOps.set(String.valueOf(user.getId()), user);
//第二种方式不用,调用ProtoStuff直接序列化
final byte[] key = ProtoStuffUtil.serialize(user.getId());
final byte[] value = ProtoStuffUtil.serialize(user);
boolean result = redisTemplate.execute((RedisConnection connection) -> {
return connection.setNX(key, value);
});
System.out.println("添加的结果: " + result);
}
@Override
public User getUser(String key) {
// ValueOperations valueOps = redisTemplate.opsForValue();
// return valueOps.get(key);
byte[] result = redisTemplate.execute((RedisConnection connection) -> {
return connection.get(ProtoStuffUtil.serialize(Integer.valueOf(key)));
});
if(result == null)
return null;
return ProtoStuffUtil.deserialize(result, User.class);
}
}
@Controller
@RequestMapping("/redis")
public class UserController {
@Autowired
private UserService userService;
private User user;
@RequestMapping(value="/addUser", method= RequestMethod.POST)
public String addUser(@RequestParam(value="id") String id,
@RequestParam(value="name") String name,
@RequestParam(value="password") String password) {
user = new User(Integer.valueOf(id), name, password);
userService.add(user);
return "addSuccess";
}
@RequestMapping(value="/addUser", method=RequestMethod.GET)
public String addUser() {
return "addUser";
}
@RequestMapping(value = "/queryUser")
public String queryUser() {
return "getUser";
}
@RequestMapping(value = "/getUser")
public String getUser(
@RequestParam(value = "key", required = true) String key,Model model) {
user = userService.getUser(key); //null判断
model.addAttribute("userId", user.getId());
model.addAttribute("username", user.getName());
model.addAttribute("userpassword", user.getPassword());
return "showUser";
}
}
//操作步骤
一、创建任务(Job)
一种是继承org.springframework.scheduling.quartz.QuartzJobBean类来实现Job任务
另一种是不继承任何类,创建普通的Java类,然后自己指定任务的执行方法。
二、在Spring配置文件中配置JobDetail
三、配置触发器(Trigger)
1、org.springframework.scheduling.quartz.SimpleTriggerFactoryBean(此种方式是隔多长时间进行触发一次,比如每隔24小时触发一次)
2、org.springframework.scheduling.quartz.CronTriggerFactoryBean(此种方式是在指定的时间进行触发,比如只在周一进行触发)
四、配置SchedulerFactoryBean
时间格式:
1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 允许的值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日 1-31 , - * ? / L W C
月 1-12 or JAN-DEC , - * /
周 1-7 or SUN-SAT , - * ? / L C #
年 (可选字段) empty, 1970-2099 , - * /
“*”字符:表示该域上的每一个值
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
2)Cron表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
在Spring配置和Quartz集成内容时,有两点需要注意
1、在
中不能够设置default-lazy-init=”true”,否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。
2、在
中不能够设置default-autowire=”byName”的属性,否则后台会报org.springframework.beans.factory.BeanCreationException错误,这样就不能通过Bean名称自动注入,必须通过明确引用注入
//每隔三秒执行一次
@Scheduled(cron = "0/5 * * * * ?")
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
<task:annotation-driven/>