一、Jedis简介
JDBC是通过Java操作数据库。Jedis是通过Java操作Redis。
二、测试连接Redis
- 要先将Redis配置文件中限制本机访问的两个位置配置一下。
把 bind 127.0.0.1 -::1
注释掉,再把 保护模式
设置为no,即可远程访问Redis。 还需要重启Redis。
- 创建一个Maven工程,引入Jedis的相关依赖。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
- 写一个测试类,测试是否能够Ping得通虚拟机上的Redis。
package com.example.jedis;
import redis.clients.jedis.Jedis;
/**
* 注意:要将Redis配置文件中限制本机访问的两个位置配置一下。
*/
public class jedisDemo01 {
public static void main(String[] args) {
//创建Jedis对象
Jedis jedis = new Jedis("192.168.121.138",6379);
String ping = jedis.ping();
System.out.println(ping);
}
}
- 启动测试类,测试是否ping得通。
已经配置好了,却还是失败了。是因为虚拟机有防火墙,需要将虚拟机的对应端口开放才行。
- 这里只是用虚拟机测试,没有安全问题,也仅仅是为了测试,所以直接暂时关闭防火墙。
- 再次测试
三、操作Redis
3.1 Key
key *
:查看当前库的所有key
//查看当前库的所有key。默认启用0号库。
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
exists key
:判断某个key是否存在
//返回true或false
System.out.println(jedis.exists("name"));
expire key 10
:为给定的key设置过期时间,10秒种
jedis.expire("name", 10);
ttl key
:查看还有多少秒过期,-1表示永不过期,-2表示已过期
//查看还有多久过期
System.out.println(jedis.ttl("name"));
dbsize
:查看当前数据库的key的数量
System.out.println(jedis.dbSize());
flushdb
:清空当前库
jedis.flushDB();
flushall
:通杀全部库
jedis.flushAll();
3.2 String
set <key> <value>
:添加键值对
//添加
jedis.set("name", "弹头");
get <key>
:查询对应键值
//获取值
String name = jedis.get("name");
System.out.println(name);
mset <key1> <value1> <key2> <value2> ...
:同时设置一个或多个键值对
//设置多个key-value
jedis.mset("k1", "v1", "k2", "v2");
mget <key1> <key2> ...
:同时获取一个或多个value
List<String> mget = jedis.mget("k1", "k2");
3.3 List
lpush / rpush <key1> <value1> <key2> <value2> ...
:从左边/右边插入一个或多个值
jedis.lpush("key1", "lucy", "maria", "jack");
lrange <key> <start> <stop>
:按照索引下标获得元素(从左到右)
List<String> values = jedis.lrange("key1", 0, -1);
3.4 Set
sadd <key> <value1> <value2> ...
:将一个或多个member元素加入到集合key中,已经存在的元素会被忽略。
jedis.sadd("name", "弹头", "玛卡巴卡");
smembers <key>
:取出该集合的所有值
Set<String> stringSet = jedis.smembers("name");
3.5 Hash
hset <key> <field> <value>
:给<key>集合中的<field>键赋值<value>
jedis.hset("users", "age", "20");
hget <key> <field>
:从<key>集合中<field>域中取出value
System.out.println(jedis.hget("users", "age"));
3.6 Zset
zadd <key> <score1> <value1> <score2> <value2> ...
:将一个或多个member元素及其score值加入到有序集key当中。
jedis.zadd("china", 100, "shanghai");
jedis.zadd("china", 200, "beijing");
jedis.zadd("china", 300, "tianjin");
zrange <key> <start> <stop> [WITHSCORES]
:返回有序集key中,下标在<start><stop>之间的元素。
Set<String> stringSet = jedis.zrange("china", 0, -1);
System.out.println(stringSet);
四、实例
完成一个手机验证码功能
- 随机生成6位数字码:Random(必须不同,判断一下redis中是否存在)
- 验证码在2分钟内有效:把验证码放到redis中,过期时间120秒
- 判断验证码是否一致:从redis中获取验证码和输入的验证码进行比较。
- 每个手机号每天只能输入3次:incr 每次发送后+1。大于2的时候,提交不能发送。
package com.example.jedis;
import redis.clients.jedis.Jedis;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
public class PhoneCode {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String phone = reader.readLine();
//若超过3次,会返回一个false,此时要让整个程序直接结束。
boolean verifyCode = verifyCode(phone);
if (verifyCode){
String code = reader.readLine();
check(phone, code);
}
}
//1.随机生成6位数字码:Random(必须不同,判断一下redis中是否存在)
public static StringBuilder getCode() {
Random random = new Random();
StringBuilder code = new StringBuilder();
for (int i = 0; i < 6; i++) {
code.append(random.nextInt(10));
}
return code;
}
//2、4.验证码在2分钟内有效;每个手机号每天只能输入3次
public static boolean verifyCode(String phone) {
Jedis jedis = new Jedis("192.168.121.138", 6379);
//拼接key
String countKey = "VerifyCode" + phone + ":count";
String codeKey = "VerifyCode" + phone + ":code";
//每个手机每天只能发送三次
String count = jedis.get(countKey);
//没有发送次数,则为第一次
if (count == null) {
jedis.setex(countKey, 24 * 3600, "1");
} else if (Integer.parseInt(count) <= 2) {
jedis.incr(countKey);
} else if (Integer.parseInt(count) > 2) {
System.out.println("今天发送次数已经超过3次");
jedis.close();
return false;
}
//发送验证码到redis里
String code = getCode().toString();
System.out.println(code);
jedis.setex(codeKey, 120, code);
jedis.close();
return true;
}
//3.判断验证码是否一致
public static void check(String phone, String code) {
Jedis jedis = new Jedis("192.168.121.138", 6379);
String codeKey = "VerifyCode" + phone + ":code";
try {
String redisCode = jedis.get(codeKey);
if (redisCode.equals(code)) {
System.out.println("验证码相同,成功");
} else {
System.out.println("验证码不同,失败");
}
} catch (Exception e) {
System.out.println("过期了");
}
}
}