【Redis】String字符串类型-内部编码使用场景

news2024/11/24 6:58:03

文章目录

  • 内部编码
  • 使用场景
    • 缓存功能
    • 计数功能
    • 共享会话
    • 手机验证码

内部编码

字符串类型的内部编码有3种:

  • int:8个字节(64位)的⻓整型,存储整数
  • embstr:压缩字符串,适用于表示较短的字符串
  • raw:普通字符串,适用于表示更长的字符串,内部是一个char类型的数组

image-20231025212919229

Redis会根据当前值的类型和⻓度动态决定使⽤哪种内部编码实现


使用场景

缓存功能

Redis作为缓冲层,MySQL作为存储层,绝⼤部分请求的数据都是从Redis中获取。由于Redis具有⽀撑⾼并发的特性,所以缓存通常能起到加速读写和降低后端压⼒的作⽤

image-20231021104656937

整体的思路:应用服务器访问数据的时候,先查询redis服务器,如果redis服务器上数据存在,那么就直接从redis当中取出数据交给应用服务器,不继续访问数据库

如果redis服务器上数据不存在,那么再读取MySQL,将读取到的结果范围给应用服务器,同时将这个查询到的数据写入到redis当中

伪代码模拟业务数据访问过程

1)假设业务是根据⽤⼾uid获取⽤⼾信息

UserInfo getUserInfo(long uid) {
	...
}

2)⾸先从Redis获取⽤⼾信息,我们假设⽤⼾信息保存在user:info:<uid>对应的键中

// 根据 uid 得到 Redis 的键
String key = "user:info:" + uid;
// 尝试从 Redis 中获取对应的值
String value = Redis 执⾏命令:get key;
// 如果缓存命中(hit)
if (value != null) {
    // 假设我们的⽤⼾信息按照 JSON 格式存储
    UserInfo userInfo = JSON 反序列化(value);
    return userInfo;
}

3)如果没有从Redis中得到⽤⼾信息,及缓存miss,则进⼀步从MySQL中获取对应的信息,随后写⼊缓存并返回

// 如果缓存未命中(miss)
if (value == null) {
    // 从数据库中,根据 uid 获取⽤⼾信息
    UserInfo userInfo = MySQL 执⾏ SQL:select * from user_info where uid = <uid>
        // 如果表中没有 uid 对应的⽤⼾信息
        if (userInfo == null) {
            响应 404
            return null;
        }
    // 将⽤⼾信息序列化成 JSON 格式
    String value = JSON 序列化(userInfo);
    // 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600 秒)
    Redis 执⾏命令:set key value ex 3600
    // 返回⽤⼾信息
    return userInfo;
}

通过增加缓存功能,极⼤地提升了查询效率,也降低了MySQL的访问数


注意:与MySQL等关系型数据库不同的是,Redis没有表、字段这种命名空间,⽽且也没有对键名有强制要求(除了不能使⽤⼀些特殊字符)。但设计合理的键名,有利于防⽌键冲突和项⽬的可维护性

  • 推荐的⽅式是使⽤业务名:对象名:唯⼀标识:属性作为键名
  • MySQL的数据库名为vs,⽤⼾表名为user_info,那么对应的键可以使⽤vs:user_info:6379vs:user_info:6379:name来表⽰

如果当前Redis只会被⼀个业务使⽤,可以省略业务名"vs:"。如果键名过长,则可以使⽤团队内部都认同的缩写替代,例如"user:6379:friends:messages:5217"可以被"u:6379:fr:m:5217"代替。毕竟键名过⻓,还是会导致Redis的性能明显下降的。


计数功能

许多应⽤都会使⽤Redis作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源,例如视频⽹站的视频播放次数可以使⽤Redis来完成:⽤⼾每播放⼀次视频,相应的视频播放数就会⾃增1

image-20231021110109878
  • 注意:写入统计数据仓库的步骤是异步的,并不是说来一个播放请求就必须马上写一个数据,二者并不需要同时完成,只需要最后保证数据正确即可

要开发⼀个成熟、稳定的真实计数系统,要⾯临的挑战远不⽌如此简单:防作弊(防止别人刷播放量),按照不同维度计数、避免单点问题、数据持久化到底层数据源等


共享会话

回顾

cookie:浏览器存储数据的机制 session:服务器这边存储数据的机制

会话:客户端和服务器在交互的过程当中产生的一些专属于该客户端的中间状态的数据


⼀个分布式Web服务将⽤⼾的Session信息(例如⽤⼾登录信息)保存在各⾃的服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将⽤⼾的访问请求均衡到不同的服务器上,并且通常⽆法保证⽤⼾每次请求都会被均衡到同⼀台服务器上,这样当⽤⼾刷新⼀次访问是可能会发现需要重新登录,这个问题是⽤⼾⽆法容忍的

session分散存储

image-20231021110151641

为了解决这个问题,可以使⽤Redis将⽤⼾的Session信息进⾏集中管理,如图2-13所⽰,在这种模式下,只要保证Redis是⾼可⽤和可扩展性的,⽆论⽤⼾被均衡到哪台Web服务器上,都集中从Redis中查询、更新Session信息

image-20231021110215469

手机验证码

很多应⽤出于安全考虑,会在每次进⾏登录时,让⽤⼾输⼊⼿机号并且配合给⼿机发送验证码,然后让⽤⼾再次输⼊收到的验证码并进⾏验证,从⽽确定是否是⽤⼾本⼈。为了短信接⼝不会频繁访问,会限制⽤⼾每分钟获取验证码的频率,例如⼀分钟不能超过?5?次

image-20231021110251669

伪代码实现上述功能

String 发送验证码(phoneNumber) {
    key = "shortMsg:limit:" + phoneNumber;
    // 设置过期时间为 1 分钟(60 秒)
    // 使⽤ NX,只在不存在 key 时才能设置成功
    bool r = Redis 执⾏命令:set key 1 ex 60 nx
        if (r == false) {
            // 说明之前设置过该⼿机的验证码了
            long c = Redis 执⾏命令:incr key
                if (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;
    }
}

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

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

相关文章

工业5G路由器;小体积 千兆高速通信组网

计讯物联工业路由器TR232&#xff0c;5G高速网络&#xff0c;超低时延、高可靠性&#xff0c;小体积、易安装、强兼容&#xff0c;串口/网口多设备接入联网&#xff0c;为用户提供高速稳定的数据传输通道 。    小体积5G工业路由器TR323&#xff0c;外形1047824mm&#xff0…

el-popover触发元素位置改变后更新弹出框的偏移位置

el-popover的使用如下&#xff1a;包含一个触发元素和一个弹出框元素 但是如果触发元素位置发生变化时&#xff0c;如根据弹框选择内容&#xff0c;会显示或隐藏对应的元素&#xff0c;从而导致弹出框触发元素的位置的变化&#xff0c;此时触发元素位置变化了&#xff0c;但是…

C++ 初阶 类和对象(中)

前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列会持续更新&#xff0c;上学期间将不定时更新&#xff0c;但总会更的 目录 一、构造函数 1.1为什么要有构造函数&…

树状数组 and 线段树

目录 &#x1f996;解释 -- 树状数组 &#xff08;一&#xff09;公式 &#xff08;二&#xff09;操作 (1) 求前缀和 (2) 某个位置上的数更新 &#x1f996;解释 -- 线段树 &#x1f33c;1264. 动态求连续区间和 AC 树状 AC 线段树 &#x1f33c;1265. 数星星 暴…

数字化时代,数据仓库是什么?有什么用?

在激烈的市场竞争和全新的数字经济共同作用下&#xff0c;数字化转型成为了大多数企业的共识&#xff0c;也是获取数字经济的最佳方式。在整个数据价值生产链路中&#xff0c;数据仓库的主要作用就是中心化分发&#xff0c;将原始数据与数据价值挖掘活动隔离。 所有的原始数据…

大数据毕业设计选题推荐-自媒体舆情分析平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Docker学习路线3:安装设置

Docker提供了一个名为Docker Desktop的桌面应用程序&#xff0c;简化了安装和设置过程。还有另一个选项可以使用Docker引擎进行安装。 Docker Desktop网站Docker引擎 Docker Desktop Docker Desktop是一款易于安装的应用程序&#xff0c;可使开发人员快速在其台式机上设置Do…

IntelliJ IDEA Services工具栏运行不显示端口问题解决

问题 如Spring Boot服务启动时&#xff0c;端口不显示。 解决 1、 清理所有缓存 2、 关闭IntelliJ IDEA后&#xff0c;到C:\Users\&#xff08;你自己的用户名&#xff09;\AppData\Local\Temp路径把所有文件都删除&#xff0c;因为时一个缓存&#xff0c;不影响其他软件…

世微 DC-DC平均电流双路降压恒流驱动器 LED车灯AP2813

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外 围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降 压 LED 恒流驱动芯片。内置功率管输出最大功率可达 12W&#xff0c;最大电流 1.2A。 AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换 全亮&#xff0c…

推荐PHP付费进群源码

PHP付费进群源码带自动定位基于ThinkPHP框架开发的&#xff0c;可以快速搭建知识付费粉丝进群。 更新&#xff1a; 1.首页付款轮播 2.城市定位功能 3.更新及优化域名库及支付设置 4.新增一张图模板设置模式&#xff0c;简化后台模板设置 5.前后台其他优化 演示地址&#xff1a…

【Linux进程】环境变量

目录 Linux环境变量 基本概念 常见环境变量 查看环境变量方法 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式 通过代码如何获取环境变量 命令行参数 命令行第三个参数 通过第三方变量environ获取 通过系统调用获取或设置环境变量 ​编辑环境变量通…

【ML】分类问题

分类问题 classification&#xff1a;根据已知样本特征&#xff0c;判断输入样本属于哪种已知样本类。 常用入门案例&#xff1a;垃圾邮件检测、图像分类、手写数字识别、考试通过预测。 分类问题和回归问题的明显区别&#xff1a; 分类问题的结果是非连续型标签&#xff0c…

绝地求生msvcp140.dll丢失报错怎么办,这四个方法都可以解决

在回答这个问题之前&#xff0c;我们先来了解一下什么是msvcp140.dll。msvcp140.dll是微软Visual C 2015 Redistributable的一个组件&#xff0c;它包含了许多运行库文件&#xff0c;用于支持各种应用程序的正常运行。当你在玩《绝地求生》&#xff08;俗称“吃鸡”&#xff09…

网工内推 | 知名港企,需精通粤语,8-10年工作经验,最高60k

01 深圳市网新新思软件有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、制定和执行网络设计、搭建、配置、优化、调整的实施方案&#xff1b; 2、负责网络运维保障工作&#xff0c;包括网络设备的定期巡检、一般网络异常处理、网络调试等日常运行及技术支持…

RHCSA --- 第二天

一、查看IP地址 [rootlocalhost ~] ip ad 对应四张网卡 第一张&#xff1a;环回网卡&#xff08;用于测试&#xff09; 第二张&#xff08;主要&#xff09;&#xff1a;以太网网卡&#xff08;ens160&#xff09; 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>…

【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II

2哥 : 3妹&#xff0c;听说你昨天去面试了&#xff0c;怎么样啊&#xff1f; 3妹&#xff1a;嗨&#xff0c;别提了&#xff0c;让我回去等通知&#xff0c;估计是没有通知了&#xff0c; 还浪费我请了一天假。 2哥 : 你又请假了啊&#xff0c; 你是怎么跟你那个严厉的老板请假…

第二证券:央行、外汇局:实施差别化住房信贷政策;富士康辟谣…

重要的音讯有哪些 国务院附和在海南自贸港暂时调整实施有关行政法规规矩 国务院发布关于附和在海南自由贸易港暂时调整实施有关行政法规规矩的批复。为支撑海南自由贸易港制造&#xff0c;依照《海南自由贸易港制造总体计划》&#xff0c;附和自即日起在海南自由贸易港暂时调…

SAP 销售订单需求 运行MRP 跑不出计划订单? 策略组40

SAP 销售订单需求 运行MRP 跑不出计划订单&#xff1f; 策略组40 1.物料3.1.10101.00098策略组维护40&#xff0c;其他主数据维护完整。 2.VA01创建销售订单10000366 3.MD02运行MRP如图&#xff0c;没有跑出计划订单。这里显然有点问题&#xff0c;40策略&#xff0c;会根据…

vue-admin-templete项目配置在手机上预览

参考文档&#xff1a; https://blog.csdn.net/qq_29752857/article/details/109802801想要在手机上预览本地打开的vue-admin-templete项目&#xff0c;首先要确保手机和电脑在同一网段。 参考文档&#xff1a;https://blog.csdn.net/m0_57236802/article/details/1315234471.查…

一.基本的select语句

目录 一.SQL分类二.SQL语言的规则与规范三.基本的SELECT语句四.显示表结构五.过滤数据 一.SQL分类 SQL语言在功能上主要分为如下3大类: DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;这些语句定义了不同的数据库、表、视图、索引等数据库对…