1. reids基本数据类型测试
jedis
简要了解:
jedis
是redis
的客户端工具jedis
是java
用于操作redis
的工具,类似于jdbc
之于mysql
jedis
封装了用java
语言实现的操作redis
的命令
1.1 maven创建IDEA工程
- 使用
maven
目的:使用jedis
需要导入jedis
的依赖包,使用maven
导入和管理依赖 - 修改
pom.xml
文件:导入jedis
依赖
mvnrepository 搜索 jedis mvn
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
- 测试是否连通
- 创建
jedis
对象new Jedis("xx.xx.xx.xx",6379)
- 使用
ping()
方法测试jedis.ping()
- 输出
PONG
连通
- 创建
@Test
public void testDemo(){
// 创建jedis对象
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
// 测试是否连通
String ping = jedis.ping();
System.out.println(ping);//PONG
jedis.close();
}
1.2 String类型
1.2.1 添加数据到redis中
- 添加键值对:
jedis.set("name","July")
- 获取
value
:jedis.get("name")
@Test
public void testDemo2(){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
// 1.添加
jedis.set("name","July");
// 2.获取
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
1.2.2 遍历key
- 获取
key
:jedis.keys("*")
- 遍历
key
:得到Set<String>
类型集合可使用for-each
遍历
// 操作key
@Test
public void testDemo1(){
// 1.创建jedis对象
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
// 2.获取key
Set<String> keys = jedis.keys("*");
// 3.遍历key
for(String key : keys){
System.out.println(key);
}
jedis.close();
}
1.2.3 设置多个key和value
- 添加多个键值对:
jedis.mset("k1","v1","k2","v2")
- 获取多个
value
:jedis.mget("k1", "k2")
- 遍历:得到
List<String>
类型集合可直接输出list
@Test
public void testDemo3(){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
jedis.mset("k1","v1","k2","v2");
List<String> mget = jedis.mget("k1", "k2");
System.out.println(mget);//[v1, v2]
jedis.close();
}
1.3 list数据类型
@Test
public void testDemo4(){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
jedis.lpush("listl","l1","l2","l3","l4");
String lpop = jedis.lpop("listl");//l4
System.out.println(lpop);
List<String> listl = jedis.lrange("listl", 0, -1);
System.out.println(listl);//[l3, l2, l1]
jedis.close();
}
1.4 set 数据类型
- 添加:
jedis.sadd("st","s1","s2","s3","s4")
- 获取:
Set<String> st = jedis.smembers("st")
@Test
public void testDemo5(){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
// 向set中添加元素,不能添加重复元素
jedis.sadd("st","s1","s2","s3","s4");
// 取值
Set<String> st = jedis.smembers("st");
System.out.println(st);
jedis.close();
}
1.5 hash 数据类型
- 添加:
jedis.hset("user1","age","20")
- 获取:
String age = jedis.hget("user1","age")
@Test
public void testDemo6(){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
// 向hash中添加元素,不能添加重复元素
jedis.hset("user1","age","20");
// 取值
String age = jedis.hget("user1","age");
System.out.println(age);
jedis.close();
}
1.6 zset 数据类型
- 添加:
jedis.zadd("china",100d,"hangzhou")
- 获取:
Set<String> china = jedis.zrange("china", 0, -1)
@Test
public void testDemo7(){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
// 向zset中添加元素,不能添加重复元素
jedis.zadd("china",100d,"hangzhou");
// 取值
Set<String> china = jedis.zrange("china", 0, -1);
System.out.println(china);
jedis.close();
}
2. redis 验证码实例
功能:输入手机号,得到两分钟内有效的验证码,且同一个手机一天只能登录三次
- 生成六位随机数
// 1.获取六位验证码
public static String getCode(){
Random random = new Random();
String code = "";
for(int i = 0; i < 6; i++){
code += random.nextInt(10);
}
return code;
}
- 设置手机和验证码的
key
,目的是完成后续对应的value
的自增和过期设置
// 设置手机的key
String countKey = "VerifyCode" + phone + ":count";
// 设置验证码的key
String codeKey = "VerifyCode" + phone + ":code";
- 获取手机
value
,设置手机的过期时间,设置访问自增
String count = jedis.get(countKey);
if(count == null){
jedis.setex(countKey, 24*60*60, "1");
}else if(Integer.parseInt(count) <= 2){
jedis.incr(countKey);
}else if(Integer.parseInt(count) > 2){
System.out.println("今天的发送次数超过三次");
jedis.close();
}
- 调用
getCode()
函数获取验证码value
,设置验证码的过期时间
String vcode = getCode();
jedis.setex(codeKey,120,vcode);
- 根据验证码的
key
获取```value``
String codeKey = "VerifyCode" + phone + ":code";
String redisCode = jedis.get(codeKey);
- 判断通过
redis
获取的value
和传入的value
是否相同
if(redisCode.equals(code)){
System.out.println("success!");
}else{
System.out.println("fail!!!");
}
- 注意每一步创建
jedis
实例后要关闭
jedis.close();
- 整体代码
public class PhoneCode {
public static void main(String[] args) {
// 用redis实现验证码,两分钟内有效,每个手机一天只能登三次
verifyCode("123456789");
// getRedisCode("123456789","721453");
}
// 3.验证码校验
public static void getRedisCode(String phone, String code){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
String codeKey = "VerifyCode" + phone + ":code";
String redisCode = jedis.get(codeKey);
// 判断
if(redisCode.equals(code)){
System.out.println("success!");
}else{
System.out.println("fail!!!");
}
jedis.close();
}
// 2. 每个手机只能发三次,验证码放到redis中,设置过期时间120
public static void verifyCode(String phone){
Jedis jedis = new Jedis("xx.xx.xx.xx",6379);
jedis.auth("password");
// 拼接key
String countKey = "VerifyCode" + phone + ":count";
String codeKey = "VerifyCode" + phone + ":code";
// 每个手机一天只能发三次
String count = jedis.get(countKey);
System.out.println(count);
if(count == null){
jedis.setex(countKey, 24*60*60, "1");
}else if(Integer.parseInt(count) <= 2){
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.获取六位验证码
public static String getCode(){
Random random = new Random();
String code = "";
for(int i = 0; i < 6; i++){
code += random.nextInt(10);
}
return code;
}
}