当前位置: 首页 > news >正文

Redis——常用数据类型string

目录

    • 常用数据结构(类型)
    • Redis单线程模型
        • Reids为啥效率这么高?速度这么快?(参照于其他数据库)
      • string
        • set
        • get
        • MSET 和 MGET
        • SETNX,SETEX,PSETEX
        • incr,incrby,decr,decrby,incrbyfloat
        • 其他命令
        • 内部编码
        • string类型的应用场景
          • 计数功能
          • 共享会话
          • 手机验证码

常用数据结构(类型)

数据结构(类型)内部编码描述
stringraw最基本的字符串,类似于C++的char数组,或者java的byte数组
intreds通常也可以用来实现一些“计数”这样的功能,当value就是一个整数的时候,此时可能redis会直接使用int来保存
embstr针对短字符串进行的特殊的优化
hashhashtable最基本的哈希表
ziplist压缩列表,一般在哈希表元素比较少的时候可能就优化成ziplist
为啥要压缩?可能某些key的value是hash,此时,如果key特别多,对应的hash也特别多,但是每个hash又不大的情况下,就尽量去压缩,压缩之后就可以让整体占用的内存更小了
listlinkedlist链表
ziplist压缩链表(从redis 3.2开始,引入了新的实现方式quicklist,同时兼顾了linkedlist和ziplist的优点
quicklist就是一个链表,每个元素又是一个ziplist把空间和效率都折中得兼顾到,比较类似于C++的deque(双端队列))
sethashtable哈希表
intset集合中存的都是整数
zsetskiplist跳表,不同于普通的链表,每个节点都有多个指针域,从跳表上查询的元素的时间复杂度是O(logN)
ziplist压缩链表

查看key对应的value的实际编码方式

object encoding key

Redis会根据当前的实际情况选择内部的编码方式

Redis单线程模型

  • Redis只使用一个线程处理所有的命令请求,但不是说Redis服务器进程内部真的只有一个线程,其实也有多个线程,多个线程是在处理网络IO

假设现在有多个客户端,同时操作一个Redis服务器

在这里插入图片描述

当这两个客户端,同时并发的发起上述请求,是否会意味着服务器这边也会存在类似的线程安全问题呢?并不会,Redis服务器是一个单线程模型,保证了当前收到的这么多请求是串行执行的。 在多个请求同时到达Redis服务器,也是要先在队列中排队,再等待Redis服务器一个一个的去处里面的命令再执行,从另一方面看,Redis服务器是串行执行这么多个命令的

注意:Redis能够使用单线程模型很好的工作,原因主要在于redis的核心业务逻辑都是短平快的,消耗cpu资源也就不太吃多核。

Reids为啥效率这么高?速度这么快?(参照于其他数据库)
  1. Redis访问内存,数据库则是访问硬盘
  2. Redis核心功能,比数据库的核心功能更简单(数据库对于数据的增删查改这些功能,势必要花费更多的开销)
  3. 单线程模型,避免了一些不必要的线程竞争开销。
  4. 处理网络IO的时候,使用了epoll这样的IO多路复用机制

string

redis所有的key都是字符串,value的类型是存在差异的,redis中的字符串,直接就是按照二进制的方式存储的(二进制数据(图片,视频,文本,音频,…)),(不建议存储)音视频的体积可能会比较大,Redis对于string类型,限制了大小的最大是512M。

set
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
NX:如果key不存在,才设置 ,如果key存在,则不设置(返回nil)
XX:如果key存在,才设置(相当于更新key的value) ,如果key不存在,则不设置(返回nil)
//[]相当于一个独立的单元,表示可选项 可有可无//set key value ex 10
//相当于 set key value  +  expire key 10
  • 如果key存在,创建新的键值对
  • 如果key存在,则是让新的value覆盖旧的value,可能会改变原来的数据类型,原来的这个key的ttl也会失效
get
GET key//对于GET来说,只是支持字符串类型的value,如果value是其他类型,使用GET就会出错
//例
//127.0.0.1:6379> lpush key3 11 22 33
//127.0.0.1:6379>get key3
(error) WRONGTYPE Operation against akey holding the wrong kind of value
MSET 和 MGET

一次操作多次键值对

MGET key [key ...]
//一次获取对个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil、
//时间复杂度:O(n) n是key的数量
//返回值:对应value的列表MSET key value [key value ...]
//一次设置多个键值对
SETNX,SETEX,PSETEX
  • setnx:不能存在才设置
  • setex:[setex key seconds value] 设置value的同时设置过期时间(秒)
  • psetex:[setex key millionseconds value] 设置value的同时设置过期时间(毫秒)
  • 以上相当于针对set的一些常见写法,进行了缩写
incr,incrby,decr,decrby,incrbyfloat
  • incr:针对value+1
INCR key
//此时的key对应的value必须是整数,如果不是整数会报错
//支持的整数返回为64位的整数,相当于C++中的long long
//返回值:value+1之后的值
//操作的key如果不存在,就会把这个key当做0来使用
  • incrby:针对value+n
INCRBY key n  //用法和incr一样,n可以是负数
  • decr:针对value-1
DECR key // 用法和incr一样 
  • decrby:针对value-n
DECRBY key //用法和INCRBY一样
  • incrbyfloat:针对value +/- 小数
INCRBYFLOAT key floatnum
//把key对应的value进行+-运算,运算的操作数可以是浮点数

上述操作的时间复杂度都是O(1) 由于redis处理命令的时候是单线程模型,多个客户端同时针对同一个key进行incr操作,不会近期“线程安全”问题

其他命令
  • append
APPEND key value//如果key已经存在,并且是一个string,命令会将value追加到原有的string的后面。如果key不存在,则效果等同于set命令
//时间复杂度:O(1)
//返回值:追加完成之后的string的长度(单位是字节,不会对字符编码做处理,如果是中文字符,就按该终端的编码方式来计算,如utf8,一个汉字占3个字节)
//如果要在redis通过get获取中文字符串,需要在redis启动的时候加上一个 --raw这样的选项
//在linux操作的时候,不要乱按ctrl+s(xshell里是冻结当前画面的快捷键)--通过ctrl+q 解冻
  • getrange
GETRANGE key start end
//返回值:string类型的字符串,时间复杂度O(n)//相当于获取字符串的子串 相当于C++中的substr
//在C++中和java中,大多数区间是左闭右开[),但是在redis中 是左闭右闭[start,end]
//正常下标是从0开始的整数,redis的下标是可以支持负数的(表示倒数第几个)
  • setrange
SETRANGE key offset value//返回值:替换之后的新的字符串的长度
//offset为偏移量
//如果当前是中文字符串,进行setrange的时候可能会出现问题
//如果字符串不存在偏移量之前的内容会自动补上0x00 之后内容添加到最后一个0x00的后面
  • strlen
STRLEN key//获取到的字符串的长度    单位是字节
内部编码

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

  • int:8个字节的长整形
  • embstr:小于等于39个字节的字符串
  • raw:大于39个字节的字符串

查看key对应的value的编码方式

OBJECT encoding key

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

  • 如果某个业务场景,有很多很多的key,类型都是string,但是每个value的string长度都是100左右,如果更关注与整体的内存空间,也可以考虑使用emstr,所以39这个数字只是对于通用的,对于不用的场景,可能会有不同的需求
string类型的应用场景

在这里插入图片描述

整体思路:

应用服务器访问数据的时候,先查询redis,如果redis上的数据已经存在了,就直接从redis取数据交给应用服务器,不继续访问数据库了

如果Redis上数据不存在,再读取Mysql,把读到的结果,返回给应用服务器同时,把这个数据也写入到Redis中

但是随着时间的推移,肯定会有越来越多的key在redis上访问不到,从而mysql读取并写入redis,此时数据就越来越多了

所以可与在把数据写给redis的同时,给这个key设置一个过期时间,当然Redis也在内存不足的时候,提供了淘汰策略

计数功能

许多应用都会使用Redis作为计数的基础工具,他可以实现快速计数,查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。例如用户每播放一次视频,视频的播放次数就加一

共享会话

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

在这里插入图片描述

如果每个应用服务器,维护自己的会话数据,此时彼此之间不共享,用户请求访问到不同的服务器上,就可能会出现一些不能正确处理的情况,这时候就可以用Redis将所有的管理起来

在这里插入图片描述

此时所有的会话数据,都被各个服务器共享了

手机验证码
  1. 生成验证码,用户输入手机号,获取验证码(限制1分钟内,最多获取5次验证码,或者每次获取验证码必须间隔30s)
  2. 检查验证码,把短信收到的验证码这一串数提交到系统中,系统进行验证验证码是否正确

相关文章:

Redis——常用数据类型string

目录 常用数据结构(类型)Redis单线程模型Reids为啥效率这么高?速度这么快?(参照于其他数据库) stringsetgetMSET 和 MGETSETNX,SETEX,PSETEXincr,incrby,decr…...

架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间

本文首发在这里 重中之重就是想实现无锁!无锁!无锁! 源码 servergolang 预计还会实现gate_server,接受并保持websocket长连接,按需双向流到game_server进行消息转发 未来上述服务均会以容器的形式由k8s自动化部署、…...

个人随想-gpt-o1大模型中推理链的一个落地实现

​首先祝大家中秋节快乐。 最近openai又推出了新的模型openai o1​还有它的mini版。官网的介绍,就是它的推理能力很强,比gpt-4o​有很大的提升。 最近也跟同行在聊这个o1,​看看落地方面有哪些可行性。在我们自己的实验上,把o1用…...

python解析ip范围,判断ip是否在ip范围内

目录 1. 背景 2. 代码使用示例 2.1 分割ip,横杠 (-) 的ip范围 2.2 判断ip在掩码(/)的范围内 2.3 判断ip在横杠(-)的范围内 2.3.1 格式:192.168.1.1-192.168.1.10 2.3.2 格式&…...

Springboot错误日志切面,找到post请求体被消费后的数据

问题记录:测试环境接口报错,日志里没有请求参数等信息,于是写了一个切面,但切面中获取不到 request的请求体,因为 post 请求体只能被消费一次,于是找解决办法 解决方法 既然 request 被消费了导致对应的请…...

【二十】【QT开发应用】listwidget右键菜单和删除item

创建项目,添加资源文件 在项目文件夹中创建resources资源文件夹。 在vs中打开qrc文件,选择添加资源文件。 选择我们resources资源文件中的所有文件作为资源文件。 最后不要忘记点击保存。 向ListWidget控件添加item 右键菜单 在.h文件中添加QMenu头…...

LabVIEW机动车动态制动性能校准系统

机动车动态制动性能测试系统通过高精度的硬件设备与LabVIEW软件的紧密配合,实现了对机动车制动性能的精确校准与评估。系统不仅提高了测试的精确性和效率,而且具备良好的用户交互界面,使得操作更加简便、直观。 项目背景 随着机动车辆数量的…...

Linux(CentOS8)服务器安装RabbitMQ

我安装了很久都没有成功, 各种问题, 每次的异常都不一样, 现将成功安装过程做个总结 安装前工作 确保已经安装了一些基础工具和组件库 下载安装包 https://www.erlang.org/patches/otp-24.3.4.5 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.15/ra…...

R语言进行无序多分类Logistic回归

在临床研究中,接触最多的是二分类数据,如淋巴癌是否转移,是否死亡,这些因变量最后都可以转换成二分类0与1的问题。然后建立二元logistic回归方程,可以得到影响因素的OR值。但有时我们也会接触到多分类结局数据&#xf…...

Maven从入门到精通(三)

一、Settings 配置 settings.xml 用来配置 maven 项目中的各种参数文件,包括本地仓库、远程仓库、私服、认证等信息。 全局 settings、用户 setting、pom 的区别: 全局 settings.xml 是 maven 的全局配置文件,一般位于 ${maven.home}/conf…...

Red Hat 和 Debian Linux 对比

原图的作者(https://bbs.deepin.org/post/209759) Red Hat Enterprise Linux https://www.redhat.com/ CentOS Linux https://www.centos.org/ Fedora Linux https://fedoraproject.org/ Debian https://www.debian.org/ Ubuntu https://cn.ubuntu.com/ https://ubuntu.c…...

Axure设计之全屏与退出全屏交互实现

在Axure RP中,设计全屏与退出全屏的交互功能可以极大地提升用户体验,尤其是在展示产品原型或进行演示时。本文将详细介绍如何在Axure RP中通过结合JavaScript代码实现全屏与退出全屏的交互效果。 ​ Axure原型设计web端交互元件库:https://…...

如何测试出自己电脑的网络速度(网速)?

首先电脑上要下载一个这样的一个电脑软件:360安全卫士 1、打开软件之后,选择【网络安全】 2、选择【宽带测速器】 3、点击之后,即可开始检测当前网络速度,等待大概十几秒后会出现结果,如下: 位置①:显示…...

如何利用AI进行有效的科技产品发布

如果你们公司即将推出一款具有颠覆性的软件,你大概已经了解了科技在现代市场中的价值。 但像AI这样的技术不仅仅是有效的产品组成部分,它们还可以帮助将这些产品推向客户(或安装到他们的电脑上)。 Kuno Creative明白AI在科技营销…...

二层、三层网络基本原理

文章目录 二层网络整体拓扑相关配置配置namespace创建switch创建veth设备配置veth的IP启动veth 测试 三层网络配置vm1配置vm2配置 测试 二层网络 我们用Linux bridge模拟现实中的switch,用namespace模拟连接在交换机上的pc 整体拓扑 ------------------ ----…...

全面掌握 Jest:从零开始的测试指南(上篇)

随着JavaScript在前后端开发中的广泛应用,测试已成为保证代码质量的关键环节。 为什么需要单元测试 在我们的开发过程中,经常需要定义一些算法函数,例如将接口返回的数据转换成UI组件所需的格式。为了校验这些算法函数的健壮性,部…...

Go 交叉编译

Mac 下编译 Linux 和 Windows 64位可执行程序 Linux: CGO_ENABLED0 GOOSlinux GOARCHamd64 go build main.go Windows: CGO_ENABLED0 GOOSwindows GOARCHamd64 go build main.go Linux 下编译 Mac 和 Windows 64位可执行程序 Mac: CGO_ENABLED0 G…...

goctl安装失败

今天遇到一个很奇怪的问题 在阿里云的ubuntu服务器上远程安装goctl:go install github.com/zeromicro/go-zero/tools/goctllatest,后面会断开ssh连接,就再也连不上了,connecting with ssh timed out。在阿里云的workbench上连接显…...

DebateGPT:通过多智能体辩论监督微调大模型

人工智能咨询培训老师叶梓 转载标明出处 这些模型的训练通常依赖于资源密集型的人工反馈,这不仅成本高昂,而且耗时。为了解决这一问题,一篇名为《FINE-TUNING LARGE LANGUAGE MODELS WITH MULTI-AGENT DEBATE SUPERVISION》的论文提出了一种…...

【最新综述】基于深度学习的超声自动无损检测(下)

4.Levels of automation 5.Basic axioms for DL-based ultrasonic NDE 在回顾了最新技术和每个自动化级别的贡献之后,我们不难发现,目前的数字语言方法论在不同论文之间存在着很大的差异。例如,有些作者提出了同时处理不同步骤的模型[121]&…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...