Redis学习笔记:Jedis

发布于:2023-01-21 ⋅ 阅读:(485) ⋅ 点赞:(0)

1,Jedis是什么

Jedis是Redis的一个客户端工具Jedis即用Java操作Redis。

(类比,概念JDBC是使用Java操作数据库)

2,Jedis的必要配置和简单演示

①创建一个maven工程,导入Jedis相关依赖

 <dependency>
       <groupId>redis.clients</groupId>
       <artifactId>jedis</artifactId>
       <version>3.3.0</version>
 </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服务

然后需要继续进行修改:

  • 如果使用虚拟机做服务器,可以先通过 systemctl status firewalld命令查看防火墙状态,如果防火墙是打开状态,需要使用systemctl stop firewalld命令对其进行临时关闭。
  • 如果使用了云服务器配合宝塔面板,需要先配置redis(默认端口为3306)的安全组,然后在宝塔面板的安全模块中放行redis端口号。如下图:
    在这里插入图片描述在这里插入图片描述

配置完成后,再次运行程序即可成功。
在这里插入图片描述


3,测试相关数据类型

我们之前在shell里面使用命令行操作Redis的命令,在java程序中都能用相应的同名方法等进行操作。

3.1,Jedis操作key

演示:获取所有的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();

    }

在这里插入图片描述

有很多方法和命令一一对应,如:

  • jedis.keys(“*”) 对应 keys *命令:查询所有的key
  • jedis.exists(“k1”) 对应exists key命令:判断某个key是否存在
  • jedis.ttl(“k1”) 对应 ttl key命令:查看还有多少秒过期
  • jedis.expire(String key,int second) 对应 expire key second命令:设置指定key的过期时间

3.2,Jedis操作字符串(string)

演示: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();

    }

在这里插入图片描述

  • jedis.set(“k1”, “v1”) 对应set key value命令:添加值
  • jedis.get(“k1”) 对应 get key命令:获取key对应的键值

3.3,Jedis操作列表(list)

注: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();

    }

在这里插入图片描述

3.4,Jedis操作集合(set)

注: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();
    }

在这里插入图片描述

3.5,Jedis操作哈希(hash)

演示: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();
    }

在这里插入图片描述

3.6,Jedis操作zset

演示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();
    }

在这里插入图片描述

4,Jedis应用案列:模拟验证码功能

通过案例进一步感受Jedis相关操作

完成一个手机验证码功能
要求:

  • 1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
  • 2、输入验证码,点击验证,返回成功或失败
  • 3、每个手机号每天只能输入3次

在这里插入图片描述
梳理设计思路:

  • 随机生成六位的数字验证码。可以使用Java中的Random类
  • 两分钟之内有效。可以把验证码放到Redis中去,同时设置过期时间(expire)
  • 判断验证码是否匹配。从Redis中取出验证码判断和输入的是与否一致即可
  • 每个手机号,每天只能输入三次。可以使用incrby操作每次发送之后计数值加一,计数值等于3的时候,就不可以再发送。

代码实现:

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();
    }
}

本文含有隐藏内容,请 开通VIP 后查看