Redis6学习笔记【part4】Jedis-API与手机验证码功能实现

news2024/11/18 14:23:50

1.连接 Jedis

第一步,修改 redis 的配置,以允许外网 ip 访问 redis。

在 redis.conf 中注释掉 bind 127.0.0.1 ,并修改 protected-mode no 。

第二步,导入依赖。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>

第三步,创建测试程序,测试连通性。

    @Test
    public void jedis_test(){
        Jedis jedis = new Jedis("hadoop100",6379);
        String pong = jedis.ping();
        System.out.println(pong);
        jedis.close();
    }

	//返回 PONG,代表成功连通。

注:记得禁用 Linux 的防火墙,否则 ping不通。在 Linux(CentOS7) 里执行命令systemctl stop firewalld.servicesystemctl disable firewalld.service


2.用 Jedis-API 操作相关数据类型

① Key

    @Test
    public void test_String(){
        Jedis jedis = new Jedis("hadoop100",6379);
        //获取key对应的值
        System.out.println(jedis.get("k1"));
        //获取所有key
        Set<String> keys = jedis.keys("*");
        //输出key的数量
        System.out.println(keys.size());
        //判断key存不存在
        System.out.println(jedis.exists("k1"));
        //获取key的ttl值
        System.out.println(jedis.ttl("k1"));
     }

② String

    @Test
    public void test_String(){
        Jedis jedis = new Jedis("hadoop100",6379);
        //一次放一个
        jedis.set("k1","v1");
        jedis.set("k2","v2");
        jedis.set("k3","v3");

        //一次放多个
        jedis.mset("str1","v1","str2","v2","str3","v3");
        //批量获取key对应的值
        System.out.println(jedis.mget("str1","str2","str3"));
    }

③ List

    @Test
    public void test_List(){
        Jedis jedis = new Jedis("hadoop100",6379);
        //放入list类型的键值对,一个键可以放入多个值
        jedis.lpush("list","v1","v2","v3","v4");
        //获取list的全部值
        List<String> list = jedis.lrange("list", 0, -1);
        for (String str : list) {
            System.out.println(str);
        }
    }

④ Set

    @Test
    public void test_Set(){
        Jedis jedis = new Jedis("hadoop100",6379);
        //将一个或多个 member 元素加入到集合 key 中
        jedis.sadd("orders","order01");
        jedis.sadd("orders","order02");
        jedis.sadd("orders","order03");
        jedis.sadd("orders","order04");
        //取出该集合的所有值
        Set<String> smembers = jedis.smembers("orders");
        for (String order : smembers) {
            System.out.println(order);
        }
        //删除集合中的某个元素
        jedis.srem("orders","order04");

    }

⑤ Hash

    @Test
    public void test_Hash(){
        Jedis jedis = new Jedis("hadoop100",6379);
        //给集合中的键赋值
        jedis.hset("hash1","userName","parker");
        //从集合取出value
        System.out.println(jedis.hget("hash1","userName"));

        //用map来给集合中的键赋值
        Map<String,String> map = new HashMap<>();
        map.put("name","parker");
        map.put("number","7");
        map.put("age","20");
        jedis.hmset("hash2",map);
        //以map形式从集合取出value
        List<String> result = jedis.hmget("hash2", "name", "number");
        for (String element : result) {
            System.out.println(element);
        }
    }

⑥ Zset

    @Test
    public void test_Zset(){
        Jedis jedis = new Jedis("hadoop100",6379);
        //将一个或多个 member 元素及其 score 值加入到有序集 key 当中
        jedis.zadd("animalSet",100d,"pig");
        jedis.zadd("animalSet",200d,"dog");
        jedis.zadd("animalSet",300d,"cat");
        jedis.zadd("animalSet",500d,"rabbit");
        //获取key对应有序集合的所有值
        Set<String> animals = jedis.zrange("animalSet", 0, -1);
        for (String animal : animals) {
            System.out.println(animal);
        }
    }

3.Redis + Jedis 实现手机验证码功能

需求分析:

1、输入手机号,点击发送后随机生成6位数字码,2分钟有效

2、输入验证码,点击验证,返回成功或失败

3、每个手机号每天只能输入3次

代码实现:

第一步,生成一个6位数字码。

    //1.生成一个6位数字码
    public static String getCode() {
        Random random = new Random();
        String code = "";
        for (int i = 0; i < 6; i++) {
            int rand = random.nextInt(10);
            code += rand;
        }
        return code;
    }a

第二步,发送验证码。

    //2.每个手机每天只能发送三次,验证码放入redis中,并设置过期时间
    public static void sendCode(String phone){
        //连接redis
        Jedis jedis = new Jedis("hadoop100",6379);

        //创建key
        //①手机发送次数key
        String countKey = "PhoneCode"+phone+":count";
        //②验证码key
        String codeKey = "PhoneCode"+phone+":code";

        //每个手机每天只能发送三次
        String count = jedis.get(countKey);
        if(count == null){  //没有发送次数,第一次发送
            //设置发送次数为1
            jedis.set(countKey,"1");
        }else if(Integer.parseInt(count) <= 2){
            //发送次数+1
            jedis.incr(countKey);
        }else if(Integer.parseInt(count) > 2){
            //发送满3次,不能再发送
            System.out.println("今天发送次数已经超过三次,不能再发送");
            //关闭redis
            jedis.close();
            return;
        }

        //发送验证码并放到redis里
        String vcode = getCode();
        jedis.setex(codeKey,60*60*24,vcode);
        jedis.close();

        System.out.println("成功发送");
    }

第三步,校验验证码。

    //3.验证码校验
    public static void verifyCode(String phone,String code){
        //从redis获取验证码
        Jedis jedis = new Jedis("hadoop100",6379);

        //创建手机发送次数key
        String codeKey = "PhoneCode"+phone+":code:";
        String redisCode = jedis.get(codeKey);
        if(redisCode.equals(codeKey)){
            System.out.println("验证成功");
        }else {
            System.out.println("验证失败");
        }
    }

第四步,模拟发送手机验证码。

public class PhoneCode {
    public static void main(String[] args) {
        //模拟验证码发送
        sendCode("13812345678");
        sendCode("13812345678");
        sendCode("13812345678");
        sendCode("13812345678");
    }
}

打印结果如下:

成功发送
成功发送
成功发送
今天发送次数已经超过三次,不能再发送

查看 redis,可以知道验证码为387393。

在这里插入图片描述

第五步,模拟校验验证码。

public class PhoneCode {
    public static void main(String[] args) {
        //模拟校验验证码
        verifyCode("13812345678","387393");
        verifyCode("13812345678","387396");
    }
}

打印结果如下

验证成功
验证失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 进阶 之 资源文件夹下资源名的重名检查,并简单生产资源表的方法整理

Unity 进阶 之 资源文件夹下资源名的重名检查,并简单生产资源表的方法整理 目录 Unity 进阶 之 资源文件夹下资源名的重名检查,并简单生产资源表的方法整理 一、简单介绍 二、简单实现过程 三、关键代码 一、简单介绍 Unity中的一些知识点整理。 本节简单介绍在Unity开发…

python使用sentinelsat库下载sentinel影像数据

GIS遥感不分家&#xff0c;最近开始找一些影像的下载脚本了&#xff0c;这两天搞定了哨兵和modis的&#xff0c;分别贴一下 鉴于《Python中使用sentinelsat包自动下载Sentinel系列数据》这篇文章已经写得非常全乎&#xff0c;这里就简单补充一下&#xff0c;放个最简单的下载脚…

Vue CLI(Vue.js 开发的标准工具)

Vue CLI&#xff08;Vue.js 开发的标准工具&#xff09;参考描述Vue CLI获取检测项目创建项目Please pick a presetCheck the features needed for your projectChoose a version of Vue.jsPrefer placing configSave this as a preset for future projects?Save preset asFin…

[MRCTF2020]Ezaudit(随机数的安全)

目录 信息收集 代码审计 相关函数 前提知识 思路分析 补充知识 信息收集 查看源代码没有发现有用信息&#xff0c;尝试dirmap扫下目录 python3 dirmap.py -i 网址 -lcf 扫描时发现一个www.zip目录 下载到一份index.php文件&#xff0c;找到一个login.html <?php h…

docker安装pg数据库及pg数据库基本操作

一、首先准备pg数据库的docker镜像二、先创建一个文件作为pg数据库数据文件、配置文件等的外部挂载文件三、创建镜像docker run -it -d --name postgres14 --restartalways --privilegedtrue -p 5432:5432 -e POSTGRES_PASSWORDpostgres -v /home/fengyang/pg_data:/var/lib/po…

SpringBoot+VUE前后端分离项目学习笔记 - 【25 SpringBoot实现1对1、1对多、多对多关联查询】

新增课程Course页面&#xff0c;实现学生选课功能、课程教授老师选择等功能 1. 课程与授课老师是一对一关系 因为course表仅记录了teacherid&#xff0c;而页面需要的是老师的名字 select course.*,sys_user.id from course left join sys_user **on ** course.teacher_id sys…

第六章SpringFramework之声明事务

文章目录JdbcTemplate准备工作导入依赖创建jdbc.properties配置Spring的配置文件配置测试类的环境实例声明式事务概念先看看对应的编程式事务声明式事务通过一个案例了解声明式事务前提准备三层架构的构建模拟场景的情况添加事务Spring声明式事务的属性事务注解标识的位置事务属…

手把手教你学51单片机-点亮你的LED

单片机内部资源 Flash——程序存储空间。对于单片机来说 Flash 最大的意义是断电后数据 不丢失。 RAM——数据存储空间。RAM 是单片机的数据存储空间,用来存储程序运行过程中产生的和需要的数据,关电后数据丢失 SFR——特殊功能寄存器。通过对特殊工程寄存器读写操作,可以…

循环语句(循环结构)——“C”

各位CSDN的uu们好呀&#xff0c;我又来啦&#xff0c;今天&#xff0c;小雅兰给大家介绍的是一个知识点&#xff0c;就是循环语句啦&#xff0c;包括while循环、do-while循环、for循环&#xff0c;话不多说&#xff0c;让我们一起进入循环结构的世界吧 首先&#xff0c;我们先来…

利用Python暴力破解邻居家WiFi密码

如觉得博主文章写的不错或对你有所帮助的话&#xff0c;还望大家多多支持呀&#xff01;关注、点赞、收藏、评论。 文章目录一、编写代码二、展示测试结果三、测试四、生成密码本&#xff08;建议自己找一个密码本&#xff09;一、编写代码 在桌面新建一个文件 如果你新建的文…

如何实现everything的http外网访问

Everything是voidtools开发的一款文件搜索工具&#xff0c;官网描述为“基于名称快速定位文件和文件夹。”可以实现快速文件索引、快速搜索、最小资源使用、便于文件分享等功能。 everything部署本地后&#xff0c;可以开启配置Http访问功能&#xff0c;这样在局域网内就可以直…

【自用】Git日常开发教程

因为经常容易忘记指令&#xff08;年纪大了&#xff09;&#xff0c;所以打算记录一下将一堆文件从vscode上传到GitHub仓库 目录软件下载初始化状态过程可能出现的错误其他操作参考资料软件下载 https://gitforwindows.org/ https://code.visualstudio.com/ 初始化状态 过程 …

上海亚商投顾:两市缩量微涨,数字经济概念全线走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日缩量震荡&#xff0c;黄白二线有所分化&#xff0c;题材概念表现活跃。数字经济概念全线走强&#xff0…

8、MariaDB11数据库安装初始化密码

MariaDB11安装 安装前准备 下载安装包 点我去MariaDB官网下载安装包 查看相关文档 Mariadb Server官方文档 使用zip安装 解压缩zip 将下载到的zip解压缩到想安装的位置。 生成data目录 打开cmd并进入到刚才解压后的bin目录&#xff0c; 执行mysql_install_db.exe程序生…

Flowable进阶学习(二)流程部署的深入解析

文章目录一、流程部署涉及表及其结构1. 部署流程代码示例&#xff1a;2. 流程部署所涉及表&#xff1a;3. 流程部署涉及表的结构、字段解析二、流程部署中数据的存储的过程一、流程部署涉及表及其结构 1. 部署流程代码示例&#xff1a; 设计俩个流程&#xff0c;并压缩成zip包…

项目引入多类数据源依赖,MyBatisPlus 是如何确定使用哪种数据源的?

背景 壬寅年腊月廿八&#xff0c;坚守在工作岗位。看了一下项目的 pom.xml 依赖&#xff0c;发现了好几个数据库连接相关的包&#xff0c;有 commons-dbcp2、c3p0、hikaricp、druid-spring-boot-starter&#xff0c;这可是四种不同的数据库连接池呢&#xff0c;一个项目中引入…

Github访问办法

GitHub GitHub是为开发者提供Git仓库的托管服务。这是一个让开发者与朋友、同事、同学及陌生人共享代码的完美场所。 GitHub除提供Git仓库的托管服务外&#xff0c;还为开发者或团队提供了一系列功能&#xff0c;帮助其高效率、高品质地进行代码编写。 GitHub的创始人之一Chr…

使用GPIO模拟I2C的驱动程序分析

使用GPIO模拟I2C的驱动程序分析 文章目录使用GPIO模拟I2C的驱动程序分析参考资料&#xff1a;一、回顾I2C协议1.1 硬件连接1.3 协议细节二、 使用GPIO模拟I2C的要点三、 驱动程序分析3.1 平台总线设备驱动模型3.2 设备树3.3 驱动程序分析1. I2C-GPIO驱动层次2. 传输函数分析四、…

SQL注入简介与原理

数据来源 本文仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 SQL注入 首先从SQL注入存在的代码来看 假如这里的id没有过滤&#xff0c;我们就可以输入…

JDK7-hashmap源码

解决冲突的方法 提高效率 特殊情况扰动算法 当冲突大于一定量时需要扩容 在JDK1.7中&#xff0c;HashMap是由数组单向链表实现的&#xff0c;原理图如下&#xff1a; HashMap基本用法 public static void main(String[] args) {//key-value, 数组存储头指针的引用地址&#xf…