Redis

PHP实现对短信验证码发送次数的限制(防机刷验证码)

本秂侑毒 提交于 2020-10-27 16:54:36
场景 在注册,修改密码,找回密码等场景里,我们都会遇到发送手机短信进行验证码验证,我们都知道,手机的这个短信接口是需要购买了,为了防刷,我们就会对短信验证码发送次数的限制,我们应该如何防止呢? 很多人都会这样做:对用户获取短信验证码的手机号、ip、和浏览器(使用唯一标识)进行限制。 本文介绍的方法是对用户每天只能通过同一浏览器或同一ip地址获取验证码10次或者同一手机号只能获取3次短信验证码,三种限制为“或”关系,一条超限就不发验证码。方法是通过在服务器端将用户的手机号、ip、ur_r标识记录并写入文件,再通过读取文件记录判断用户请求发送验证码的次数来做限制。 方法如下: 这里是获取短信验证码页面: <!DOCTYPE html> < html > < head ></ head > < body > <!-- 隐藏表单uv_r标识,用于对获取验证码的浏览器进行限制,唯一标识存储于浏览器cookie中。在用户进行获取短信验证码操作时将标识传入后台代码(可以通过js传入后台,此处未提供js代码) --> < input type = "hidden" name = "uv_r" value = "" id = "uv_r" > </ body > < script type = ”text/javascript” > /* 使用js获取cookie中ur_r唯一标识,如果不存在

为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

青春壹個敷衍的年華 提交于 2020-10-27 16:47:21
B-树由来 定义:B-树是一类树,包括B-树、B+树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。B-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。 先来看看为什么会出现B-树这类数据结构。 传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。那么我们如何提高程序性能?减少磁盘 IO 次数,像 AVL 树,红黑树这类平衡二叉树从设计上无法“迎合”磁盘。 关于磁盘可参考 浅谈计算机中的存储模型(四)磁盘 上图是一颗简单的平衡二叉树,平衡二叉树是通过旋转来保持平衡的,而旋转是对整棵树的操作,若部分加载到内存中则无法完成旋转操作。其次平衡二叉树的高度相对较大为 log n(底数为2),这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),所以这类平衡二叉树在数据库和文件系统上的选择就被 pass 了。

面试竟被问到Redis事务,触及知识盲区,脸都绿了

徘徊边缘 提交于 2020-10-27 14:05:03
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者丨黎杜 来源丨非科班的科班 前言 前几天有读者说自己面试被问到Redis的事务,虽然不常用,但是面试竟然被问到,平时自己没有注意Redis的事务这一块,面试的时候被问到非常不好受。 虽然,这位读者面试最后算是过了,但是薪资方面没有拿到自己理想的薪资。 其实这个也是正常的,一般面试被问到烂大街的,谁还问你啊,专门挑一些不常见的来问你,就是为了压你的薪资。 所以在这里写一篇文章对Redis的事务进行详细的讲解,估计对Redis事务从理解到原理深入这一篇就够了。 以后面试都不用担心了再被问道Redis的事务了,这一篇主要讲解Redis事务原理和实操的演练,理解理论的同时也通过实操来证实理论。 事务介绍 Redis事务是一组命令的集合,将多个命令进行打包,然后这些命令会被顺序的添加到队列中,并且按顺序的执行这些命令。 「Redis事务中没有像Mysql关系型数据库事务隔离级别的概念,不能保证原子性操作,也没有像Mysql那样执行事务失败会进行回滚操作」 。 这个与Redis的特点: 「快速、高效」 有着密切的关联, 「因为一些列回滚操作、像事务隔离级别那这样加锁、解锁,是非常消耗性能的」 。所以

2020-10-25

这一生的挚爱 提交于 2020-10-27 14:03:11
Redis系列 - 单线程的Redis为什么那么快? Redis为什么使用单线程? 在说这个问题之前我们先来了解下引入多线程常见的开销: 1. 上下文切换: 即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程时同时执行的,时间片一般是几十毫秒(ms)。 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态, 从任务保存到再加载的过程就是一次上下文切换 。 当一个新的线程被切换进来,它所需要的数据可能不在当前处理器的本地缓存中,因此上下文切换将导致一些缓存缺失,因而线程在首次调度运行时会更加缓慢。这也是为什么调度器为每个可运行的线程分配一个最小执行时间。 2. 内存同步 内存的可见性问题,这里不过多介绍。 3. 阻塞: 访问共享资源时需要加锁保证数据安全,当在锁上发生竞争时,竞争失败的线程会被阻塞。 通常情况下,在我们采用多线程后,如果没有良好的系统设计,实际得到的结果,其实是右图所展示的那样。我们刚开始增加线程数时,系统吞吐率会增加,但是,再进一步增加线程时,系统吞吐率就增长迟缓了,有时甚至还会出现下降的情况。

告别 NPE,Optional 全网最全实战理解

孤者浪人 提交于 2020-10-27 08:31:40
1. 前言 相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过“防止 NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一。之前,Google Guava项目曾提出用Optional类来包装对象从而解决NullPointerException。受此影响,JDK8的类中也引入了Optional类,在新版的SpringData Jpa和Spring Redis Data中都已实现了对该方法的支持。我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常) 2. 初识Optional 首先我们看下面一段代码,肯定会很熟悉 public static String getFirstName(User user) { if(null == user) { return "Unkown"; } return student.getFirstName(); } 从上面看出,就是对这个实例是不是空做了判断,然后我们看下使用java8 的Optional类之后的代码 public static String getFirstName(User user) { return Optional

springsession源码分析

耗尽温柔 提交于 2020-10-27 04:55:21
springsession源码分析二之RedisHttpSessionConfiguration_jannal专栏-CSDN博客_redishttpsessionconfiguration https://blog.csdn.net/usagoole/article/details/80639804 spring-data-redis 关于订阅客户端不断创建新线程的问题 - 大饼酥 - 博客园 https://www.cnblogs.com/Mr-kevin/p/12029519.html Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程 - aoeiuv - 博客园 https://www.cnblogs.com/aoeiuv/p/9565617.html spring-session使用配置(分布式共享session配置) - 火光闪耀 - 博客园 https://www.cnblogs.com/qlong8807/p/5557271.html [Spring] spring-session + JedisPool 实现 session 共享 - Aviva_ye - 博客园 https://www.cnblogs.com/avivaye/p/4935137.html

egg项目:权限管理系统

十年热恋 提交于 2020-10-27 01:51:28
学习 egg.js时开发的后台权限管理系统:egg + redis + mysql。 除了权限管理外,也把接触过的各种插件都接入到了后台当中,如:egg-sequelize、egg-redis、egg-socket.io、egg-ueditor等 。 实现的功能有:权限管理、使用sequelize操作数据库,并连接多个库、通过socket.io获取redis订阅发布的消息、二维码生成和解析、文章编辑对ueditor编辑器接入、数据备份和下载等。感兴趣的可以看下 仓库地址: https://gitee.com/qqzhxl/egg-admin 来源: oschina 链接: https://my.oschina.net/qqzhxl/blog/4365859

Nice!有了这份Alibaba内部 “Java面试宝典”,跳槽面试稳了

你说的曾经没有我的故事 提交于 2020-10-26 23:20:11
怎样才能拿到大厂的offer,没有掌握绝对的技术,那么就要不断的学习 从疫情破局而出,又在毕业季一路过关斩将,我是如何笑面试官,拿到阿里,腾讯等多家大厂的offer的呢,在这里分享我的秘密武器, 大神整理的Java核心知识点,面试时面试官必问的知识点。 有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。 由于面试题比较全面,内容比较多,所以我分享的知识里面可能会有一些疏漏与杂乱,核心知识点都整理好了 下面会介绍这份Java面试宝典的主要内容涵盖的知识点,由于文章篇幅,所以只展示了截图内容,若需要完整pdf版, 帮忙点赞后,私信【性能调优】即可(一定要记得关注我,不然没办法回复陌生人私信) Java基础+集合+多线程+JVM Java基础 Java 基本功 Java 语法 数据类型 方法(函数) Java 面向对象 集合 多线程 文件与I/O流 Java集合 多线程 JVM 计算机基础 计算机网络 数据结构 算法 操作系统 数据库面试题总结 MySQL Redis 常用框架面试题总结 Spring面试题总结 MyBatis面试题总结 Kafka面试题总结 Netty 面试题总结 优质面经 五面阿里,终获offer 蚂蚁金服实习生面经总结

求收留,拒绝京东Offer之后的惨痛教训!

空扰寡人 提交于 2020-10-26 22:32:52
前言 前两个月小编好友拿下了 京东和华为的Offer ,当时一起聊了一下,犹豫再三好友选择去了华为,这一去, 连消息都没了 。 这两天好友又突然联系我了,向我各种诉苦,自从进了华为, 就没啥时间休息了,工作真特么辛苦! 身体上、心理上, 都是一种煎熬. 又遇上贸易战, 部门预算缩减, 裁员风声四起。 好友也是越说越上头,后悔当初没去京东。小编也是深表同情! 在这也将好友当初面试经历分享给大家吧! 京东一面(凉经) final finally finalize原理及使用场景 HashMap形成环的原因(需要从jdk7和jdk8角度答)? 多线程情况下,取HashMap中的某个键对应的值(比如{"1","2"}),多个线程可put() get(),请问什么时候get(1)为null? Hashmap如何保证key不重复 set如何保证不重复 concurrenthashmap原理 说说cas算法 Java中都有什么锁 synchronized实现原理、范围、如何用? spring事务传播 hibernate主键生成策略 mybatis 传参 Redis理解,常见数据结构 Redis平时是否有用,如何去使用? 用户登录信息的url 时间戳等信息存入一个Rrdis中,用户每点击一次页面就存放一次,请问如何利用Redis统计某个用户某段时间内点击了多少次?具体如何去实现? Redis使用场景

Java大文件分片上传/多线程上传解决方案

女生的网名这么多〃 提交于 2020-10-26 20:11:06
核心原理: 该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。 * 如何分片; * 如何合成一个文件; * 中断了从哪个分片开始。 如何分,利用强大的js库,来减轻我们的工作,市场上已经能有关于大文件分块的轮子,虽然程序员的天性曾迫使我重新造轮子。但是因为时间的关系还有工作的关系,我只能罢休了。最后我选择了百度的WebUploader来实现前端所需。 如何合,在合之前,我们还得先解决一个问题,我们如何区分分块所属那个文件的。刚开始的时候,我是采用了前端生成了唯一uuid来做文件的标志,在每个分片请求上带上。不过后来在做秒传的时候我放弃了,采用了Md5来维护分块和文件关系。 在服务端合并文件,和记录分块的问题,在这方面其实行业已经给了很好的解决方案了。参考迅雷,你会发现,每次下载中的时候,都会有两个文件,一个文件主体,另外一个就是文件临时文件,临时文件存储着每个分块对应字节位的状态。 这些都是需要前后端密切联系才能做好,前端需要根据固定大小对文件进行分片,并且请求中要带上分片序号和大小。前端发送请求顺利到达后台后,服务器只需要按照请求数据中给的分片序号和每片分块大小(分片大小是固定且一样的)算出开始位置,与读取到的文件片段数据,写入文件即可。 为了便于开发,我 将服务端的业务逻辑进行了如下划分,分成初始化