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. 检查验证码,把短信收到的验证码这一串数提交到系统中,系统进行验证验证码是否正确

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go多线程

1、简单使用(这个执行完成,如果进程执行比较久,这里不会等待它们结束) package mainimport "time"func main() {go func() {println("Hello, World!")}()time.Sleep(1 * time.Second) }2、wg.Add(数量)使用&…

STM32 定时器 输入捕获

定时器输入捕获 1 工作原理1.1 单个通道的工作原理 2 输入滤波2.1 输入滤波原理 3 边沿检测3.1 边沿检测3.2 信号选择 4 分频5 通道使能 1 工作原理 1.1 单个通道的工作原理 2 输入滤波 2.1 输入滤波原理 fck_INT:内部时钟频率,当PCLKx_Pre为1时&…

prometheus 集成 grafana 保姆级别安装部署

前言 本文 grafana 展示效果只需要 prometheus node_exporter grafana 其他的选择安装 环境和版本号 系统: CentOS 7.9 prometheus: 2.54.1 pushgateway: 1.9.0 node_exporter: 1.8.2 alertmanager: 0.27.0 grafana:11.2.0 官网:https://prometheus.io/ 下载地址:h…

软件测试 | APP测试 —— Appium 的环境搭建及工具安装教程

大家应该都有同一种感觉,学习appium最大的难处之一在于环境的安装,安装流程比较繁琐,安装的工具和步骤也较多,以下是基于Windows系统下的Android手机端的安装流程。就像我们在用Selenium进行web自动化测试的时候一样,我…

Gin渲染

HTML渲染 【示例1】 首先定义一个存放模板文件的 templates文件夹&#xff0c;然后在其内部按照业务分别定义一个 posts 文件夹和一个 users 文件夹。 posts/index.tmpl {{define "posts/index.tmpl"}} <!DOCTYPE html> <html lang"en">&…

计算机毕业设计 视频点播网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

day22JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候&#xff0c;服务器可以吐出一个写好的指定页面。 实现思路&#xff1a; 1、先判断要找的路径是否是文件&#xff0c;如果是文件&#xff0c;就加载发给对方。 2、如果是文件夹&#xff0c;找到这个文件夹所在路径中…

Spring Boot基础

项目创建 项目启动 请求响应 RestController 1.返回值处理 RestController&#xff1a;这个注解结合了Controller和ResponseBody的功能。它默认将所有处理请求的方法的返回值直接作为响应体内容返回&#xff0c;主要用于构建RESTful API。返回的数据格式通常是JSON或XML&…

Linux:软件包管理器 yum和编辑器-vim使用

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;软件包管理器 yum和编辑器-vim使用》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点…

整流电路的有源逆变工作状态

目录 1. 逆变的概念 2. 有源逆变的条件 3. 电流电路的概念 4. 产生逆变的条件 5. 三相桥式全控整流电路的有源逆变工作状态 6. 逆变角的概念 7. 逆变失败的原因 8. 最小逆变角的限制 整流电路的有源逆变状态是指通过控制整流器&#xff0c;使其将直流电源的能量反向送回…

[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题

文章目录 一、前言二、命令行窗口修改编码为UTF-8三、Visual Studio 2022修改编码为UTF-8四、Eclipse修改编码为UTF-8五、DevCPP修改编码为UTF-8六、Sublime Text修改编码为UTF-8七、PyCharm、IDEA、VS Code及Python自带解释器修改编码为UTF-8 一、前言 在学习的征途中&#x…

close_wait状态的实例:一次 MySQL 主动关闭,导致服务出现大量 CLOSE_WAIT 的全流程排查过程【个人总结】

没有实际的操作设备和条件&#xff0c;只能看文章来体验。文章主要是通过观察实例来说明close_wait状态的问题&#xff0c;一般导致close_wait状态都不是有意的&#xff0c;而是操作不注意就会导致此问题的出现。所以在代码书写上一定要确保不会出现问题。 事件&#xff1a;so…

【变化检测】基于ChangeStar建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、ChangeStar模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113&#xff0c;onnxruntime-gpu1.12.0 likyoo变化检测源码&#xff1a;https://github.c…

【路径规划】WDM网络中RWA问题的教育网络规划工具(基于MILP和启发式)

摘要 MatPlanWDM 是一款专用于波分复用&#xff08;WDM&#xff09;网络的规划工具&#xff0c;旨在解决波长路由与分配&#xff08;RWA&#xff09;问题。该工具结合了线性混合整数规划&#xff08;MILP&#xff09;和一系列启发式算法&#xff0c;为用户提供了多种网络规划选…

开发类似途虎养车的汽修店管理系统

在这个数字化时代&#xff0c;越来越多的传统行业开始拥抱新技术&#xff0c;以提升效率和服务质量。汽修行业也不例外&#xff0c;途虎养车凭借其强大的数字化方案&#xff0c;在行业内树立了标杆。今天&#xff0c;我们将介绍途虎养车数字化方案的优点&#xff0c;并为您呈现…

R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例

偶然间读到一篇文章&#xff0c;分享06年《书摘》的内容&#xff0c;今天来看都不过时&#xff0c;所以起了找下这本老杂志合集的心思。 傅佩荣先生《哲学与人生》选段 “如果有人觉得活着很辛苦&#xff0c;面对自己又感觉无聊乏味&#xff0c;那么他应该多接触自然界。我有个…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题四

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

TCP Analysis Flags 之 TCP ZeroWindow

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

图数据库的力量:深入理解与应用 Neo4j

图数据库的力量&#xff1a;深入理解与应用 Neo4j 文章目录 图数据库的力量&#xff1a;深入理解与应用 Neo4j1、什么是 Neo4j&#xff1f;版本说明 2、Neo4j 的部署和安装Neo4j Web 工具介绍 3、体验 Neo4j加载数据查询数据数据结构 4、Cypher 入门创建数据查询数据关系深度查…

new/delete和malloc/free到底有什么区别

new和malloc 文章目录 new和malloc前言一、属性上的区别二、使用上的区别三、内存位置的区别四、返回类型的区别五、分配失败的区别六、扩张内存的区别七、系统调度过程的区别总结 前言 new和malloc的知识点&#xff0c;作为一个嵌入式工程师是必须要了解清楚的。new和malloc的…