Redis 字符串类型的典型应用场景

news2024/9/23 5:41:09

目录

1. 缓存功能

2. 计数功能

3. 共享会话(Session)

4. 手机验证码


前言

这里将详细介绍 Redis 字符串类型在实际开发中的几个典型应用场景,并提供相应的伪代码示例。


1. 缓存功能

场景描述

在许多Web应用中,数据通常需要从数据库(如 MySQL)中获取。然而,频繁访问数据库会导致性能瓶颈。为了提高读取速度和减轻后端压力,可以使用 Redis 作为缓存层。大部分请求的数据直接从 Redis 中获取,只有当缓存未命中时才去查询数据库,并更新缓存。

架构图

伪代码实现

UserInfo getUserInfo(long uid) {
    // 根据用户ID生成Redis键
    String key = "user:info:" + uid;
    
    // 尝试从Redis中获取用户信息
    String value = redis.get(key);
    
    if (value != null) {
        // 如果缓存命中,反序列化JSON并返回
        UserInfo userInfo = JSON.parse(value);
        return userInfo;
    }
    
    // 如果缓存未命中,从MySQL中获取用户信息
    UserInfo userInfo = mysql.query("SELECT * FROM user_info WHERE uid = " + uid);
    
    if (userInfo == null) {
        // 如果没有找到用户信息,返回404
        return null;
    }
    
    // 序列化用户信息为JSON格式
    String jsonValue = JSON.stringify(userInfo);
    
    // 将用户信息写入Redis缓存,并设置过期时间为1小时
    redis.set(key, jsonValue, 3600);
    
    return userInfo;
}

注意事项

  • Redis 没有表名、字段名等概念,设计合理的键名有助于防止键冲突和项目的可维护性。
  • 推荐的键名格式是“业务名:对象名:唯一标识:属性”,例如:“vs:user_info:6379”或“u:6379🇫🇷m:5217”。

2. 计数功能

场景描述

许多应用需要统计某些事件的发生次数,例如视频网站中的视频播放次数。Redis 的 INCR 命令非常适合用于快速计数。

架构图

伪代码实现

long incrVideoCounter(long vid) {
    String key = "video:" + vid;
    long count = redis.incr(key);
    return count;
}

注意事项

  • 实际开发中还需要考虑防作弊、按不同维度计数、避免单点问题、数据持久化到底层数据源等问题。

3. 共享会话(Session)

场景描述

在分布式 Web 应用中,用户的 Session 信息(如登录信息)通常存储在各自的服务器上。这可能导致用户每次请求被负载均衡到不同的服务器时,需要重新登录。使用 Redis 可以集中管理 Session 信息,确保无论用户访问哪台服务器都能保持一致的会话状态。

架构图

伪代码实现

// 获取用户Session信息
String getSession(String sessionId) {
    String sessionData = redis.get(sessionId);
    return sessionData;
}

// 更新用户Session信息
void updateSession(String sessionId, String sessionData) {
    redis.set(sessionId, sessionData, 3600); // 设置过期时间为1小时
}

注意事项

  • 确保 Redis 是高可用和可扩展的,以保证系统的稳定性和可靠性。

4. 手机验证码

场景描述

为了安全验证用户身份,很多应用会在用户登录时发送手机验证码。为了避免频繁请求,可以限制用户每分钟获取验证码的频率(例如不超过5次)。Redis 可以用来实现这一功能。

伪代码实现

String sendVerificationCode(String phoneNumber) {
    String key = "shortMsg:limit:" + phoneNumber;
    
    // 设置过期时间为1分钟,只在不存在key时才能设置成功
    boolean r = redis.set(key, "1", 60, "NX");
    
    if (!r) {
        // 如果之前已经设置了该手机号的验证码
        long c = redis.incr(key);
        
        if (c > 5) {
            // 超过了每分钟5次的限制
            return null; // 限制发送
        }
    }
    
    // 生成随机的6位数验证码
    String validationCode = generateRandomCode(6);
    
    String validationKey = "validation:" + phoneNumber;
    // 验证码5分钟内有效
    redis.set(validationKey, validationCode, 300);
    
    // 返回验证码,随后通过手机短信发送给用户
    return validationCode;
}

boolean verifyVerificationCode(String phoneNumber, String validationCode) {
    String validationKey = "validation:" + phoneNumber;
    String storedCode = redis.get(validationKey);
    
    if (storedCode == null) {
        // 没有这个手机号的验证码记录,验证失败
        return false;
    }
    
    return storedCode.equals(validationCode);
}

注意事项

  • 生成的验证码需要有一定的安全性,避免被轻易猜测。
  • 验证码的有效时间应根据具体需求合理设置。

总结

Redis 的字符串类型在多种场景下都非常有用,包括但不仅仅缓存、计数、会话管理和验证码处理。我们可以根据业务灵活运用,毕竟技术是为业务服务的!!感谢阅览!!

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

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

相关文章

【在Linux世界中追寻伟大的One Piece】验证TCP

目录 1 -> 验证TCP-windows作为client访问Linux 1.1 -> TCP client样例代码 1 -> 验证TCP-windows作为client访问Linux 1.1 -> TCP client样例代码 #include <winsock2.h> #include <iostream> #include <string>#pragma warning(disable : …

什么是Rspack?

Rspack 是一个基于 Rust 编写的高性能 JavaScript 打包工具&#xff0c;旨在提供与 webpack 生态系统的强兼容性&#xff0c;允许无缝替换 webpack&#xff0c;并提供极快的构建速度。 介绍 - Rspack 它由字节跳动 Web Infra 团队孵化&#xff0c;具有以下特点&#xff1a; 高…

JS渲染锻炼输入表单

前言 上篇文章为大家展现了好看的信息窗口&#xff0c;接下来我们跟着流程图看下一步 之前我们的带点击事件已经添加完毕&#xff0c;下一步就是当用户点击的时候&#xff0c;渲染锻炼形式&#xff0c;当然这是一个标签&#xff0c;可以提供给用户输入锻炼形式 实例 ● 我…

Codeforces Round 969 (Div. 1) C. Eri and Expanded Sets(线段树维护差分数组gcd+双指针+尺取)

题目 转化一下题意就是&#xff0c; 给定一个n(n<4e5)&#xff0c;代表数组a的长度&#xff0c; 求有多少区间&#xff0c;满足区间内两两差分后得到的新数组的gcd∈{0,1} 实际t(t<1e4)组样例&#xff0c;保证sumn不超过4e5 思路来源 乱搞acjiangly代码 题解 一个…

C/C++内存管理 ——

目录 五、C/C内存管理 1、C/C内存分布 2、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 1.内置类…

SSM框架学习(四、SpringMVC实战:构建高效表述层框架)

目录 一、SpringMVC简介和体验 1.介绍 2.主要作用 3.核心组件和调用流程理解 4.快速体验 二、SpringMVC接收数据 1.访问路径设置 &#xff08;1&#xff09;精准路径匹配 &#xff08;2&#xff09;模糊路径匹配 &#xff08;3&#xff09;类和方法上添加 RequestMapp…

CSP-J 2024 入门组初赛第一轮初赛试题及答案解析

CSP-J 2024 入门组初赛第一轮初赛试题及答案解析 一、 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1 32 位 int 类型的存储范围是&#xff08; &#xff09; A -2147483647 ~ 2147483647 B -21…

【QGIS入门实战精品教程】6.1:QGIS根据属性条件查询数据(SQL表达式)

文章目录 一、字段过滤二、高级过滤(表达式)一、字段过滤 对于单个字段的查询,可以采用字段过滤,例如,从县区数据中,根据NAME字段,查找出县级市玉门市。操作为:右键县区→打开属性表: 点击左下角,选择name字段。 输入玉门市,回车,选择查找除的属性表记录,此时图斑…

汽车总线之----FlexRay总线

Introduction 随着汽车智能化发展&#xff0c;车辆开发的ECU数量不断增加&#xff0c;人们对汽车系统的各个性能方面提出了更高的需求&#xff0c;比如更多的数据交互&#xff0c;更高的传输带宽等。现如今人们广泛接受电子功能来提高驾驶安全性&#xff0c;像ABS防抱死系统&a…

计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

【redis-02】深入理解redis中RBD和AOF的持久化

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756 如需转载&#xff0c;请输入&#xff1a;htt…

2025校招内推-招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

CentOS Stream 9部署docker,并开启API

1、安装docker &#xff08;1&#xff09;安装Docker的依赖项和存储库 sudo dnf install -y dnf-plugins-core sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &#xff08;2&#xff09;安装Docker sudo dnf install -y docke…

0基础学习PyTorch——最小Demo

大纲 环境准备安装依赖 训练和推理训练生成数据加载数据TensorDatasetDataLoader 定义神经网络定义损失函数和优化器训练模型 推理 参考代码 PyTorch以其简洁直观的API、动态计算图和强大的社区支持&#xff0c;在学术界和工业界都享有极高的声誉&#xff0c;成为许多深度学习爱…

yum 集中式安装 LNMP

目录 安装 nginx 安装 mysql 安装 php 配置lnmp 配置 nginx 支持 PHP 解析 安装 nginx 修改yum源 将原本的yum源备份 vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$basearch/ gpgcheck0 enable…

黎巴嫩BP机爆炸事件启示录:我国应加快供应链安全立法

据报道&#xff0c;当地时间9月17日下午&#xff0c;黎巴嫩首都贝鲁特以及黎巴嫩东南部和东北部多地都发生了BP机爆炸事件。当时的统计数据显示&#xff0c;爆炸造成9人死亡&#xff0c;约2800人受伤。9月18日&#xff0c;死亡人数上升到11人&#xff0c;受伤人数超过4000。 目…

14年数据结构

第一题 解析&#xff1a; 求时间复杂度就是看程序执行了多少次。 假设最外层执行了k次&#xff0c;我们看终止条件是kn&#xff0c;则&#xff1a; 有, 内层是一个j1到jn的循环&#xff0c;显然执行了n次。 总的时间复杂度是内层外层 答案选C。 第二题 解析&#xff1a; 一步一…

车辆行人转向意图状态检测系统源码分享

车辆行人转向意图状态检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …

【Python】Maya:为人类打造的 Python 日期时间库

不知道少了什么&#xff0c;总感觉没有以前快乐。 在编程中处理日期和时间总是一个挑战&#xff0c;尤其是当涉及到时间和时区的转换时。Maya 是一个由 Kenneth Reitz 开发的 Python 库&#xff0c;旨在简化日期时间的处理&#xff0c;使其对人类开发者更加友好。本文将介绍 M…

如何在jupyter notebook中使用虚拟环境

一&#xff1a;在cmd中打开已经创建好的虚拟环境 二&#xff1a;安装ipykernel conda install ipykernel 三&#xff1a;安装牛逼conda conda install -c conda-forge nb_conda 四&#xff1a;运行jupyter notebook,选择虚拟环境