Web菜鸟教程 - Radis实现高性能数据库

Redis是用C语言开发的一个高性能键值对数据库,可用于数据缓存,主要用于处理大量数据的高访问负载。

也就是说,如果你对性能要求不高,不用Radis也是可以的。不过作为最自己写的程序有高要求的程序员,自然是要学一下的,毕竟大部分的网站都配置了radis。接下来一三部分来介绍radis:

  • 安装
  • 配置
  • 使用

Radis安装

有两种方式安装,一种是下载安装包安装,radis是微软出品的开源项目,代码位于github上,大家可以戳这里下载最新的release包。
在这里插入图片描述
下载完后解压到指定目录后,打开命令行,输入启动命令

redis-server.exe redis.windows.conf

在这里插入图片描述

当然如果你用的是宝塔这种,你可以直接在软件商店搜索并安装,速度更快更便捷。

在这里插入图片描述
不管是windows版本还是宝塔下载的版本,直接启动使用的默认配置。密码为空,端口为6379,host为本机127.0.0.1。好了接下来就是将他整合到Spring里面。

整合到Springboot

初一看你会觉得radis挺难的,不知道是什么玩意,但是如果结合前面两篇文章来看,radis的使用也无外乎以下三点:

  • 引入环境
  • 配置Radis
  • 使用RadisTemplate提供的功能实现自己想要的接口。

使用起来感觉和mybatis的使用也都大差不差嘛。好勒话不多说直接开整。我们现在以接收手机验证码逻辑来整合radis。之所以需要在这个逻辑中引入Radis是因为客户再获取验证码的时候可能不是一次通过,它需要不断地获取验证码,实际上,在固定时间内验证码并不会变,他只是没有收到而已,我们重发一遍就好了。

引入依赖

在pom中引入依赖:

<!--redis依赖配置-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后我们需要配置radis,尽管我们启动的时候使用的默认配置,但是springboot是不知道的,因此我们需要在spring的节点下引入radis的配置:

  redis:host: localhost # Redis服务器地址database: 0 # Redis数据库索引(默认为0)port: 6379 # Redis服务器连接端口password: # Redis服务器连接密码(默认为空)jedis:pool:max-active: 8 # 连接池最大连接数(使用负值表示没有限制)max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)max-idle: 8 # 连接池中的最大空闲连接min-idle: 0 # 连接池中的最小空闲连接timeout: 3000ms # 连接超时时间(毫秒)

上面是关于radis链接的配置,我们还需要添加一些自定义key的配置,这个是radis业务上的。

# 自定义redis key,在根节点添加
redis:key:prefix:authCode: "portal:authCode:"expire:authCode: 120 # 验证码超期时间

实现功能

配置写好了,我们接下来实现功能。也就是定义一些radis相关的操作方便其他业务代码调用。Radis用的最多的几个功能:

  • 存储数据
  • 获取数据
  • 设置超时
  • 删除数据
  • 自增操作

我们把这些功能定义好接口:

package org.lange.study.service;/*** redis操作Service,* 对象和数组都以json形式进行存储*/
public interface RedisService {/*** 存储数据*/void set(String key, String value);/*** 获取数据*/String get(String key);/*** 设置超期时间*/boolean expire(String key, long expire);/*** 删除数据*/void remove(String key);/*** 自增操作* @param delta 自增步长*/Long increment(String key, long delta);}

然后注入StringRedisTemplate,实现RedisService接口:(他其实是RedisTemplate的一个子类,StringRedisTemplate将字符串的处理简化了,RedisTemplate可以处理任意对象,而StringRedisTemplate需要先转换成json字符串才能保存起来)

多数时候我们频繁操作的数据都是以键值对的相识存在,这也是引入radis的原因。接下来我们通过接入到业务层更深刻理解Radis的使用。

验证码就两个功能,一个是获取验证码,当用户获取到验证码之后会调用验证接口来验证他填写的验证码是否正确。所以我们先把接口定义一下:
UmsMemberService.java

package org.lange.study.service;import org.lange.study.common.api.CommonResult;/*** 会员管理Service*/
public interface UmsMemberService {/*** 生成验证码*/CommonResult generateAuthCode(String telephone);/*** 判断验证码和手机号码是否匹配*/CommonResult verifyAuthCode(String telephone, String authCode);}

写一个控制器UmsMemberController:

package org.lange.study.controller;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.lange.study.common.api.CommonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;/*** 添加根据电话号码获取验证码的接口和校验验证码的接口* 会员登录注册管理Controller*/
@Controller
@Api(tags = "UmsMemberController", description = "会员登录注册管理")
@RequestMapping("/sso")
public class UmsMemberController {@Autowiredprivate UmsMemberService memberService;@ApiOperation("获取验证码")@RequestMapping(value = "/getAuthCode", method = RequestMethod.GET)@ResponseBodypublic CommonResult getAuthCode(@RequestParam String telephone) {return memberService.generateAuthCode(telephone);}@ApiOperation("判断验证码是否正确")@RequestMapping(value = "/verifyAuthCode", method = RequestMethod.POST)@ResponseBodypublic CommonResult updatePassword(@RequestParam String telephone,@RequestParam String authCode) {return memberService.verifyAuthCode(telephone,authCode);}
}

然后我们要实现对应的Service,UmsMemberServiceImpl.java:
假定我们的验证码业务场景为:

生成验证码时,将自定义的Redis键值加上手机号生成一个Redis的key,以验证码为value存入到Redis中,并设置过期时间为自己配置的时间(这里为120s)。校验验证码时根据手机号码来获取Redis里面存储的验证码,并与传入的验证码进行比对。

UmsMemberServiceImpl.java

package org.lange.study.service.impl;import org.lange.study.common.api.CommonResult;
import org.lange.study.service.RedisService;
import org.lange.study.service.UmsMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.util.Random;@Service
public class UmsMemberServiceImpl implements UmsMemberService {@Autowiredprivate RedisService redisService;@Value("${redis.key.prefix.authCode}")private String REDIS_KEY_PREFIX_AUTH_CODE;@Value("${redis.key.expire.authCode}")//这个@value就是读取前面的配置private Long AUTH_CODE_EXPIRE_SECONDS;/*** 生成的时候设置超时间并保存到radis,然后将验证码返回给客户端*/@Overridepublic CommonResult generateAuthCode(String telephone) {StringBuilder sb = new StringBuilder();Random random = new Random();for (int i = 0; i < 6; i++) {sb.append(random.nextInt(10));}//验证码绑定手机号并存储到redisredisService.set(REDIS_KEY_PREFIX_AUTH_CODE + telephone, sb.toString());redisService.expire(REDIS_KEY_PREFIX_AUTH_CODE + telephone, AUTH_CODE_EXPIRE_SECONDS);return CommonResult.success(sb.toString(), "获取验证码成功");}/*** 对输入的验证码进行校验,调用get方法就好了*/@Overridepublic CommonResult verifyAuthCode(String telephone, String authCode) {if (StringUtils.isEmpty(authCode)) {return CommonResult.failed("请输入验证码");}String realAuthCode = redisService.get(REDIS_KEY_PREFIX_AUTH_CODE + telephone);boolean result = authCode.equals(realAuthCode);if (result) {return CommonResult.success(null, "验证码校验成功");} else {return CommonResult.failed("验证码不正确");}}
}

在上述案例中,我只用到了Radis的设置和获取以及设置有效时间的方法,Radis的其他功能大家可以根据需要去探索。

运行

我们可以使用swagger进行接口调试

访问Swagger的API文档地址http://localhost:8080/swagger-ui.html ,对接口进行测试。

在这里插入图片描述

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

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

相关文章

PHP Mysql查询全部全部返回字符串类型

设置pdo属性 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

08-1_Qt 5.9 C++开发指南_QPainter绘图

文章目录 前言1. QPainter 绘图系统1.1 QPainter 与QPaintDevice1.2 paintEvent事件和绘图区1.3 QPainter 绘图的主要属性 2. QPen的主要功能3. QBrush的主要功能4. 渐变填充5. QPainter 绘制基本图形元件5.1 基本图像元件5.2 QpainterPath的使用 前言 本章所介绍内容基本在《…

chatserver服务器开发笔记

chatserver服务器开发笔记 1 chatserver2 开发环境3 编译 1 chatserver 集群聊天服务器和客户端代码&#xff0c;基于muduo、redis、mysql实现。 学习于https://fixbug.ke.qq.com/ 本人已经挂github&#xff1a;https://github.com/ZixinChen-S/chatserver/tree/main 需要该项…

kubernetes pod 资源限制 探针

资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;代表容器运行所需的最小资源量&#xff0c;调度器就使用该信息来决定将 Pod …

Java课题笔记~ JSP开发模型

MVC 1.JSP演化历史 1. 早期只有servlet&#xff0c;只能使用response输出标签数据&#xff0c;非常麻烦 2. 后来有了jsp&#xff0c;简化了Servlet的开发&#xff0c;如果过度使用jsp&#xff0c;在jsp中即写大量的java代码&#xff0c;有写html表&#xff0c;造成难于维护&…

计算机网络实验4:HTTP、DNS协议分析

文章目录 1. 主要教学内容2. HTTP协议3. HTTP分析实验【实验目的】【实验原理】【实验内容】【实验思考】 4. HTTP分析实验可能遇到的问题4.1 捕捉不到http报文4.2 百度是使用HTTPS协议进行传输4.3 Wireshark获得数据太多如何筛选4.4 http报文字段含义不清楚General&#xff08…

[4G/5G/6G专题基础-161]:常见的滤波技术

1. 滤波概述 1.1 什么是滤波 滤波&#xff08;Filtering&#xff09;是信号处理中的一种基本操作&#xff0c;用于改变信号的特性或者去除信号中的干扰成分。滤波器可以看作是一种系统&#xff0c;将输入信号作为输入&#xff0c;经过处理后产生输出信号。 滤波在信号处理中…

Git和GitHub

文章目录 1.Git介绍2. 常用命令3. Git分支操作4. Git团队协作机制5. GitHub操作6. IDEA集成Git7.IDEA操作GitHub8. Gitee 1.Git介绍 Git免费的开源的分布式版本控制系统&#xff0c;可以快速高效从小到大的各种项目 Git易于学习&#xff0c;占地面积小&#xff0c;性能快。它…

@RunWith的使用

引言 当谈到在Java中进行单元测试时&#xff0c;JUnit是开发人员的常见选择之一。JUnit是一个流行的单元测试框架&#xff0c;它允许您编写和执行测试来验证代码的正确性。在JUnit中&#xff0c;RunWith注解是一个强大的工具&#xff0c;它可以用来定制测试运行器&#xff0c;…

【日常积累】RPM包依赖下载及私有yum仓库搭建

概述 某些时候&#xff0c;我们需要下载某个RPM包依赖的依赖。如某些内网环境&#xff0c;就需要自行准备rpm包。可以通过能上互联网的服务器进行相应的rpm包下载&#xff0c;然后在拷贝到相应的服务器安装&#xff0c;或者搭建自己的内容rpm包仓库。 查看*.rpm 包依赖&#…

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…

批处理自动切换ip地址与网络的启用、禁用

启用禁用网络 echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" REM --> If error flag set,…

什么是微服务?

2.微服务的优缺点 优点 单一职责原则每个服务足够内聚&#xff0c;足够小&#xff0c;代码容易理解&#xff0c;这样能聚焦一个指定的业务功能或业务需求&#xff1b;开发简单&#xff0c;开发效率提高&#xff0c;一个服务可能就是专一的只干一件事&#xff1b;微服务能够被小…

命令提示符之操作基础(Windows)

打开命令提示符 方法一 打开指定文件的文件夹&#xff0c;在路径栏里输入“cmd”&#xff0c;回车&#xff0c;就进入控制台了。默认路径就是指定文件夹的路径。 方法二 打开指定的文件夹&#xff0c;按住shift键&#xff0c;在空白处右击&#xff0c;在菜单栏中选择“在此处打…

社区团购商城拼团秒杀接龙分销团长小程序开源版开发

社区团购商城拼团秒杀接龙分销团长小程序开源版开发 功能介绍&#xff1a; 商品管理&#xff1a;增加商品-商品列表-商品分类-商品单/多规格-商品标签 订单管理&#xff1a;订单列表-订单挑选-订单导出-订单打印-批量发货-商品评价 会员管理&#xff1a;会员列表-会员挑选-会员…

【Git】—— 标签管理

目录 &#xff08;一&#xff09;理解标签 1、作用 &#xff08;二&#xff09;创建标签 &#xff08;三&#xff09;操作标签 1、删除标签 2、推送标签 3、删除远程标签 &#xff08;一&#xff09;理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的…

python中的迭代器和生成器

一、迭代器 支持迭代的容器&#xff0c;如列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字典&#xff08;dict&#xff09;、集合&#xff08;set&#xff09;这些序列式容器。 自定义迭代器的类中必须实现以下2个方法&#xff1a; __next__(self)…

监控Kubernetes 控制面组件的关键指标

控制面组件的监控&#xff0c;包括 APIServer、Controller-manager&#xff08;简称 CM&#xff09;、Scheduler、etcd 四个组件。 1、APIServer APIServer 的核心职能是 Kubernetes 集群的 API 总入口&#xff0c;Kube-Proxy、Kubelet、Controller-Manager、Scheduler 等都需…

【字符串】649. Dota2 参议院

649. Dota2 参议院 解题思路 R true 表示循环结束之后 字符串仍然存在 Rflag > 0 说明R在D之前出现 R可以消灭Dflag < 0 说明D在R之前出现 D 可以消灭R一旦其中有一个为false 说明只剩下R 或者D 那么就可以决定谁获胜遍历字符串 如果当前字符是R 判断flag 如果flag &l…

‘open3d.open3d.geometry.PointCloud‘ object has no attribute ‘voxel_down_sample‘

scene_cloud open3d.geometry.PointCloud() scene_cloud.points open3d.utility.Vector3dVector(scene_points) scene_cloud scene_cloud.voxel_down_sample(voxel_size) 执行上面代码第三句报错&#xff0c;出现了下面这个错误&#xff1a; AttributeError: open3d.open…