Jedis: 一款 java 操作 redis 数据库的工具,类似于 JDBC
一、使用步骤
引入依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
禁用Linux的防火墙:Linux(CentOS7)里执行命令
systemctl stop firewalld.service
redis.conf中注释掉bind 127.0.0.1 ,然后 protected-mode no
否则无法连接:
public class Demo1 {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.176.128",6379);
String ping = jedis.ping();
System.out.println("连接成功:" + ping);
jedis.close();
}
}
public class RedisTest {
@Test
public void test() {
// 1. 获取连接
Jedis jedis = new Jedis("localhost", 6379);
// 2. 操作
jedis.set("username", "zhangsan");
// 3. 关闭连接
jedis.close();
}
}
二、Jedis 操作各种 Redis 中的数据结构
- 字符串类型 string:set/get
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
//存储
jedis.set("username","zhangsan");
//获取
String username = jedis.get("username");
System.out.println(username);
//可以使用setex()方法存储可以指定过期时间的 key value
jedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对
//3. 关闭连接
jedis.close();
- 哈希类型 hash:map格式 hset/hget/hgetAll
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// 存储hash
jedis.hset("user","name","lisi");
jedis.hset("user","age","23");
jedis.hset("user","gender","female");
// 获取hash
String name = jedis.hget("user", "name");
System.out.println(name);
// 获取hash的所有map中的数据
Map<String, String> user = jedis.hgetAll("user");
// keyset
Set<String> keySet = user.keySet();
for (String key : keySet) {
//获取value
String value = user.get(key);
System.out.println(key + ":" + value);
}
//3. 关闭连接
jedis.close();
- 列表类型 list : linkedlist格式,支持重复元素
lpush / rpush
lpop / rpop
lrange start end : 范围获取
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// list 存储
jedis.lpush("mylist","a","b","c");//从左边存
jedis.rpush("mylist","a","b","c");//从右边存
// list 范围获取
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
// list 弹出
String element1 = jedis.lpop("mylist");//c
System.out.println(element1);
String element2 = jedis.rpop("mylist");//c
System.out.println(element2);
// list 范围获取
List<String> mylist2 = jedis.lrange("mylist", 0, -1);
System.out.println(mylist2);
//3. 关闭连接
jedis.close();
- 集合类型 set : 不允许重复元素
sadd
smembers:获取所有元素
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// set 存储
jedis.sadd("myset","java","php","c++");
// set 获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
//3. 关闭连接
jedis.close();
- 有序集合类型 sortedset:不允许重复元素,且元素有顺序
zadd
zrange
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// sortedset 存储
jedis.zadd("mysortedset",3,"亚瑟");
jedis.zadd("mysortedset",30,"后裔");
jedis.zadd("mysortedset",55,"孙悟空");
// sortedset 获取
Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
System.out.println(mysortedset);
//3. 关闭连接
jedis.close();
三、实例演示
完成一个手机验证码登录功能:
- 输入手机号,点击发送后随机生成6位数字码,2分钟有效
- 输入验证码,点击验证,返回成功或失败
- 每个手机号每天只能输入3次
import java.util.Objects;
import java.util.Random;
import redis.clients.jedis.Jedis;
public class PhoneCode {
public static void main(String[] args) {
// verifyCode("123456789123");
getRedisCode("123456789123","583692");
}
//3-验证码校验
public static void getRedisCode(String phone, String code) {
Jedis jedis = new Jedis("192.168.176.128", 6379);
//验证码key
String codeKey = "OneDayVerifyCode" + phone + ":code";
String redisCode = jedis.get(codeKey);
//判断
if (code.equals(redisCode)) {
System.out.println("成功!!!");
} else {
System.out.println("失败!!!");
}
jedis.close();
}
//2-每个手机每天只能发送三次,验证码放到redis中,设置过期时间120
public static void verifyCode(String phone) {
Jedis jedis = new Jedis("192.168.176.128", 6379);
//拼接key
//手机发送次数key
String countKey = "OneDayVerifyCode" + phone + ":count";
//验证码key
String codetKey = "OneDayVerifyCode" + phone + ":code";
String count = jedis.get(countKey);
if (Objects.isNull(count)) {
//没有发送次数,第一次发送
//设置发送次数是1
//发送次数过期时间为1天
jedis.setex(countKey, 24 * 60 * 60, "1");
} else if (Integer.parseInt(count) <= 2) {
jedis.incr(countKey);
} else {
System.out.println("今天已经发送3次了,不能再发送了!!!");
jedis.close();
return;
}
//发送验证码放到redis里面
String vcode = getCode();
jedis.setex(codetKey, 2 * 60, vcode);
jedis.close();
}
//1-生成6位数字验证码
public static String getCode() {
Random random = new Random();
StringBuilder code = new StringBuilder();
for (int i = 0; i < 6; i++) {
code.append(random.nextInt(10));
}
return code.toString();
}
}