• Redis学习笔记:Jedis


    1,Jedis是什么

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

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

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

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

     <dependency>
           <groupId>redis.clientsgroupId>
           <artifactId>jedisartifactId>
           <version>3.3.0version>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ②创建包和类进行测试

    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可能存在的问题:

    为了保证以上程序可以正常运行,需要提前在服务器上的redis目录中的redis.conf文件进行修改。如下图:
    在这里插入图片描述

    修改完成后,重启redis服务。

    service redis restart   重启redis服务
    
    • 1

    然后需要继续进行修改:

    • 如果使用虚拟机做服务器,可以先通过 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();
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

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

    • 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();
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    • 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();
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    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();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
  • 相关阅读:
    【Python脚本进阶】2.4、conficker蠕虫(上):Metasploit攻击Windows SMB服务
    列存在 OceanBase 数据库架构中的应用与演进
    计算空间物体包围球的两种算法实现
    Qt 读写文件(QFile&QTextStream&QDataStream) 详解
    磁盘空间:谁占用空间看的一清二楚 - dust
    操作符前提:各种进制与各种码(计算机基础)
    视频画面添加图片,这个方法分享给你
    爬网神器组
    精确线搜索步长+下降方向
    能源企业如何构建网络安全体系?8月18日实战专家在线分享破局之道
  • 原文地址:https://blog.csdn.net/qq_46370017/article/details/126279941