redis(3)

news2024/11/17 11:28:20

redis客户端登陆:

redis-cli -h host -p port -a password

String类型的应用场景:

1)String通常用于保存单个字符串或者JSON格式的字符串数据

2)因为String类型通常是二进制安全的,因此你完全可以把一个图片内容当作字符串来进行存储

3)计数器,是常规的key-value缓存应用,常规计数,微博粉丝数

因为Incrby等指令本身就有原子操作的特性,所以我们完全可以利用redis的incr,incrby,decr,decrby等指令来实现原子计数的效果,假设说在某一种情况下3个客户端同时读取了num的值为1,那么这三个客户端同时针对num的值进行了+1的操作,那么最终这个num的值一定是5,不少网站都利用redis的这个特性来实现业务上的统计计数请求,不仅读写性能高,而且线程安全

Hash类型的应用场景:频繁对存储的对象进行增删改查

hash类型特别适用于存储对象数据,还常常用于存储一个对象或者是分布式session相比较于string类型而言,将一个对象存储到hash类型中要比存储在sring类型中要占用更少的内存空间,特别适用于存储对象的信息,还可以很方便的针对对象中的属性做增删改查,例如你要是用redis中的string类型来存储一个对象,那么就需要将JAVA中的Bean对象转化成一个JSON格式的字符串

key:product:user:1,value:对象的json格式字符串

上面的五个步骤不是一个原子操作,会产生线程安全问题 

hash是最接近于关系数据库结构的数据类型,我们可以将数据库中的一套记录或者是一个对象转化成HashMap存储在redis中,把用户ID当作是查找的key,存储的value对象包括姓名,年龄,生日等信息,如果使用普通的key-value进行存储,主要是有下面两种存储方式:

1)第一种方式就是将用户ID作为查找的key,将其他信息封装成一个对象以序列化的方式来进行存储,这种方式的缺点是,增加了序列化和反序列化的开销,并且需要修改其中一项信息的时候,就需要将整个对象进行访问并且修改操作需要对并发进行保护,引入线程安全问题

2)第二种方法就是将用户信息对象有多少个成员就存放多少个key-value键值对,使用用户ID+对应属性的名称作为唯一标识来取得最终属性的值,虽然省去了序列化开销和并发问题,但是用户ID重复进行存储,内存空间浪费很大

所以redis中的hash很好地解决了这个问题,redis中的hash实际上时内部存储的value作为一个HashMap,并且直接存储了这个Map成员的接口

手机验证码的操作:

1)用户在客户端发送手机号,点击发送之后随机生成四位验证码,有效期为60s,输入验证码点击验证,返回成功或者失败

2)当后端收到用户发送过来的手机号,首先要生成key值,形式为key=phone:number:手机号码

3)生成key值之后,我们会首先查询这个key是否在redis中存在,如果不存在,并针对key进行赋值,并且设置过期时间是60s,如果当前的key已经在redis中存在了,那么系统就直接进行提示,验证码已经发送还在有效期内,请打开手机查看验证码

Controller
@Slf4j
public class UserController {
    public  int GetRandomCode(){
        int code=(int)(Math.random()*10000);
        return code;
    }
    @Autowired
    private StringRedisTemplate template;
    @RequestMapping("/GetCode")
    @ResponseBody
    public Object GetCode(@RequestParam("PhoneNumber") String PhoneNumber){
        ValueOperations<String,String> options=template.opsForValue();
        //1.先生成验证码
        int RandomCode=GetRandomCode();
        //2.生成key
        String key="phone:code:"+PhoneNumber;
        //3.在redis中进行查询
        if(!template.hasKey(key)){
            String value= String.valueOf(RandomCode);
            options.set(key,value,60, TimeUnit.SECONDS);
            log.info("短信验证码已经存储到redis里面,验证码是",RandomCode);
            return "验证码已经发送成功,请查看手机";
        }else{
            return "发送吗之前已经发送过了,请耐心等待"+options.getOperations().getExpire(key);
        }

    }
}
@RequestMapping("/login")
    @ResponseBody
    public Object login(@RequestParam("PhoneNumber") String PhoneNumber) {
        ValueOperations<String,String> options=template.opsForValue();
        //1.先生成key值
        String key="phone:code:"+PhoneNumber;
        //2.查询key值在redis中是否存在
        if(template.hasKey(key)){
            //3.清空redis节省空间
            template.delete(key);
            return"手机号和验证码校验成功,登陆成功";
        }
        return "验证码错误或者手机号错误";
    }

4)为了防止用户恶意攻击,我们做出,每一个IP地址在5分钟内最多发送三次验证码,如果在5min内频繁发送验证码超过三次,那么直接给出相应的信息提示,并且直接索死用户12小时

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

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

相关文章

java错题总结(31-33页)

假定Base b new Derived&#xff08;&#xff09;; 调用执行_360笔试题_牛客网 ABDC 只要是被子类重写的方法&#xff0c;不被super调用都是调用子类方法 ------------------------------------------------------------------------------------------- --------…

【Linux】Linux安装Redis(图文解说详细版)

文章目录 前言第一步&#xff0c;下载安装包第二步&#xff0c;上传安装包到/opt下&#xff08;老规矩了&#xff0c;安装包在opt下&#xff09;第三步&#xff0c;解压安装包第四步&#xff0c;编译第五步&#xff0c;安装第六步&#xff0c;配置redis第七步&#xff0c;设置开…

Matplotlib 初使用

五一假期时候&#xff0c;我在自己的电脑上安装了 matplotlib 安装步骤请转至&#xff1a;matplotlib 安装介绍 现在&#xff0c;我终于可以在自己电脑上学习 matolotlib 数学绘图库了&#xff0c; 说终于两个字&#xff0c;是完全是在安装过程中确实历经了折磨&#xff0c;根…

基于AT89C51单片机的电子钟设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87759735?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 设计一个电子钟,实现对时、分、秒的显示的控制,电路采用24小时计时方式。另一个功能是秒表功能…

mysql : name like “%name“; 索引一定失效吗?

场景如下&#xff1a; MySQL版本如下&#xff1a; 表结构如下&#xff1a;索引结构如下&#xff1a; 查询语句以及执行计划如下&#xff1a; 第一条查询语句&#xff1a; select name from em where name like ‘%b’; 可以发现使用了name 字段创建的索引 第二条查询语句&…

02-Java基础编程

Java基础编程 Java 基础语法Java 标识符变量变量的类型Java 基本数据类型基本数据类型转换 运算符常见运算符运算符的优先级 程序流程控制分支语句循环结构常用的循环结构循环的嵌套break 和 continue 关键字 数组一维数组多维数组的使用Arrays 工具类的使用数组中常见的异常 J…

AcWing——方格迷宫(有点不一样的迷宫问题)

4943. 方格迷宫 - AcWing题库 1、题目 给定一个 n 行 m 列的方格矩阵。 行从上到下依次编号为 1∼n&#xff0c;列从左到右依次编号为 1∼m。 第 i 行第 j 列的方格表示为 (i,j)。 矩阵中的方格要么是空地&#xff08;用 . 表示&#xff09;&#xff0c;要么是陷阱&#xf…

前后端身份认证:session身份认证,JWT认证

文章目录 前后端身份认证1、概述2、不同开发模式下的身份认证3、关于HTTP协议的无状态性4、Cookie4.1 介绍4.2 cookie特点4.3 cookie分类4.4 Cookie在session身份认证中的作用4.5 Cookie不具有安全性 5、Session认证5.1 Session认证过程5.2 Session认证原理图5.3 Session认证的…

【Linux】多线程 --- 线程概念 控制 封装

从前种种&#xff0c;譬如昨日死。从后种种&#xff0c;往如今日生。 文章目录 一、线程概念1.重新理解用户级页表1.1 进程资源如何进行分配呢&#xff1f;&#xff08;地址空间页表&#xff09;1.2 虚拟地址如何转换到物理地址&#xff1f;&#xff08;页目录页表项&#xff0…

11 KVM虚拟机配置-配置虚拟设备(存储)

11 KVM虚拟机配置-配置虚拟设备(存储) 文章目录 11 KVM虚拟机配置-配置虚拟设备(存储)11.1 存储设备概述11.2 存储设备元素介绍11.3 存储设备配置示例 11.1 存储设备概述 虚拟机XML配置文件使用devices元素配置虚拟设备&#xff0c;包括存储设备、网络设备、总线、鼠标等。 X…

【LeetCode】494. 目标和

494. 目标和 思路 首先&#xff0c;将这道题想成 0-1背包问题&#xff0c;我们最终要输出的结果是最多的方法数&#xff0c;因此 dp 数组需要记录具体的方法数。 状态定义 按照 0-1 背包问题的套路&#xff0c;我们将状态定义为 &#xff1a;dp[i][j] &#xff0c;表示「前 …

YOLOv5测距+碰撞检测

YOLOv5测距碰撞检测 1. 相关配置2. 测距原理3. 标定和测距4. 碰撞检测4.1 相关代码4.2 主代码 5. 实验效果 相关链接 1. YOLOV5 单目测距&#xff08;python&#xff09; 2. YOLOV7 单目测距&#xff08;python&#xff09; 3. 具体实现效果已在Bilibili发布&#xff0c;点击…

string的介绍

string是c中表示字符串的字符串类&#xff0c;要使用需要包头文件&#xff1a;#include<string> 先了解一下string的一些信息 string看起来是一个类&#xff0c;但实际上是typedef的模板。 在cplusplus.com网站上&#xff0c;string的相关信息 模板的实例化结果有以下几个…

【unity小创意】相机的正反操作实现场景的二维跳跃

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

Spring的第十二阶段(01):Spring实现AOP的简单使用

1、使用Spring实现AOP简单切面编程 需要导入工程的jar包 Spring的核心包 spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jarSpring的测试包 spring-test-4.0.0.RELEASE.jarSpring日记相…

【网络安全】这套面试题,让你提前预判面试官的预判!

最近这个帖子的点赞和收藏变高起来了&#xff0c;许多小伙伴在问我安全大厂的面试题没有&#xff0c;我准备利用一些时间把这套面试宝典整理一下&#xff01; 今天有同学拿着他准备的面试问题清单给我看&#xff0c;看还有没有遗漏的&#xff0c;我看了下&#xff0c;觉得还是…

Spring-Bean管理-注解

组件注册 Component/Controller/Service/Repostory :注册自定义组件到容器中 加上约定的注解。 在Configuration注解的类中配置包扫描器 ComponentScan(vlaue "cn.shaoxiongdu") Configuration: 标注配置类 Scope &#xff1a; 配置是否为单实例 prototype: 多实…

JVM与GC

Java:跨平台的语言 write once, run anywhere JVM&#xff1a;跨语言的平台 Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的&#xff0c;它只关心“字节码”文件。 Java不是最强大的语言&#xff0c;但是JVM是最强大的虚拟机。 JVM的整体结构 这个架构…

Java基础学习(12)

Java基础学习 一、不可变集合二、Stream流2.1 Stream流数据添加2.2 Stream流的中间方法2.3 Stream终结方法 三、 方法引用3.1 方法引用的基本概念3.2 方法引用的分类3.2.1 引用静态方法 3.2.2 引用成员方法3.2.3 引用构造方法3.2.4 使用类名引用成员方法3.2.5 引用数组的构造方…

PyQt5 基础篇(一)-- 安装与环境配置

1 PyQt5 图形界面开发工具 Qt 库是跨平台的 C 库的集合&#xff0c;是最强大的 GUI 库之一&#xff0c;可以实现高级 API 来访问桌面和移动系统的各种服务。PyQt5 是一套 Python 绑定 Digia QT5 应用的框架。PyQt5 实现了一个 Python模块集&#xff0c;有 620 个类&#xff0c;…