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

news2024/9/28 5:28:33

目录

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 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;
    }
}

注意:

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

总结

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

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

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

相关文章

计算机网络基础知识分享

计算机网络基础知识分享 发送一个http请求,从客户端到服务器端,都经历了什么? **Ⅰ,浏览器生成消息 ** (1)浏览器输入网址 我们的探索之旅从在浏览器中输入网址开始,网址,准确来说应该叫 UR…

鸿蒙4.0基础开发教程

开发准备 熟悉鸿蒙官网安装DevEco studio开发工具 熟悉官网和安装开发工具视频,本套笔记基于这套视频所写 ArkTS语言 ArkTs语言文档 例如在页面做个按钮并带有点击效果需要html,css,js共同完成 html(按钮标签)-css(按钮样式)-js(控制按钮点击操作) 当学完了ArkTs即可以同时…

K8S三台服务器一键部署总结

随着互联网、云计算技术的深入发展,为降低企业大规模云应用建设的难度和成本,支持云应用开发、运行与运维一体化的云应用平台软件应运而生。在数通家族中对企业集成套件的云平台开发、部署、管理、运维进行统一管理,实现数据集成和共享的平台…

【Linux系统基础】(6)在Linux上大数据NoSQL数据库HBase集群部署、分布式内存计算Spark环境及Flink环境部署详细教程

大数据NoSQL数据库HBase集群部署 简介 HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。 和Redis一样,HBase是一款KeyValue型存储的数据库。 不过和Redis设计方向不同 Redis设计为少量数据,超快检索HBase设计为海量数据,…

基于深度学习的瓷砖色差分类方法研究——学习笔记(评价:色差的定义太模糊。。。问题描述不清楚,太水了)

文章目录 摘要0 引言1 瓷砖图像处理1.1 图像采集1.2 图像处理 2 基于深度学习的瓷砖色差分类算法设计2.1 数据预处理2.2 卷积神经网络的设计2.3 实验设计 3 瓷砖色差分类平台的设计与实现 摘要 瓷砖是人类建筑不可或缺的一种材料,而瓷砖品质最重要的指标之一就是色…

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

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

一个利用摸鱼时间背单词的软件

大家好,我是 Java陈序员。 最近进入了考试季,各种考试,英语四六级、考研、期末考等。不知道大家的英语四六级成绩怎么样呢? 记得大学时,英语四级都是靠高中学习积累的老本才勉强过关。 而六级则是考了多次&#xff…

cesium实现二三维联动

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

【Datawhale 大模型基础】第十一章 环境影响

第十一章 环境影响 This blog is based on datawhale files and a paper. The initial consideration revolves around the potential positive or negative direct impact on the environment. Other transformative technological advancements, like the metaverse, are li…

Redis-实践知识

转自极客时间Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义&#xff0c;但是最好遵循下面几个实践的约定&#xff1a; 格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…

C语言蛇形矩阵

文章目录 每日一言题目解题思路全部代码结语 每日一言 山有榛&#xff0c;隰有苓。云谁之思&#xff1f;西方美人。 --邶风简兮 题目 解题思路 话不多说&#xff0c;直接看图 通过观察图表&#xff0c;我想到了这种方法&#xff1a; 我将数字放置的位置分为两大类&#xff…

VMware虚拟机的安装配置

目录 一. VMware虚拟机的安装 二. VMware配置虚拟机 三. VMware安装windows server 2012 一. VMware虚拟机的安装 1. 双击安装&#xff0c;点击下一步 2. 勾选接受许可&#xff0c;点击下一步 3. 选择安装位置&#xff0c;点击下一步 4. 用户体验设置&#xff08;可选&#…

Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系

本文为学习所用&#xff0c;严禁转载。 本文参考链接 https://zhuanlan.zhihu.com/p/667382398 QPSK代码及高斯白噪声如何产生 https://ww2.mathworks.cn/help/signal/ref/butter.html 滤波器 https://www.python100.com/html/4LEF79KQK398.html 低通滤波器 本实验使用matlab仿…

LeetCode刷题--- 字母大小写全排列

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回…

磁钢的取向和充磁方向

充磁是磁钢生产中的必备工序&#xff0c;如果磁铁不充磁&#xff0c;就不具备磁性&#xff0c;也就丧失了作为永磁材料的基本功能。磁钢作为一个立体的工件&#xff0c;形状和尺寸各异&#xff0c;如何给磁钢充磁&#xff1f;不同方向的充磁效果一样吗&#xff1f;今天我们就来…

Spring源码分析---Bean 的生命周期 03

来源&#xff1a;Spring 3. Bean 的生命周期 自定义一个 SpringBoot 的主启动类&#xff1a; SpringBootApplication public class A03Application {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03Applicatio…

什么牌子国产主食冻干猫粮好?十大放心猫粮国产名单前五名推荐

很多新手铲屎官在为自家猫咪购买猫食品时&#xff0c;都会非常注重成分和安全性。养了这么多年的猫&#xff0c;可以说&#xff0c;他们购买过的猫食品数量一定比大多数人都要多。自从冻干猫粮流行起来之后&#xff0c;很多铲屎官都开始给自家的猫咪喂冻干。冻干不仅可以作为主…

视觉学习(3) —— 使用调试助手与视觉连接

Modbus Slave 进入之后 点击进入 OK后 此处就代表完成&#xff0c;若是没有连接完成就如下图 回到视觉 将视觉参数设置好后&#xff0c;回到Modbus Slave&#xff0c;点击进行连接

postman的下载安装和使用

第一章、使用postman向后端发送请求 1.2&#xff09;postman下载与安装使用 我的百度网盘postman点击下载 提取码&#xff1a;bybp 下载后双击.exe文件直接安装 点击此次创建集合 点击此处创建请求 1.2&#xff09;发送get请求 选择自己的请求方式&#xff0c;输入请求…

vue3 配置 @符号

config,ts 配置 有 爆红 安装 npm install 一下 然后 配置 路径提示功能 tsconfig.json 配置 路径提示功能 一共这两个路径配置