一.手机验证码发送案例
package com.atguigu.jedis;
import redis.clients.jedis.Jedis;
import java.util.Random;
public class PhoneCode {
public static void main(String[] args) {
//模拟验证码发送
verifyCode("13678765435");
//模拟验证码校验
//getRedisCode("13678765435","4444");
}
//3 验证码校验
public static void getRedisCode(String phone,String code) {
//从redis获取验证码
Jedis jedis = new Jedis("192.168.44.168",6379);
//验证码key
String codeKey = "VerifyCode"+phone+":code";
String redisCode = jedis.get(codeKey);
//判断
if(redisCode.equals(code)) {
System.out.println("成功");
}else {
System.out.println("失败");
}
jedis.close();
}
//2 每个手机每天只能发送三次,验证码放到redis中,设置过期时间120
public static void verifyCode(String phone) {
//连接redis
Jedis jedis = new Jedis("192.168.44.168",6379);
//拼接key
//手机发送次数key
String countKey = "VerifyCode"+phone+":count";
//验证码key
String codeKey = "VerifyCode"+phone+":code";
//每个手机每天只能发送三次
String count = jedis.get(countKey);
if(count == null) {
//没有发送次数,第一次发送
//设置发送次数是1
jedis.setex(countKey,24*60*60,"1");
} else if(Integer.parseInt(count)<=2) {
//发送次数+1
jedis.incr(countKey);
} else if(Integer.parseInt(count)>2) {
//发送三次,不能再发送
System.out.println("今天发送次数已经超过三次");
jedis.close();
}
//发送验证码放到redis里面
String vcode = getCode();
jedis.setex(codeKey,120,vcode);
jedis.close();
}
//1 生成6位数字验证码
public static String getCode() {
Random random = new Random();
String code = "";
for(int i=0;i<6;i++) {
int rand = random.nextInt(10);
code += rand;
}
return code;
}
}
二.Redis事务Multi、Exec、discard
Multi 开始将以下命令都加入事务中但是不执行
Exec 执行事务中的命令
discard 中断事务命令全部不执行
注:在组队中某一个命令出错,则全部命令都不会执行。
在执行时某一命令出错,除了出错的命令外,其他命令都会执行(MySQL 全部不执行)。
三.乐观锁和悲观锁
悲观锁:在操作前提前上锁,其他人直到拿到锁才能操作。一个一个的执行,效率低。
乐观锁:每次去拿数据认为其他人都不会修改数据,所以不上锁。当需要修改数据时会判断当前在此期间有无修改数据(使用版本号等机制)check-and-set 机制。
乐观锁的使用: watch[key1] [key2]...
提前执行watch 的键 会被监视,在事务中,如果key被修改则其他则事务将会被打断。
四.Redis事务的三大特性
·单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
·没有隔离级别
事务在提交前命令都不会被执行
·不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚