Jedis是Redis的一个客户端工具,
Jedis即用Java操作Redis。
(类比,概念JDBC是使用Java操作数据库)
①创建一个maven工程,导入Jedis相关依赖
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>3.3.0version>
dependency>
②创建包和类进行测试
public static void main(String[] args) {
//创建Jedis对象进行连接,若使用两个参数的构造器,则第一个参数是主机ip,第二个参数是端口号
Jedis jedis = new Jedis("47.116.4.200",6379);
//可以测试是否连接成功
jedis.auth("******"); //如果你的redis设置了密码,需要调用auth方法进行授权
String value = jedis.ping();
System.out.println(value); //Redis中如果能够ping通,会返回一个pong
jedis.close();
}
可能存在的问题:
为了保证以上程序可以正常运行,需要提前在服务器上的redis目录中的redis.conf文件进行修改。如下图:

修改完成后,重启redis服务。
service redis restart 重启redis服务
然后需要继续进行修改:


配置完成后,再次运行程序即可成功。

我们之前在shell里面使用命令行操作Redis的命令,在java程序中都能用相应的同名方法等进行操作。
演示:获取所有的key(对应命令:keys *)
@Test
public void demo(){
Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
//添加值
jedis.set("name","luccy");
//获取值
String name = jedis.get("name");
System.out.println(name); //返回name对应的value值:luccy
jedis.ttl("name");
System.out.println(name1); //没有设置过期时间,返回-1则说明永不过期
Set<String> keys = jedis.keys("*"); //得到Redis中所有的key。返回set集合
//遍历显示Set集合
for(String key:keys){
System.out.println(key); //此时有一个key(即name)
}
jedis.close();
}

有很多方法和命令一一对应,如:
演示:mset同时设置一个或多个键值对,mget同时获取一个或多个value
@Test
public void demo(){
Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
jedis.mset("k1","v1","k2","v2"); //此处同时设置了两对key-value
List<String> mget = jedis.mget("k1", "k2");
System.out.println(mget); //输出此集合
jedis.close();
}

注:list单键多值
演示:rpush从右边添加
@Test
public void demo(){
Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
jedis.rpush("key1","lucy","marry","jack"); //从右添加
List<String> values = jedis.lrange("key1", 0, -1);//0到-1表示把所有值都取出来。返回list集合
System.out.println(values);在
jedis.close();
}

注:set集合中元素不可以重复
演示:set集合的添加数据(sadd),查看数据(smembers),删除数据(srem)
@Test
public void demo(){
Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
jedis.sadd("class","jack","Tom","Green"); //添加
jedis.srem("class","Green"); //删除
Set<String> aClass = jedis.smembers("class"); //查询
System.out.println(aClass);
jedis.close();
}

演示:hash的添加(hset)和查询(hget)
@Test
public void demo(){
Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
jedis.hset("users","age","20"); //添加
String hget = jedis.hget("users", "age"); //查询
System.out.println(hget);
jedis.close();
}

演示zset的添加元素操作(zadd)
@Test
public void demo(){
Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
jedis.zadd("language",100d,"java"); //此处的第二个参数100为double类型。java的score为100.0
Set<String> language = jedis.zrange("language", 0, -1);
System.out.println(language);
jedis.close();
}

通过案例进一步感受Jedis相关操作
完成一个手机验证码功能
要求:

梳理设计思路:
代码实现:
public class PhoneCode {
public static void main(String[] args) {
//模拟发送验证码的功能
verifyCode("15610109385");
getRedisCode("15610109385","932924"); //redis中的验证码和输入的验证码(932924)进行对比
}
//方法一:随机生成六位验证码的方法
public static String getCode(){
Random random = new Random();
String code="";
for(int i=0;i<6;i++){
int rand = random.nextInt(10);//表示生成10以内的值
code+=rand;
}
return code;
}
//方法二:让每个手机号每天只能发送三次;验证码放到Redis中;设置过期时间
public static void verifyCode(String phone){
Jedis jedis = new Jedis("47.116.4.200",6379); //连接Redis
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
//可以把手机号的发送次数放到一个key中(countKey);验证码放到另外一个key(codeKey)中
//拼接key
String countKey="VerifyCode"+phone+":count";
String codeKey="VerifyCode"+phone+":code";
//每个手机每天只能发送三次,count用于计数
String count = jedis.get("countKey");
if (count==null){ //key为空,说明一次也没有发送过。
//setex:可以在设置键值的同时,设置过期时间
jedis.setex(countKey,24*60*60,"1"); //第二个参数表示一天后过期。第三个参数说明是第一次发送消息
}else if(Integer.parseInt(count)<=2){ //注意count为String类型,需要转为integer或int类型。此为第二次或第三次发送
jedis.incr(countKey); //发送次数加一
}else if(Integer.parseInt(count)>2){
//已经发送了三次,不再进行发送
System.out.println("今天的发送次数已经用完了!!!");
jedis.close();
return; //此处加上return,如果发送超过三次。验证码不发送,且不再存入Redis,否则发送到验证码还会存到Redis
}
//发送的验证码需要放到Redis中去
String vcode = getCode();
jedis.setex(codeKey,120,vcode); //120s(2分钟)为过期时间,vcode为value值
jedis.close();
}
//方法三:验证码的校验功能
public static void getRedisCode(String phone,String code){ //第二个参数code代表用户输入的验证码
//先从redis中获取验证码
Jedis jedis = new Jedis("47.116.4.200",6379); //连接Redis
jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权
String codeKey="VerifyCode"+phone+":count";
String redisCode = jedis.get(codeKey); //得到Redis中的验证码
if (redisCode.equals(code)){
System.out.println("校验成功");
}else{
System.out.println("校验失败");
}
jedis.close();
}
}