2023.12.24 关于 Redis 中 String 类型内部编码 及 应用场景

目录

String 类型内部编码

3 种内部编码方式

String 类型应用场景

Cache 缓存

键名命名规则

计数(Counter)

共享会话(Session )

手机验证码

总结


String 类型内部编码

3 种内部编码方式

  1. int:用来表示 64 位 ——> 8 字节的整数
  2. embstr:压缩字符串,针对短字符串进行的特殊优化,适用于比较短的字符串
  3. raw:普通字符串,适用于表示更长的字符串 只是单纯的字节数组

实例理解

  • 此处我们使用 object encoding key 命令来查看 key 对应 value 的编码方式

注意:

  • 当 Redis 存储小数时,其本质还是当做字符串来进行存储的,和整数相比有一定差别
  • 整数是直接用内部编码 int 来进行存储的(准确来说相当于 Java 中的 long 类型)
  • 所以整数在进行算数运算时比较方便
  • 但每当小数需要进行算数运算时,都需要把字符串转成小数再进行运算,结果再转回字符串来保存

String 类型应用场景

Cache 缓存

  • 使用 Redis 作为缓存,其中绝大部分数据均从 Redis 中获取
  • 因为 Redis 具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用
  • 下图为 Redis + MySQL 组成的缓存存储架构

整体思路

  • 当应用服务器访问数据的时,先查询 Redis 中的数据
  • 如果 Redis 上存在需访问的数据,就直接从 Redis 中取数据交给应用服务器,不继续访问 MySQL 数据库
  • 如果 Redis 上不存在需访问的数据,便向下读取 MySQL 数据库,将读到的结果返回给 Redis,同时也将该数据写入到 Redis 中继而再由 Redis 返回给应用服务器

注意点一:

  • Redis 这样的缓存,经常用来存储 热点 数据,即高频被使用的数据,这个定义方式,结合业务场景有很多种方式
  • 刚才上述描述的过程,相当于是把最近使用到的数据作为热点数据
  • 暗含了一层假设,某个数据一旦被用到了,那么很可能在最近这段时间就会被反复用到

问题:

  • 随着时间的推移,肯定会有越来越多的 key 在 Redis 中访问不到,从而将会有更多的数据从 MySQL 中读取并写入到 Redis 中
  • 那么此时 Redis 中的数据不就会越来越多吗?

解决方案:

  1. 把数据写入 Redis 的同时给这个 key 设置一个过期时间
  2. Redis 在内存不足的时候,提供了淘汰策略

键名命名规则

  • 与 MySQL 关系型数据库不同的是 Redis 没有表、字段这种命名空间,而且也没有对键名有着强制要求(除一些不能用的特殊字符外)
  • 设计合理的键名有利于防止 键冲突 和 项目 的可维护性

推荐方式:

  • " 业务名 : 对象名 : 唯一标识 : 属性 " 作为键名

实例理解

  • MySQL 的数据库名为 " vs " 用户表名为 " user_info "
  • 那么对应的键可以使用 " vs:user_info:3679 " 、"vs : user_info : 6379 : name" 
  • 如果当前 Redis 只会被一个业务使用,便可以省略业务名 " vs " 
  • 当然也可以使用团队内部都认同的缩写进行替代
  • " user : 6379 : friends : messages : 5217 " 可以被 " u : 6379 : fr : m : 5217 " 代替
  • 因为 键名过长 也会导致 Redis 的性能明显下降 

计数(Counter)

  • 许多应用都会使用 Redis 作为计数的基础工具
  • 它可以实现快速计数、查询缓存的功能,同时可以异步处理或者落地到其他数据源
  • 例如网站视频的播放量、点赞数

实例理解

  • 记录 视频网站的视频播放次数

注意点一:

  • 此处的 统计数据仓库 可能是 MySQL 也可能是 HDFS(分布式文件系统)
  • HDFS 是 Hadoop 的核心组件之一,旨在存储和管理大规模数据集,并提供高度容错性

注意点二:

  • 注意理解此处的 异步的方式将播放量同步到其他数据源
  • 异步 是指操作不需要立即完成,而是可以延迟执行
  • 当面对大量的播放请求时,只要持续不断地进行写入操作就行

通俗理解:

  • 不要求 Redis 更新 value 的时候,统计数据仓库也跟着同步更新
  • 统计数据仓库更新慢点没有关系,只要保证最终数据能正确写入就行了

注意点三:

  • 实际开发中要完成一个成熟、稳定的真实计数系统,要面临的挑战远不止如此简单

挑战包括:

  • 防作弊、按照不同纬度计数、避免单点问题、数据持久化到底层数据源等
  • 最终我们还是要 根据实际的业务需求场景 进行确定

注意点四:

  • Redis 不擅长数据统计
  • 比如根据上述实例,统计出播放量前 100 的视频,基于 Redis 搞就十分麻烦
  • 相比之下,使用 MySQL 来存储上述数据,一个 sql 就可以搞定

补充:

  • 企业为什么总喜欢收集用户的数据?

原因:

  • 需对数据进行统计,并根据统计来进一步明确用户的需求,再根据需求改进和迭代产品

共享会话(Session )

  • 使用 Redis 将用户的 Session 信息进行机制管理
  • 这种模式下,只要保证 Redis 是高可用和可拓展性的,无论用户被均衡到哪台 Web 服务器上,都集中从 Redis 中查询、更新 Session 信息


手机验证码

1、生产验证码

  • 用户输入手机号码,点击获取验证码,限制 1分钟之内最多获取 5次验证码 或 每次获取验证码必须间隔 30 秒
  • 主要因为怕用户频繁获取验证码,对服务器施加过大压力

2、检查验证码

  • 将短信收到的验证码,提交到系统中,并由系统进行检查验证码是否正确

实例理解

  • 此处我们提供伪一段代码来进行理解
  • 此处的限制条件为 1分钟内最多获取 5次验证码
String 发送验证码(phoneNumber) {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为 1 分钟(60 秒)// 使⽤ NX,只在不存在 key 时才能设置成功bool r = Redis 执⾏命令:set key 1 ex 60 nxif (r == false) {// 说明之前设置过该⼿机的验证码了long c = Redis 执⾏命令:incr keyif (c > 5) {// 说明超过了⼀分钟 5 次的限制了// 限制发送return null;}}// 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次String validationCode = ⽣成随机的 6 位数的验证码();validationKey = "validation:" + phoneNumber;// 验证码 5 分钟(300 秒)内有效Redis 执⾏命令:set validationKey validationCode ex 300;// 返回验证码,随后通过⼿机短信发送给⽤⼾return validationCode ;
}// 验证⽤⼾输⼊的验证码是否正确
bool 验证验证码(phoneNumber, validationCode) {validationKey = "validation:" + phoneNumber;String value = Redis 执⾏命令:get validationKey;if (value == null) {// 说明没有这个⼿机的验证码记录,验证失败return false;}if (value == validationCode) {return true;} else {return false;}
}

注意:

  • 像发送短信这样的操作,都是有专门的 SDK(软件开发工具包)来实现的,即第三方提供的短信平台服务(收费)

总结

  • 以上介绍了四种关于 Redis 字符串数据类型的经典场景,但其适用场景远不止此
  • 开发人员可结合字符串类型的特点以及提供的命令,充分发挥自己的想象力,在自己的业务中去找到适合的场景去使用 Redis 的字符串类型 

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

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

相关文章

小天使的小难题:新生儿疝气的关注与温馨呵护

引言: 新生儿疝气是一种在出生后可能出现的常见情况,虽然通常不会造成长期影响,但对于家长而言,了解如何正确应对新生儿疝气是至关重要的。本文将深入探讨新生儿疝气的原因、症状,以及家长在面对这一问题时应该采取的…

1224. 交换瓶子(蓝桥杯/图论)

题目: 1224. 交换瓶子 - AcWing题库 输入样例1: 5 3 1 2 5 4输出样例1: 3输入样例2: 5 5 4 3 2 1输出样例2: 2 思路:图论 1.将对应的位置与当前的瓶子序列相连形成环。 2.最少交换次数能形成的最多…

【【迭代16次的CORDIC算法-verilog实现】】

迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …

第十四章Java博客

lambda就是数学中的“λ”的读音,lambda表达式是基于λ演算而得名的,因为lambda抽象(lambda abstraction)表示一个匿名的函数,于是开发语言也将lambda表达式用来表示匿名函数,也就是没有函数名字的函数。C#…

C语言字符串处理提取时间(ffmpeg返回的时间字符串)

【1】需求 需求:有一个 “00:01:33.90” 这样格式的时间字符串,需要将这个字符串的时间值提取打印出来(提取时、分、秒、毫秒)。 这个时间字符串从哪里来的? 是ffmpeg返回的时间,也就是视频的总时间。 下…

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

系列七(实战)、发送 接收单向消息(Java操作RocketMQ)

一、发送 & 接收单向消息 1.1、概述 发送单向消息,适用于发送方不关心或者不在意消息的发送结果,这种方式的吞吐量很大,但是存在消息丢失的风险,对于重要消息要慎用!该种方式通常适用于对消息没有那么严格的场景中…

类和对象的创建和实例化

1. 类的概述 1.1 具体示例 类是描述一类事物的特征和行为的统称,抽象的不存在的,泛指的概念,例如:描述一个人,从外观上(特征)和言行举止(行为)上进行描述外观上&#xff…

c 语言学习:输出阶乘的算式

c 语言学习&#xff1a;输出阶乘的算式 代码 #include "stdio.h"int fact(int num){if (num < 1){printf("1 ");return 1;} else {printf("%d x ",num);return num * fact(num-1);} }int main(){int num 10; // printf("plz inpu…

老鹰目标检测数据集VOC格式60张

老鹰是天空中的王者&#xff0c;它们拥有极佳的飞行能力。它们能以惊人的速度在天空中翱翔&#xff0c;尤其擅长高空俯冲捕食。老鹰的视力非常敏锐&#xff0c;能够准确地发现地面上的猎物&#xff0c;并迅速下落抓取。它们的爪子强而有力&#xff0c;足以击倒比自己体型庞大的…

云计算与大数据之间的羁绊(期末不挂科版):云计算 | 大数据 | Hadoop | HDFS | MapReduce | Hive | Spark

文章目录 前言&#xff1a;一、云计算1.1 云计算的基本思想1.2 云计算概述——什么是云计算&#xff1f;1.3 云计算的基本特征1.4 云计算的部署模式1.5 云服务1.6 云计算的关键技术——虚拟化技术1.6.1 虚拟化的好处1.6.2 虚拟化技术的应用——12306使用阿里云避免了高峰期的崩…

0基础学习VR全景平台篇第131篇:曝光三要素—光圈

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 我们经常从电视或书刊上看到这样的照片&#xff0c;照片的主体清晰&#xff0c;前后镜朦胧虚化&#xff0c;整体看起来非常的漂亮。那这样的照片是如何拍出来的呢&#xff1f;他和…

为什么要出现并发?并发的三要素

大家好&#xff0c;我是"java继父"伯约&#xff0c;假如这篇对大家有帮助的话求一个赞&#xff0c;另外文章末尾放了我从小白到架构师多年的学习资料。 1.为什么需要多线程 众所周知&#xff0c;CPU、内存、I/O 设备的速度是有极大差异的&#xff0c;为了合理利用 C…

Vue编写登录注册页面前端校验

登录注册校验 template页面 <div class"app-login"><!--登录 --><div class"form"><el-form ref"form" size"large" autocomplete"off" v-if"isLogin" :model"registerData" :r…

FXCM福汇官网:深入解析BOLL指标的喇叭口形态及含义

BOLL指标是一种通过布林线&#xff08;Bollinger Bands&#xff09;的上轨线、中轨线和下轨线的相互关系来判断市场趋势和波动性的技术分析工具。BOLL指标的喇叭口形态包括开口型、收口型和紧口型&#xff0c;它们各自具有独特的含义。 《FXCM福汇官网开户》 1. 开口型喇叭口…

cesium实现二三维联动

记录项目中实现二三维地图联动 效果如下&#xff1a; 第一步&#xff1a;现在页面中加载二三维地图&#xff08;地图的初始化已省略&#xff09; <template><div><div><button click"show">二三维联动</button></div><div&…

经典文献阅读之--RenderOcc(使用2D标签训练多视图3D Occupancy模型)

0. 简介 3D占据预测在机器人感知和自动驾驶领域具有重要的潜力&#xff0c;它将3D场景量化为带有语义标签的网格单元。最近的研究主要利用3D体素空间中的完整占据标签进行监督。然而&#xff0c;昂贵的注释过程和有时模糊的标签严重限制了3D占据模型的可用性和可扩展性。为了解…

Mendelson AS2 介绍下载和配置

最近与一家国外公司做EDI对接&#xff0c;并且EDI通讯工具是基于AS2协议的。目前开源的as2的开源项目有openas2,Mendelson AS2&#xff0c;和国人写的freeas2但是&#xff0c;现在freeas2已经被从开源中国不能下载了&#xff0c;变为收费的版本了。 如果你需要使用基于AS2协议…

智能仓储管理系统设计与实现

智能仓储管理系统设计与实现 第一章 绪论 1.1 设计背景 物联网&#xff08;英文&#xff1a;Internet of Things&#xff0c;缩写&#xff1a;IoT&#xff09;是万物相连的互联网&#xff0c;即把所有物品通过信息传感设备与互联网连接起来&#xff0c;以实现智能化识别、定位、…

Java网络爬虫拼接姓氏,名字并写出到txt文件(实现随机取名)

目录 1.爬取百家姓1.爬取代码2.爬取效果 2.爬取名字1.筛选男生名字2.筛选女生名字 3.数据处理&#xff08;去除重复&#xff09;4.拼接数据5.将数据写出到文件中 1.爬取百家姓 目标网站&#xff0c;仅作为实验目的。 ①爬取姓氏网站&#xff1a; https://hanyu.baidu.com/shic…