Redis中的String数据类型及相关命令

[经典面试题] redis虽然是单线程模型,为什么效率还这么高?速度这么快呢?

原因:1、redis主要访问内存数据库则是主要访问硬盘

          2、redis的核心功能,比数据库的核心功能更简单。数据库对于数据的CRUD,都有更复杂的功能支持。这样的功能势必要花费更多的开销。

          3、redis采取了单线程模型,避免了一些不必要的线程竞争开销。redis的每个基本操作,都是短平快的,不会特别消耗cpu资源。

          4、redis在处理网络IO的时候,使用了epoll这样的IO多路复用机制

:IO多路复用:让一个线程可以管理多个socket。针对TCP来说,服务器这边每次要服务一个客户端,都要给这个客户端安排一个socket。但是很多情况下,每个客户端和服务器之间的通信并不频繁。此时socket大部分时间都是静默的,上面是没有数据需要传输的。同一时刻,只有少数socket是活跃的。

String相关命令

:redis中,所有的key默认都是String类型,而value则有各种各样的类型(整数,字符串,JSON.....)

关于set命令

将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。

EX:   set key value ex 10 就相当于set key value 和 expire key 10两个命令组合起来。即创建键值对同时设置键值对的过期时间。单位是秒

PX: 同上,单位是ms

NX:如果key不存在(创建新的键值对),才设置。如果key存在,则不设置(返回nil)

XX:如果key存在,才设置(相当于更新key的value)。如果key不存在,则不设置(返回nil)

MSET/MGET

  可以一次操作多组键值对。通过一次网络通信完成多个键值对操作,减少网络通信时间。

如:mset key1 111 key2 222 key3 333     mget key1 key2 key3

时间复杂度:O(n)  n是key的数量

SETNX/SETEX/PSETEX

针对set的一些常见方法,进行了缩写。

SETNX:  即set命令搭配NX。

SETEX: set命令搭配EX。设置过期时间。

PSETEX:set命令搭配PX,单位ms。

时间复杂度:O(1)

incr/incrby/decr/decrby/incrbyfloat

这组命令是针对value为整数类型进行修改的。返回值就是 修改之后的值。

incr: 针对value +1

incrby: 针对value + n, n可以手动指定

decr:针对value -1

decrby: 针对 value - n

incrbyfloat: 针对value + / - 小数。上述命令都针对整数,incrbyfloat可以操作浮点数

:incr操作的key如果不存在,就会把这个key的value当做0来使用。

时间复杂度:O(1)

append/getrange/setrange/srtlen

append:如果key存在并且是一个string,命令会将value追加到原有string的后边。如果key不存在,则效果等同于set命令。返回值是追加完成后字符串的长度(字节)。

:redis的字符串,不会对字符编码做任何处理。redis中存储的都是二进制数据。

若要在redis中存储中文,可以在启动redis客户端的时候,加上一个--raw选项。就可以使redis客户端能够自动的把二进制数据尝试翻译。

getrange: 获取字符串当中的一部分。start和end表示获取的范围(左闭右闭)。支持下标为负数。-1表示倒数第一个字符。

setrange: 覆盖字符串的一部分,从指定的偏移开始。返回值是替换后字符串的长度。如果key不存在,就创建一个新键值对,在offset之前的内容填充成0x00。

strlen:获取字符串的长度。单位是字节。当value不是字符串类型,就会报错。当key不存在,返回0

String内部的编码方式

string内部有三种编码方式:

1、int 64位/8字节的整数

2、embstr 压缩字符串,适用于表示比较短的字符串。redis存储小数,本质上是当作字符串来存储。

3、raw 普通字符串,适用于表示更长的字符串,只是单纯的持有字节数组。


String的应用场景

缓存功能

  应用服务器访问数据的时候,先查询redis,如果redis上数据存在了,就直接从redis取数据交给应用服务器,不继续访问数据库了。如果redis上的数据不存在,再读取MySQL的结果,返回给应用服务器,并把热点数据写入到redis中。由于 Redis 具有⽀撑⾼并发的特性,所以缓存通常能起到加速读写和降低后端压⼒的作⽤。

如果redis中存储的数据过多怎么办:1、在把数据写给redis时,给这个key设置一个过期时间。

2、redis也在内存不足的时候,提供了淘汰策略。

计数功能

多应⽤都会使⽤ Redis 作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数
据可以异步处理或者落地到其他数据源。如下视频的播放次数,每次+1就可以使用redis实现。

共享会话

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

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

手机验证码

很多应⽤出于安全考虑,会在每次进⾏登录时,让⽤⼾输⼊⼿机号并且配合给⼿机发送验证码,
然后让⽤⼾再次输⼊收到的验证码并进⾏验证,从⽽确定是否是⽤⼾本⼈。为了短信接⼝不会频繁访问,会限制⽤⼾每分钟获取验证码的频率。在设置验证码的过期时间时,可以使用redis的ex过期时间。

以上,关于redis,希望对你有所帮助。

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

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

相关文章

远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接

前言:大家好!今天我要教你们如何在树莓派5上安装Raspberry Pi OS,并配置SSH和VNC权限。通过这些步骤,你将能够在Windows电脑上使用VNC Viewer,结合Cpolar内网穿透工具,实现长期的公网远程访问管理本地树莓派…

本地部署 Chat Nio

本地部署 Chat Nio 0. 引言1. 本地部署2. 访问 Chat Nio3. 渠道设置4. 聊天 0. 引言 Chat Nio 的功能: 🤖️ 丰富模型支持: 多模型服务商支持 (OpenAI / Anthropic / Gemini / Midjourney 等十余种格式兼容 & 私有化 LLM 支持)🤯 美观 …

C# OpenCV 通过高度图去筛选轮廓

//输入图像 threshCropMap.ImWrite("D:\\test\\threshCropMap_BeforeFilterByBlob.bmp"); //设定我们要筛选的高度 var ResultHeight 60; //创建对应高度的图像,由于是高度信息图,所有要使用32位来存放数据 Mat mat new Mat(filter.Rows, fi…

23.UE5删除存档

2-25 删除存档制作_哔哩哔哩_bilibili 按照自己的风格制作删除按钮 这样该行的存档就被从存档列表中删除了,并且实际存档(我的存档蓝图)中也被删除了 但是存在一个问题,如果存档数据中存在索引为: 0 1 2 3的存档,当索…

【graphics】图形绘制 C++

众所周知,周知所众,图形绘制对于竞赛学僧毫无用处,所以这个文章,专门对相关人员教学(成长中的码农、高中僧、大学僧)。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…

kafka基础

文章目录 一、Kafka入门1.1、JMS1.2、生产者-消费者模式1.3、ZooKeeper 二、kafka基础架构2.1、producer2.2、kafka cluster2.2.1、broker2.2.2、Controller2.2.3、Topic2.2.4、Partition2.2.5、Replication2.2.6、Leader & Follower 2.3、consumer 一、Kafka入门 Kafka是一…

PMP–一、二、三模、冲刺–分类--5.范围管理--技巧--需求跟踪矩阵

文章目录 技巧一模反例不选“需求跟踪矩阵”4.整合管理86、 [单选] 项目经理加入一个项目,但项目经理在该项目所涉及的行业经验有限,在该项目的整个生命周期中,项目经理精心记录每个差距、问题和不一致性。但是,无论项目经理如何记…

掌握Golang中的数据竞争检测:runtime/race包全面教程

掌握Golang中的数据竞争检测:runtime/race包全面教程 引言数据竞争问题概述数据竞争的定义数据竞争对程序的影响常见数据竞争场景 Golang runtime/race包概述runtime/race包简介启用数据竞争检测使用 go run使用 go build使用 go test 基本用法与示例单元测试中的使…

ThreadLocal父子线程、线程池数据传递解决

多线程并发数据访问,确保数据安全至关重要,常用保证数据安全的方法有对代码synchronized锁、Lock锁,以及基于CAS的原子类,这些都是通过数据共享保障数据安全的,今天聊一聊另一种方案ThreadLocal线程副本,实…

Docker 从入门到精通全攻略

一、Docker 初印象 Docker 诞生于 2013 年,由 dotCloud 公司发起,最初是一个公司内部项目。其诞生背景源于程序员们苦于应用部署环境的复杂性,开发、测试、部署过程中各种库的依赖纷繁复杂,版本差异以及测试环境与部署环境不一致等…

WordPress设置自动更新CSS版本号

WordPress 通常会在引用 CSS 文件时添加版本号参数(?verx.x.x)。如果版本号未更新,浏览器可能继续加载旧的文件。 解决方法:确保你在 functions.php 文件中正确加载了 CSS 文件,并动态更新版本号。例如在functions.p…

达梦 DG

监视器 switchover 关于达梦DG switchover的细节,以下是一些关键步骤和注意事项: • 切换前检查确认: • 确认数据库版本和DG架构,包括IP信息及切换角色前后的情况。 • 检查DG切换方式,是switch over还是fail ove…

c#基本数据类型占用字节长度/取值范围/对应.net类型

具体前往:c#基本数据类型占用字节数/取值范围/包装类-各基本类型.net类型,占用bit位数,默认值及取值范围

多品牌NVR管理工具/设备EasyNVR多个NVR同时管理支持RTSP接入

在当今数字化浪潮席卷全球的背景下,视频监控行业正经历着前所未有的变革。传统的本地录像存储模式正逐步向云端集中管理转型,这一技术的飞跃不仅极大地提升了监控效率与安全性,更为各行各业的智能化管理开辟了新路径。在这一转型过程中&#…

初学者指南:知识库问答(KBQA)多跳路径的核心与应用

初学者指南:知识库问答(KBQA)多跳路径的核心与应用 知识库问答(Knowledge Base Question Answering, KBQA)旨在利用结构化知识库(如Wikidata、Freebase)回答自然语言问题。在实际应用中&#x…

利用Python爬虫获取淘宝店铺详情

在数字化时代,数据已成为企业最宝贵的资产之一。对于电商平台,尤其是淘宝这样的大型电商平台,店铺详情数据的获取和分析对于商家来说至关重要。它不仅可以帮助商家了解市场趋势,还可以优化营销策略,提升销售业绩。本文…

卡尔曼滤波学习资料汇总

卡尔曼滤波学习资料汇总 其实,当初的目的,是为了写 MPU6050 的代码的,然后不知不觉学了那么多,也是因为好奇、感兴趣吧 有些还没看完,之后笔记也会同步更新的 学习原始材料 【卡尔曼滤波器】1_递归算法_Recursive P…

【HCIP]——OSPF综合实验

题目 实验需求 根据上图可得,实验需求为: 1.R5作为ISP:其上只能配置IP地址;R4作为企业边界路由器,出口公网地址需要通过PPP协议获取,并进行CHAP认证。(PS:因PPP协议尚未学习&#…

MarkDown笔记记录app——待更新

1,语雀: 容易整理,直接上手,直接导出到csdn或者是github中 2,notion:注意及时清理 平时主要资料整理部分,注意每个page里面包含子page不能超过5MB, 所有的老资料笔记需要导出为htm…

vxe-table 4.9+ 实现在表格列中直接拖拽排序,列拖拽排序

Vxe UI vue vxe-table v4.9 实现在表格列中直接拖拽排序,列拖拽排序 安装 npm install vxe-pc-ui4.3.3 vxe-table4.9.0main.js // ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css import VxeUITable from vxe-table import vxe-table/lib/styl…