[Redis][String][下]详细讲解

目录

  • 1.其他命令
    • 1.APPEND
    • 2.GETRANGE
    • 3.SETRANGE
    • 4.STRLEN
  • 2.内部编码
  • 3.典型使用场景
    • 1.缓存(Cache)功能
    • 2.计数(Counter)功能
    • 3.共享会话(Session)


1.其他命令

1.APPEND

  • 功能
    • 如果key已经存在并且是⼀个string,命令会将value追加到原有string的后边
    • 如果key不存在, 则效果等同于SET命令。
  • 语法APPEND KEY VALUE
  • 时间复杂度 O ( 1 ) O(1) O(1),追加的字符串⼀般⻓度较短,可以视为 O ( 1 ) O(1) O(1)
  • 返回值:追加完成之后string的⻓度(单位是字节)

2.GETRANGE

  • 功能:返回key对应的string的⼦串,由startend确定(左闭右闭)
    • 可以使⽤负数表⽰倒数:-1代表倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似
    • 超过范围的偏移量会根据string的⻓度调整成正确的值
    • 注意:如果字符串中保存的是汉字,此时进行字串切分,切出来的很可能不是完成的汉字
  • 语法GETRANGE key start end
  • 返回值string类型的字串
  • 时间复杂度 O ( N ) O(N) O(N),N为[start, end]区间的⻓度,由于string通常⽐较短,可以视为是O(1)

3.SETRANGE

  • 功能:覆盖字符串的⼀部分,从指定的偏移开始
    • 注意:针对不存在的key,也可以操作,不过会把offset之前的内容填充成0x00
  • 语法SETRANGE key offset value
  • 返回值:替换后的string的长度
  • 时间复杂度 O ( N ) O(N) O(N),N为value的⻓度,由于string通常⽐较短,可以视为是O(1)

4.STRLEN

  • 功能:获取key对应的string的长度,当key存放的类型不是string时,报错
  • 语法STRLEN key
  • 返回值
    • string的⻓度
    • key不存在时,返回0
  • 时间复杂度 O ( 1 ) O(1) O(1)

2.内部编码

  • 字符串类型的内部编码有3种
    • int:8个字节的长整形
    • embstr:小于等于39个字节的字符串
    • raw:大于39个字节的字符串
  • Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现
# 整形
> set key 2333
OK
> object encoding key
"int"# 短字符串
> set key "hello"
OK
> object encoding key
"embstr"# ⼤于39个字节的字符串
> set key "one string greater than 39 bytes ........"
OK
> object encoding key
"raw

3.典型使用场景

1.缓存(Cache)功能

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

  • 模拟以上业务数据访问过程

    • 根据用户uid获取用户信息
      UserInfo GetUserInfo(long uid) { ... }
      
    • 先从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;
      }
      
    • 如果没有从Redis中得到⽤⼾信息,及缓存miss,则进⼀步从MySQL中获取对应的信息,随后写⼊缓存并返回
      // 如果缓存未命中(miss)
      if (value == null)
      {// 从数据库中,根据 uid 获取⽤⼾信息UserInfo userInfo = MySQL 执⾏ SQL:select * from user_info where uid = <uid>// 如果表中没有 uid 对应的⽤⼾信息if (userInfo == null){响应404return null;}// 将⽤⼾信息序列化成 JSON 格式String value = JSON 序列化 (userInfo);// 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600秒)Redis 执⾏命令: set key value ex 3600// 返回用户信息return userInfo;
      }
      
  • 通过增加缓存功能,在理想情况下,每个⽤⼾信息,⼀个⼩时期间只会有⼀次MySQL查询,极⼤地提升了查询效率,也降低了MySQL的访问数

  • 注意

    • 与MySQL等关系型数据库不同的是,Redis没有表、字段这种命名空间,⽽且也没有对键名有强制要求(除了不能使⽤⼀些特殊字符)
    • 但**设计合理的键名,有利于防⽌键冲突和项⽬的可维护性**,⽐较推荐的⽅式是使⽤"业务名:对象名:唯⼀标识:属性"作为键名
      • 例如:MySQL的数据库名为vs,⽤⼾表名为user_info
        • 那么对应的键可以使⽤ “vs:user_info:2333"、"vs:user_info:2333:name” 来表⽰
        • 如果当前Redis只会被⼀个业务使⽤,可以省略业务名"vs:"
    • 如果键名过长,则可以使⽤团队内部都认同的缩写替代
      • 例如:"user:2333:friends:messages:6666"可以被"u:2333:fr:m:666"代替
      • 毕竟键名过⻓,还是会导致Redis的性能明显下降的

2.计数(Counter)功能

  • 许多应⽤都会使⽤Redis作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数 据可以异步处理或者落地到其他数据源
    请添加图片描述

  • 示例:在Redis中统计某视频的播放次数

    long IncrVideoCounter(long vid) 
    {key = "video:" + vid;long count = Redis 执⾏命令:incr keyreturn counter;
    }
    

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


3.共享会话(Session)

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

  • 问题解决:使⽤Redis将⽤⼾的Session信息进⾏集中管理,在这种模式下,只要保证Redis是⾼可⽤和可扩展性的,⽆论⽤⼾被均衡到哪台Web服务器上,都集中从Redis中查询、更新Session信息
    请添加图片描述

  • 示例:手机验证码

    String SendCapcha(String phoneNumber)
    {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为1分钟// 使用NX,只在不存在key时才能设置成功bool r = Redis 执行命令:set key ex 60 nxif(r == false){// 说明之前设置过该手机的验证码了long c = Redis 执行命令:incr keyif(c > 5){// 说明超过一分钟5次的限制了// 限制发送return null;}}// 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次String validationCode = ⽣成随机的 6 位数的验证码 ();validationKey = "validation:" + phoneNumber;// 验证码 5 分钟内有效Redis 执⾏命令: set validationKey validationCode ex 300;// 返回验证码,随后通过手机短信发送给用户return validationCode;
    }// 验证用户输入的验证码是否正确
    bool VerifyCode(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.xdnf.cn/news/146171.html

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

相关文章

第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)

这节记录下如何使用redis缓存数据库。 第一步&#xff1a; 先在服务器端安装redis&#xff0c; 下载地址&#xff1a;Releases tporadowski/redis GitHub。 第二步&#xff1a; 安装redis客户端可视化管理软件redisDesktopmanager Redis Desktop Manager - Download 第…

11. DPO 微调示例:根据人类偏好优化LLM大语言模型

在部署大模型之后&#xff0c;我们必然要和微调打交道。现在大模型的微调有非常多的方法&#xff0c;过去的文章中提到的微调方法通常依赖于问题和答案对&#xff0c;标注成本较高。 2023 年所提出的 Direct Preference Optimization&#xff08;DPO&#xff09;为我们提供了一…

C++——map和set的使用以及map系列

目录 map和set的使用 1. 序列式容器和关联式容器 2. set系列的使⽤ 2.1 set和multiset参考⽂档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 set的增删查关注以下⼏个接⼝即可&#xff1a; 2.6 find和erase使⽤样例&#xff1a; lower_bound(); upper_bo…

Python 从入门到实战23(属性property)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类的定义、使用方法的相关知识。今天我们将学…

uboot:源码分析-启动第一阶段-start.S解析

start.S引入 进入start.S文件中&#xff0c;发现57行中就是_start标号的定义处 SourceInsight中添加行号 在SI中&#xff0c;如果我们知道我们要找的文件的名字&#xff0c;但是我们又不知道他在哪个目录下&#xff0c;我们要怎样找到并打开这个文件&#xff1f;方法是在SI中先…

教你快速制作一本3D翻页电子杂志

​在制作3D翻页电子杂志之前&#xff0c;我们需要了解一些基本概念。3D翻页电子杂志主要通过翻页效果来展示内容&#xff0c;读者可以通过手指滑动或点击鼠标来进行翻页。此外&#xff0c;它还支持图片、文字、视频等多种媒体形式的展示&#xff0c;为读者带来全方位的阅读体验…

KTH5774 —— 3D 摇杆/操纵杆霍尔位置传感器芯片

KTH5774 是一款摇杆、操纵杆专用的 3D 霍尔磁感 应芯片&#xff0c;主要面向对线性度和可靠性要求严格的应用 场景。 KTH5774 基于 3D 霍尔技术&#xff0c;内部分别集成了 X 轴、 Y 轴和 Z 轴三个独立的霍尔元件&#xff0c;能够通过测量和 处理磁通密度矢量的三个空间分量…

决策树算法中篇

手动计算实现决策树分类 数据整合 X[真实用户] y X 计算未划分信息熵 s X[真实用户] p s.value_counts()/s.size (p * np.log2(1/p)).sum() 按照日志密度进行划分 x X[日志密度].unique() x.sort() # 如何划分呢&#xff0c;分成两部分 for i in range(len(x) - 1):sp…

Checkstyle 使用总结

1. 使用 GitHub 地址&#xff1a;checkstyle/checkstyle: Checkstyle is a development tool to help programmers write Java code that adheres to a coding standard. 官网文档地址&#xff1a;checkstyle – Checkstyle 10.17.0 1.1 IDEA 插件 在 IDEA 搜索插件 CheckS…

DOS(Disk Operating System,磁盘操作系统)常用指令

目录 背景: 早期探索: DOS之父&#xff1a; 发展历程&#xff1a; 常用指令&#xff1a; 进入命令&#xff1a; 操作1.进入和回退&#xff1a; 操作2.增、删&#xff1a; 操作3.其它&#xff1a; 总结: 背景: 早期探索: DOS(Disk Operating System,磁盘操作系统)在…

基于云的补丁管理

什么是云补丁 云补丁或基于云的补丁管理是指扫描和检测缺失补丁、测试补丁并将它们部署到所需系统的过程&#xff0c;所有这些都通过基于云的控制台或软件完成。虽然补丁管理工作流程通常保持不变&#xff0c;但基于云的补丁管理的主要区别在于&#xff0c;整个过程仅通过基于…

数据跨境流通发展现状浅析

文章目录 前言一、数据跨境流通的场景二、数据跨境流通国内发展现状三、数据跨境流通国外发展现状1、国外的数据跨境政策类型&#xff1a;&#xff08;1&#xff09;美国以数据自由流动为核心&#xff08;2&#xff09;欧盟将人权保护作为首要考虑&#xff08;3&#xff09;俄罗…

2.1 SQL语言及如何创建数据表

一、什么是SQL语言 SQL语言全称叫做结构化查询语言&#xff0c;它是一种计算机语言&#xff0c;但是跟其他编程语言来比较还是有很大区别的。比如说HTML&#xff0c;CSS&#xff0c;Java script&#xff0c;这三种计算机语言是用在网页设计上面的。那么swift语言是用来开发IOS…

反转字符串中的单词--力扣151

反转字符串中的单词 题目思路代码 题目 思路 题目的难点在于首先要清除多余的空格&#xff0c;并且单词之间要留一个空格&#xff0c;首单词前和末尾单词后不能有多余空格。我们使用双指针去除所有的空格&#xff0c;然后在处理完一个单词后手动加一个单词。具体思路是当快指针…

k8s快速搭建+prometheus部署及使用(纯干货!!!)

目录 环境准备 1.所有主机安装docker 2.部署harbor 3.部署k8s 集群初始化 安装网络插件&#xff08;此时选择的是flannel网络插件 后面也有calico网络插件的安装方法&#xff09; 节点扩容 4.calico网络插件的部署&#xff08;如果安装了flannel插件需要先删除&#xf…

web前端-HTML常用标签-综合案例

如图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document&…

LlamaIndex 中的 NodeParser

LlamaIndex 中 Document 会被转成 Node,Node 中的文字会进行 Embedding,最终保留向量数据做后续的搜索处理。这里的关键步骤是 Document 转为 Node 的策略,LlamaIndex 内置了多个 Document Reader 和 Node Parser,每个 NodeParser 都有自己的策略,需在初始化时进行设置。 …

基于springboot+vue超市管理系统

基于springbootvue超市管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本无人超市管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

STM32如何修改外部晶振频率和主频

对于STM32F10x系列的单片机&#xff0c;除了STM32F10x_CL单片机&#xff0c;其它的单片机一般外部晶振HSE的时钟频率都默认是8MHz。如果我们使用的外部晶振为12Mhz&#xff0c;那么可以把上图绿色标记改为:12000000 72MHz的主频8MHz的外部晶振HSE*倍频系数9。当然如果像上面把外…

四款好用的电脑录屏工具推荐!!

在科技日益发展的今天&#xff0c;屏幕录制已成为我们工作、学习和娱乐中不可或缺的一部分&#xff1b;无论是制作教程、记录游戏过程还是分享精彩瞬间&#xff0c;一个好的录屏工具都是不可或缺的&#xff1b;今天&#xff0c;我就为大家推荐四款实用又好用的电脑录屏工具&…