Redis中String类型的命令

目录

Redis中的内部编码

redis的数据结构和内部编码

Redis中的String类型

String类型的常见命令

set

get

mget

mset

String类型的计数命令

incr

incrby

decr

incrbyfloat

其他命令

append

getrange

setrange

strlen

String类型的内部编码


Redis中的内部编码

redis中value的数据类型有多种,最通用的数据结构有String,List,set,hash和sorted set.

redis底层在实现上述数据结构的时候,会在源码层面,针对上述各个数据结构实现特定的优化,来达到节省空间/节省时间的效果.

也就是说每个数据结构在redis内部具体是如何实现的,这是有变数的.一个数据结构可能对应多种编码方式,来应对不同场景下的业务.

通俗一点讲就是redis承诺这里有一个hash表,你进行查询,插入,删除操作,都保证时间复杂度是O(1),但是这个hash表背后的实现不一定就是标准的hash表,可能在特定的场景下会使用别的数据结构来实现,但是仍然保证时间复杂度是O(1).

redis的数据结构和内部编码

每种数据结构都至少有两种以上的内部编码实现,,同时有些内部编码可以做为多种数据结构的内部实现.

我们可以通过object encoding命令来查询其具体的内部编码.

redis这样设计的好处:

1.可以改进内部编码,而对外的数据结构和命令没有任何影响,这样一旦开发出来更优秀的内部编码,无需改动外部的数据结构和命令.

2.多种内部编码的实现可以在不同的场景下发挥各自的优势.例如 ziplist ⽐较节省内存,但是在列表元素⽐较多的情况下,性能会下降,这时候 Redis 会根据配置选项将列表类型的内部实现转换为 linkedlist,整个过程⽤⼾同样⽆感知。


Redis中的String类型

redis中所有的键的类型都是字符串类型,其他几种数据结构也都是在字符串类型的基础上构建的.

字符串类型实际的值,可以是字符串,包含一般格式的json,xml格式的字符串;也可以是数字,包含整数或者浮点数;也可以是二进制流数据,例如图片,音频等.但是一个字符串的最大值不能超过512MB.

由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的,所以 Redis 是不处理字符集
编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码。

String类型的常见命令

set

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

set命令支持多种选项来影响它的行为.

ex使用秒为单位设置key的过期时间.px使用毫秒作为单位设置key的过期时间.

nx表示如果key不存在才设置,key存在则不设置;xx表示如果key存在则设置,key不存在则不设置.

redis针对set的一些用法也延申出了一些命令.

setnx:key不存在才能设置,存在则设置失败.返回1表示设置成功,返回0表示没有设置.

setex:设置key的过期时间单位是秒.

psetex:设置key的过期时间单位是毫秒.

返回值:设置成功则返回ok,如果由于set指定了nx或者xx并且条件没有满足,set不会执行并返回nil.

get

获取key对应的value.如果key不存在,返回nil.如果value的类型不是string会报错.

mget

一次性获取多个key的值.如果对应的key不存在或者对应的数据类型不是string则返回nil.

时间复杂度是O(N),其中n是key的数量.

mset

一次性设置多个key的值.返回ok.时间复杂度是O(N),其中n是key的数量.


String类型的计数命令

  • incr ,针对value+1
  • incrby,针对value+n
  • decr,针对value-1
  • decrby,针对value-n
  • incrbyfloat,针对value+/-小数
incr

将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
返回的是加完之后的数值.
incrby

将 key 对应的 string 表⽰的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
decr
将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
incrbyfloat
将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,则报错。允许采⽤科学计数法表⽰浮点数。

其他命令

append

如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。

时间复杂度:O(1)

返回值:追加完成之后string的长度.此处的单位是字节.

redis的字符串不会对字符编码做任何处理,redis不认识字符只认识字节.

当前的xshell终端,是按照utf8的方式进行编码的,在终端输入汉字后,也是按照utf8进行编码的,一个汉字在utf8的字符集中,通常是3个字节的.

可以看到我们get key5得到的是你好的16进制的数据,对应的就是utf8中的你好.

如果不想得到数据而是汉字,可以在启动redis客户都安的时候加上--raw,此时redis客户端就能够自动的把二进制的数据尝试翻译.

getrange

返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值。
如果value是汉字,此时切分出来的是什么就不确定了.
setrange
覆盖字符串的一部分,从指定的偏移开始.
返回的替换之后的string长度.
针对汉字也可能会出现问题.
setrange针对不存在的key也可以操作,不过会把offset之前的内容填充为0x00.
strlen
获取key对应的string长度.当key存放的类型不是string时,会报错.
返回的字符串的长度,当key不存在的时候返回0.单位是字节.

String类型的内部编码

String类型的内部编码有3种:

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

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

redis在存储小数的时候,本是上还是当作字符串来存储.意味着每次进行算数运算都需要把字符串转为小数.进行运算.结果在转为字符串.


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

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

相关文章

【源码】智能导诊系统,通过患者的主诉症状,自动匹配挂号科室和医生

随着计算机技术、网络技术、医院内网、智能终端的发展成熟,自动化、智能化就诊将是未来医院的发展模式。在目前综合性医疗机构,医院建设物庞大且复杂,接待就诊人员数量较大,医院诊疗科室众多,就诊人员容易迷失其中&…

Vue监听事件

一、问题场景 项目有个需求&#xff0c;在登录页面&#xff0c;输入好账号密码后&#xff0c;直接可以点击回车就能够登录&#xff0c;效果和点击登录按钮一样&#xff0c;登录页面源码如下 <template><body id"poster"><el-form class"login-…

linux 下 物理迁移 mysql 数据库 不能启动问题

1、授权问题 # chown -R 777 /app/db/mysql 2、/etc/my.cnf配置问题 [mysqld] basedir/app/db/mysql datadir/app/db/mysql/data socket/app/db/mysql/mysql.sock.lock innodb_buffer_pool_size128M innodb_force_recovery 1 symbolic-links0 [mysqld_safe] log-error/app/…

嵌入式linux常用的文件传输方式

做嵌入式就避免不了移植工作&#xff0c;所谓移植就是将交叉编译生成的可执行程序&#xff0c;库&#xff0c;配置文件等传输到开发板上进行工作。 常用传输方式有以下几种&#xff1a;1.串口传输 就是使用串口传输工具rz/sz; 该工具通过串口传输在SRT串口工具…

软文推广没效果?媒介盒子分享软文优化技巧

虽然软文推广能够为企业实现品牌增值&#xff0c;但也有许多企业在推广过程中犯错导致宣传没有效果&#xff0c;今天媒介盒子就来和大家聊聊企业在进行软文推广中的常见问题以及优化技巧。 问题1&#xff1a;内容生硬无法自然融入品牌信息 这也是企业在软文写作中较常出现的问…

win7中安装node14和vue

下载并安装低版本node 13 到官网去找早期历史版本的 nodejs 13 msi格式即可&#xff0c;并一键安装&#xff0c;我安装在了 D:\Program Files\nodejs 目录下 https://nodejs.org/download/release/v13.14.0/ 下载高版本node 14 下载高版本的node zip包 https://nodejs.org/…

生产环境docke问题排查

查看进程top查看具体的线程 top -H -p 8898如果cpu 过高&#xff0c;就是有问题的地方&#xff1b; 接下来根据docker查看具体的问题 查看dockers容器哪个内存、cpu占用过高 docker stats前言&#xff1a; 有java 启动容器&#xff1b;有jre包启动的容器。如下图 根据cpu很高…

【flink】Task 故障恢复详解以及各重启策略适用场景说明

文章目录 一. 重启策略种类&#xff08;Restart Strategies&#xff09;1. Fixed Delay Restart Strategy2. Failure Rate Restart Strategy3. Fallback Restart Strategy4. No Restart Strategy 二. 故障恢复策略&#xff08;Failover Strategies&#xff09;1. &#xff08;全…

【pdf密码】PDF没有密码,为什么不能编辑?

打开PDF文件的时候&#xff0c;没有提示带有密码&#xff0c;但是打开文件之后发现没有办法编辑PDF文件&#xff0c;这个是因为PDF文件设置了限制编辑&#xff0c;我们需要将限制取消才能够编辑文件。 那么&#xff0c;我们应该如何取消密码&#xff0c;编辑文件呢&#xff1f…

如何在校园跑腿系统小程序中构建稳健的订单处理与分配系统?

1. 数据库设计 首先&#xff0c;设计订单数据结构。使用数据库&#xff08;例如MySQL、MongoDB等&#xff09;&#xff0c;创建订单表以存储订单相关信息&#xff0c;包括订单ID、用户信息、交付地址、订单状态等。 CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMAR…

02【保姆级】-GO语言开发注意事项(特色重点)

02【保姆级】-GO语言开发注意事项&#xff08;特色重点&#xff09; 一、Go语言的特性1.1 第一个hello word&#xff08;详解&#xff09;1.2 开发编译。&#xff08;重要点 / 面试题&#xff09;1.3 开发注意事项1.4 GO语言的转义字符1.5 注释1.6 API 文档 之前我学过C、Java、…

Nginx代理转发请求POST变GET请求问题

&#x1f680; 注重版权&#xff0c;转载请注明原作者和原文链接 &#x1f96d; 作者&#xff1a;Yuan-Programmer &#x1f34e; 个人博客&#xff1a;https://boke.open-yuan.com &#x1f349; 已经替换了新的域名&#xff0c;总站叫做&#xff1a;OpenYuan开袁网&#xff0…

EASYX实现多物体运动

eg1:单个物体运动使用easyx实现单个小球的运动 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14 #define NODE_WIDTH 4…

设计融合_ c#

单例模式 using System; namespace DesignIntegration{ public class TimeManager{ private static TimeManager _instance; private static readonly Object locker new Object(); private TimeManager() { } public static TimeManager…

手机app 爬虫

近期在做某个项目,涉及到需要对手机app的进行数据爬取。在上一篇博文中,讲述了以模拟机为例的配置操作流程,这里将以苹果手机为例进行描述。 下面将讲述具体配置步骤 1、安装 抓包软件 fiddler (Fiddler | Web Debugging Proxy and Troubleshooting Solutions) ​ 下载后…

【Java】AI+智慧工地云平台源码(SaaS模式)

伴随着科学技术的不断发展&#xff0c;信息化手段、移动技术、智能穿戴及工具在工程施工阶段的应用不断提升&#xff0c;智慧工地概念应运而生&#xff0c;庞大的建设规模催生着智慧工地的探索和研发。 一、带你认识智慧工地 伴随着技术的不断发展&#xff0c;信息化手段、移动…

GZ035 5G组网与运维赛题第10套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第10套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

win10-mmgen安装/cyclegan运行问题记录

mmconda环境&#xff1a; conda&#xff1a; CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch pip install mmcv-full1.5.0 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.11.0/index.html 成功运行 c…

日常踩坑-[sass]Error: Expected newline

在学习sass的时候&#xff0c;运行时发现报错 经过网上冲浪知道&#xff0c;原来在声明语言的时候 lang 不能声明为 sass &#xff0c;而是 scss ,这就有点坑了 原因&#xff1a; scss是sass3引入进来的&#xff0c;scss语法有"{}“,”;"而sass没有&#xff0c;所以…