redis数据库简介、redis下载及安装(win64位)、node操作redis、redis实现短信校验注册接口

redis简介:

1:内存数据库,同时也能够保存数据到磁盘;

2:比其他的内存数据库有着更多的数据类型:

列表,集合,排序集合,哈希表等;

3:主从结构:数据可以备份到从服务器;

4: Redis数据操作速度快;

5:所有的操作都是原子操作;

下载安装redis服务

redis和mysql一样,也是需要下载安装redis服务的,基本安装如下:

1.官网下载redis: https://redis.io , 进入官网点击download
在这里插入图片描述
2.Redis 在 Windows 上不受官方支持。但是,可以按照以下说明在 Windows 上安装 Redis 进行开发,要在 Windows 上安装 Redis,您首先需要启用WSL2(适用于 Linux 的 Windows 子系统)。WSL2 允许您在 Windows 上本地运行 Linux 二进制文件。要使此方法起作用,您需要运行 Windows 10 版本 2004 及更高版本或 Windows 11,相关教程:https://redis.io/docs/getting-started/installation/ ,这里我不采用此方式进行安装,我去到github上下载项目安装,github仓库地址: https://github.com/MSOpenTech/redis或https://github.com/microsoftarchive/redis

3.redis只提供了win64位版本,如果你的电脑是32位的你可以下载源码build成32位的,源码地址:https://github.com/microsoftarchive/redis,这里可以百度redis在win32位安装步骤。

4.我电脑和服务器是64位的,这里我直接下载别人build好的文件进行安装,点击如下红色箭头所指进入到文件下载页面:
在这里插入图片描述
5.进入release page后有两种选择,这里我选msi结尾配置好的安装包点击下载,将下载好的程序放到某个文件夹并以程序名新建一个文件夹(当然这里可以不用新建文件夹,我是方便打理,将所有服务软件装在同一个盘下的某个根文件夹下),之后双击箭头所指安装程序:
在这里插入图片描述6.同意协议并继续:
在这里插入图片描述
7.这里我更改安装目录并将path环境变量自动配置,之后点击next,如:
在这里插入图片描述
8.配置端口号和配置防火墙,这里我采用默认,当然上线项目可以更改默认端口号,如:
在这里插入图片描述
9.默认是不勾选内存限制的,这里我勾选了内存限制,并限制最大存100Mb数据,当然可以不勾选,后面可以在配置文件自行配置:
在这里插入图片描述
10.最后点击install进行安装,如:
在这里插入图片描述
11.此时电脑可能会弹框提示点击(是允许)即可,最后点击finish完成安装
在这里插入图片描述
12.安装完成后我一般会将安装程序删除,保留服务程序即可,如:
在这里插入图片描述
13.进入到安装包根目录下,打开箭头所指doc文档可看到对各个文件的基本介绍,如:
在这里插入图片描述
14.还需要了解下面三个文件,其中redis.windows.conf文件是可编辑的,是对redis服务的配置信息,里面可以设置端口、内存大小限制等,如
在这里插入图片描述
配置文件某些参数说明:

# 配置端口:
port 6379
# 
tcp-backlog 511
# 只允许某些ip可以访问,可以避免攻击,默认是不打开的,这里我自己打开了
bind 127.0.0.1
# 
timeout 0
# 
tcp-keepalive 0
# 
loglevel notice
# 配置日志打印文件地址,如果没有指定路径就会打印到控制台
logfile ""
# 数据库数量配置,redis数据库数量不像mysql可以任意添加,redis只能通过配置的方式指定,redis服务启动后就会生成指定数量的数据库,redis数据库是以数字自动命名的,默认使用第一个数据库,即索引为0的数据库
databases 16
# 备份数据到磁盘 ,save 时间间隔 变化键数量 ,表示多少秒后有几个键被修改时才会备份,时间没到是不会备份的
save 900 1
save 300 10
save 60 10000
# 
stop-writes-on-bgsave-error yes
# 当某些数据被保存到磁盘中时是否进行压缩,压缩可节省控件但是不利于cpu
rdbcompression yes
# 
rdbchecksum yes
# 保存到磁盘数据文件的名称,数据保存到磁盘后,每次使用数据时会从磁盘中读取,可以提升速度
dbfilename dump.rdb
# 保存到磁盘文件的路径
dir ./
# 
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
#
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

15.我们此时可以Win+R启动命令行并在命令行启动redis服务,这里为了方便我写一个以bat结尾的启动脚本(start_redis_server.bat)双击进行启动,start_redis_server.bat启动脚本代码为:

redis-server.exe redis.windows.conf

16.此时我们双击start_redis_server.bat文件可以看到黑窗口一闪而过,之后到服务中可以看到redis服务已经运行!
在这里插入图片描述
17.启动redis客户端,此时可以双击redis-cli.exe,就会启动一个以127.0.0.1:6379的客户端,此时可以在此窗口进行数据增删改查等操作,通常情况下我会写一个bat结尾的程序(redis_client.bat)来指定ip和端口来连接到远程服务器上,连接到远程服务器脚本,redis_client.bat脚本如下(实际中写服务器ip和port即可):

redis-cli.exe -h 127.0.0.1 -p 6379

设置redis密码

1.通过以上安装redis可以知道基本的启动连接redis,可以发现和安装mysql不一样的是没有输入密码,这是因为redis默认是不需要密码的,当然可以自己设置密码,其命令为(注意严格大小写):

CONFIG set requirepass '你自己的密码'

在这里插入图片描述
2.密码验证:当设置完密码退出客户端并重新进入后,无密码验证操作redis时会提示无法操作,此时可以进行密码验证(每次进入客户端只需要验证一次就可以),密码验证命令(注意大小写):如

AUTH '你的密码'

在这里插入图片描述
3.密码失效时间,当关闭redis服务后,再次进入redis服务时密码就会失效。

终端操作redis数据库:

1.以key-value的方式操作数据:

//存数据:set key value ,如果key相同的话,后面的value会覆盖前面相同的key的值 如:set name '小明'
//读数据:get key 如:get name
//判断数据是否存在:exists key 如: exists name
//删除数据:del key  如:del name

2.以哈希表的形式操作数据库:

//存数据: hmset key(主键) 字段1 值1 字段2 值2 ,如: hmset user_1 name '小明' age 18
//查某个key下所有字段数据: hgetallkey key 如:hgetall user_1 
//查某个key下某个字段是否存在:hexists key 字段 如:hexists user_1 name
//查某个key下某个字段的值:hget key 字段 或 hmget key 字段 如:hget user_1 name 或 hmget user_1 name
//查某个key下所有字段:hkeys key 如 :hkeys user_1

3.列表形式操作数据库:

列表类似数组,每个key表示一个数组,如下:

//往数组左边(前面)存数据:lpush key value , 如:lpush arr1 A
//往数据右边(后面)存数据:rpush key value , 如:rpush arr1 B
//从某个索引开始列出到某个索引结束的数据:larnge key start stop 如:larnge arr1 0 2
//从左边/右边删除某个列表值:lpop/rpop key 如:lpop arr1 

4.有序集合:

有序集合一般可用于权重排序,具体使用如下:

//添加要排序的元素:zadd key 权重 值,如:zadd grade 10 a
//根据权重排序显示前几位值:zrange key start stop 如:zrange grade 0 10
//根据权重排序显示权重分值和值:zrange key start stop withscopes

注意:权重小的会先显示出来,权重大的最后显示,需要注意,包括以上列表,最后添加的元素会显示在最前面(以lpush为准)。

nodejs操作redis:

redis是一个支持多语言的数据库,这里我以nodejs操作redis为例,简单介绍redis在编程中的使用步骤。

nodejs操作redis可以使用第三方基于node实现redis通信的客户端模块,其具体使用步骤如下:

1.下载安装redis包:注意,在测试过程中redis版本过高会报错,我这里使用的是redis@3.1.2

npm install redis@3.1.2

2.在需要使用的文件引入redis:

const redis = require('redis')

3.创建一个redis客户端:

const redisClient = redis.createClient(option)

4.调用redis客户端的api,以set为例:

redisClient.set(key,value,callback)

node实际开发中使用如下:

封装redis客户端:

// 导入redis缓存包:
const redis = require('redis')
// 配置信息:
const option = {host: '127.0.0.1',port: 6379,db: 0, // redis数据库以数字表示,这里是和mysql之间的区别// password: '123456a',detect_buffers: true, // 传入buffer 返回也是buffer 否则会转换成Stringretry_strategy: function (opt) {// 重连机制if (opt.error && opt.error.code === "ECONNREFUSED") {return new Error("The server refused the connection")}if (opt.total_retry_time > 1000 * 60 * 60) {return new Error("Retry time exhausted")}if (opt.attempt > 10) {// End reconnecting with built in errorreturn undefined}// reconnect afterreturn Math.min(opt.attempt * 100, 3000)}
}// 创建redis客户端
const redisClient = redis.createClient(option)// 准备连接redis-server事件
redisClient.on('ready', function () {// console.log('Redis redisClient: ready')
})// 连接到redis-server回调事件
redisClient.on('connect', function () {// console.log('redis is now connected!')
})redisClient.on('reconnecting', function () {// console.log('redis reconnecting')
})redisClient.on('end', function () {// console.log('Redis Closed!')
})redisClient.on('warning', function (err) {console.log('Redis redisClient: warning,'+ err)
})redisClient.on('error', function (err) {console.error('Redis Error ' + err)
})// 导出redis客户端:
module.exports = redisClient

调用node_redis中的api,这里和命令行中命令相同,以短信注册用户接口为例如下(注意:接口中的部分模块没有引入,但是不受学习,实际测试中嵌入自己接口实现效果即可):

封装发短信模块:

// 引入redis客户端:
const redisClient = require('./redisconf')
// 发短信功能模块的封装:
//调用阿里短信平台的框架
const SMSClient = require('@alicloud/sms-sdk')
//短信云平台获取accessKeyId(下面是假值)
const accessKeyId = 'AeAm*******j5LTrKLJV'
//短信云平台获取accessKeySecret(下面是假值)
const secretAccessKey =  'TfRSFe*********56eWvPwwZ44J8C'
//创建一个发送短信的实例
let smsClient = new SMSClient({accessKeyId,secretAccessKey})//发送短信功能封装为函数供其它需要发送短信的地方调用
let sendSmsCode = async (phone,verCode) => {try {// 校验参数是否为空:if (!phone) throw ('缺少号码')if (!verCode) throw ('缺少验证码')// 配置请求参数:let dataToSend = {//传入手机号码PhoneNumbers: phone,//短信云平台获取签名SignName:'苦海',//短信云平台获取模板编码(下面是假值)TemplateCode:'SMS_36*****888',//将对象转换为json字符串后赋值给后面TemplateParamTemplateParam: JSON.stringify({ code: verCode })}//调用smsClient实例的方法:sendSMS,通知阿里云发送验证码let smsResponse = await smsClient.sendSMS(dataToSend)// 结构出Code状态码判断是否发送成功let { Code } = smsResponse// 发送成功后将验证码以手机号码为key,验证码为value的方式,临时存到redis中并将结果返回给方法sendLoginCroeCode调用者,这里不返回也没问题,可以不用返回,因为发短信和注册接口是两个独立的接口,只是验证码需要临时存到redis中if (Code === 'OK') {// 将验证码和号码存到redis缓存中,以号码为key,验证码为value形式:redisClient.set(phone,verCode,(err) => {if (err) {console.log('验证码存到redis错误:' + err)}})// 设置60秒过期时间,无论是否校验通过,60秒后都清楚数据redisClient.expire(phone,60)// 将结果返回调用者return smsResponse}// 当发送失败时抛出异常:throw '短信发送失败!'} catch (error) {console.log('发送短信验证码失败,您的操作可能过于频繁,请稍微再试!'+error)}
}// 导出此方法:
module.exports = sendSmsCode

发短信接口:

// 引入redis客户端:
const redisClient = require('../config/redisconf')
// 获取短信验证码接口
router.post('/api/regist',(request,response)=>{let {phone} = request.bodylet smsCode = String(1000 + parseInt(Math.random() * 1000000)).slice(0, 4)// 调用发短信方法进行发送验证码:let verCode = sendSmsCode(phone,smsCode)if (verCode) {response.send({cod: 200, msg: '获取短信验证码成功!'})} else {response.send({cod: 201, msg: '获取短信验证码失败!'})}
})

验证码校验并注册:

// 注册用户接口:
router.post('/api/register',(request,response) => {const {userName, passWord, phone, authCode} = request.bodylet sql1 = 'SELECT * FROM `theuser` WHERE user_name = "'+userName+'"'// 判断此用户是否存在function isExistUserName () {return new Promise((resolve) => {connection.query(sql1,(error, results) => {try {if (error) {throw error} else {resolve(results)}} catch (err) {console.log('regestserve文件注册用户接口中判断此用户是否存在错误:' + err)}})})}// 新增用户:async function addNewTheuser () {// 查询用户名是否存在let isExist = await isExistUserName()// 用户名不存在时if (isExist.length === 0) {// 自己封装的获取当前时间并格式化的函数:let timer = dateFormatter1()let sql2 = "INSERT INTO `projectdataroot`.`theuser` (`user_name`, `user_password`, `user_phone`, `user_create_date`) VALUES ('"+userName+"', '"+passWord+"', '"+phone+"', '"+timer+"')"// 从redis中获取验证码并做校验:redisClient.get(phone,(error,smsCode)=>{if (error) {throw error} else {// 判断验证码是否正确if (authCode === smsCode) {connection.query(sql2,(error)=>{try {if (error) {throw error} else {response.send({cod: 200, msg: '注册成功!'})// 注册成功后立即删除redis中的校验码redisClient.del(phone,(error=>{if (error) {console.log('删除redis短信验证码数据失败:'+ error)}}))}} catch (err){console.log('regestserve文件注册用户接口中新增用户存在错误:' + err)}})} else {response.send({cod: 202, msg: '短信验证码不正确!'})}}})} else {response.send({cod: 201, msg: '用户已存在!'})}}addNewTheuser()
})

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者 删除。
笔者:苦海

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

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

相关文章

go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言你没看错,这里讲的就是 Go 中的泛型。只不过还没有正式发布,是基于草案设计的,已经是实现了可运行的版本。所以,泛型到来真的不远了&a…

bios设置_bios怎么设置显存 bios设置显存教程【图文】

有些用户可能会发现打开电脑系统信息窗口显示的内存容量与实际容量不同,例如系统内存显示4G,可用3.73G。那么不可用的那部分内存到哪里去了呢?其实是被集成显卡占用当做显存使用了。下面我们就通过 bios设置显存 来调整占用内存容量的大小,我…

4变形物体_Houdini基础(二)曲线变形物体

设想:先从二维上来看直角坐标系。物体是由x,y两个轴向的数据组成的。少了其中一组数据物体就只能是分布在单一轴向上的点。单独保留物体x、y情况下的点分布情况现在将x、y加起来,可见在三维空间中形成了一个平面。仅有x、y坐标的物体从目前的…

mybatis 映射成多个list_SSM:Mybatis架构与原理

MyBatis功能架构设计功能架构讲解:我们把Mybatis的功能架构分为三层:API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层&…

10无法勾选隐藏的项目_Excel超好用的隐藏操作,不可多得

日常工作中,表格数据的展示与隐藏也是有大学问的,为了表格更加简洁明了、美观大气,实用的隐藏技巧就派上用场了。且听小翼慢慢分享~1、隐藏行列方法1:选中目标区域,右击鼠标选择“隐藏”即可。如图:方法2&a…

HTML5简略介绍

今天要说下 HTML5特有的一个元素 canvas ,旨在让web页面上作矢量图不需要在依靠flash或是其他插件,在网页上使用canvas元素时,它会创建一块矩形区域,默认300*150,当然也是可以自定义的。Canvas中的坐标是从左上角开始的…

我的世界java和基岩版哪个好玩_我的世界:Java版本好玩还是基岩版好玩?老玩家看完后沉默了...

MC刚开始是在国外风靡了起来,传到中国的时候MC已经火了很久了,这时候外国已经出现了很多玩MC十分厉害的大神和主播,而在国外也有超多的服务器,其中有号称最强的原版生存服务器Scicraft,而在版本方面MC其实算下来大概有…

SQL Server简介

SQL Server是微软的一款关系型数据库。某些平台吹得天花烂坠,今天第一次在自己的项目中使用了下,感觉不是那么好,特别是SQL语句的支持度还是很欠缺,如limit等都不支持,还有特别单双引号都是需要特别注意的,下面是SQL S…

Windows下断言的类型及实现

一、内容综述 本文主要介绍Windows下断言assert的实现,并总结断言的不同应用准则。最后给出一个windows自定义断言的方法。 本文行文参考《Debugging Windows Programs》第三章相关内容,如果有兴趣的话建议读者可以深入阅读下。 二、断言的类型 1. ANSI…

linux右上角不显示网络连接_来体验下Linux吧

在前面的几期中我们从树莓派开始了解Linux,大家可能已经想来试一下手了。趁热打铁,本期我将介绍两种方便体验学习Linux的方法,在线体验或者安装虚拟机。1 在线体验Linux如果想快速的体验下Linux系统,我们可以选择云计算服务商提供…

python md5解密_python 生成文件MD5码

pymd5.py的代码如下: #-*-coding:utf-8-*-Created on 2012-5-25 author: kanpiaoxueimport hashlib import os import sys def printUsage(): print (Usage: [python] pymd5.py ) def createMD5(filePath): if not os.path.isfile(filePath): printUsage() else: tm…

Java数据结构、list集合、ArrayList集合、LinkedList集合、Vector集合

数据结构: 数据存储的常用结构有:栈、队列、数组、链表、红黑树。 栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操…

第11章 GUI Page436 使用缓冲DC, wxBufferedPaintDC

所谓“缓冲DC”,是指将所有图元都先划到一个人眼看不到的“设备上下文”之上,最后再一次性复制到真正的屏幕DC之上,这样我们就看不到中间画的过程了,也就不会感到闪烁了。 注意,这时不能解除ScrolledWindow1的背景擦除…

Tomcat+JSP经典配置实例

经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题,于是总结了一下如何tomcat下配置jsp、servlet和ben,希望对那些初学者有所帮助。    一、开发环境配置    第一步:下载j2sdk和tomcat:到sun官方站&#xf…

python海龟编辑器画小汽车_【海龟编辑器下载】海龟编辑器(Python编辑器) v1.3.4 官方免费版-趣致软件园...

海龟编辑器是一款专为广大少儿打造的Python编辑器,该软件功能强大且使用便利,可以帮助孩子们以搭积木的方式来学习Python,并且支持Python代码和图形化积木的双向互相转译,不但可以有效提升孩子的学习兴趣,而且还能够降…

微信小程序中组件的使用

微信小程序中组件的使用: 微信小程序中组件定义在项目根目录下components文件夹下,在页面使用的时候需要在页面的json文件中声明,如 父组件向子组件传值及子组件向父组件传值: 父组件wxml中:通过属性绑定值的方式向…

如何保证交叉表编译器和目标系统版本一致_嵌入式系统词汇表

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群AASIC(专用集成电路) Application-Specific Integrated Circuit. A piece of custom-designed hardware in a chip. 专用集成电路。一个在一个芯片上定制设计的硬件。address bus (地…

动态定义数组

首先:为什么需要动态定义数组呢? 这是因为,很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运行时动态的给出 但是问题是,c要求定义数组时,必须明确给定数组的…

sql随机抽取数据50条_厉害!苏宁通过citus打造分布式数据库抗住DB高负载

2018-07-16 23:59内容来源:2017 年 10 月 20 日,苏宁云商IT总部资深技术经理陈华军在“PostgreSQL 2017中国技术大会”进行《苏宁citus分布式数据库应用实践》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作…

java中Debug调试、异常的概念、异常体系、处理异常的关键字try/catch/finally/throw/throws、多个异常使用捕获并处理的方式、继承关系中处理异常、自定义异常类

Debug调试: bug指程序当中遇到的一些错误异常,Debug指调试bug,找到bug对其解决;debug可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug或异常。 public class DebugClass {public static void main(Strin…