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

2 篇文章 0 订阅

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 否则会转换成String
  retry_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 error
      return undefined
    }
    // reconnect after
    return 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字符串后赋值给后面TemplateParam
      TemplateParam: 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.body
  let 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.body
    let 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联系笔者 删除。
笔者:苦海

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦海123

快乐每一天!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值