一、Jedis简介

JDBC是通过Java操作数据库。Jedis是通过Java操作Redis。

二、测试连接Redis

  1. 要先将Redis配置文件中限制本机访问的两个位置配置一下。

jedis配置多个redistemplate redis jedis配置_验证码

bind 127.0.0.1 -::1 注释掉,再把 保护模式 设置为no,即可远程访问Redis。 还需要重启Redis。

  1. 创建一个Maven工程,引入Jedis的相关依赖。
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>
  1. 写一个测试类,测试是否能够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);
    }
}
  1. 启动测试类,测试是否ping得通。

已经配置好了,却还是失败了。是因为虚拟机有防火墙,需要将虚拟机的对应端口开放才行。

  1. 这里只是用虚拟机测试,没有安全问题,也仅仅是为了测试,所以直接暂时关闭防火墙。
  2. 再次测试

三、操作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);

四、实例

完成一个手机验证码功能

jedis配置多个redistemplate redis jedis配置_redis_02

  • 随机生成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("过期了");
        }
    }
}