【Redis】redis5种数据类型(string)

news2024/11/17 7:40:46

目录

redis5种数据类型和内部编码方式

redis单线程模型 

string字符串类型相关命令

SET

GET

MSET

MGET 

SETNX

SETEX

​编辑PSETEX

value值为整数,进行加减操作

INCR

INCRBY

DECR

DECRBY

INCRBYFLOAT

APPEND

GETRANGE

SETRANGE

STRLEN

string的内部编码


redis5种数据类型和内部编码方式

redis的5中数据类型如下图所示:

  • 字符串类型对应C++ std::string ,java String
  • 哈希类型对应C++ std::unordered_map,java中HashMap
  • 列表类型对应C++ std::deque ,java List
  • 集合类型对应C++ std::set,java Set
  • 有序集合存储的时候,除了存储member之外,还需要存储一个权重值

redis中数据类型的内部编码方式根据实际情况而定,比如哈希,背后的实现不一定是一个标准的哈希表,可能在特定的场景下,使用别的数据结构实现,但是仍然保证时间复杂度符合承诺

数据类型内部编码
stringraw(最基本的字符串,底层就是一个char数组)
int(value是一个整数的时候,redis可能会用int存)
embstr(针对短字符串的优化)
hashhashtable(基本的哈希表)
ziplist(元素比较少的时候,优化成压缩列表)
listlinkedlist(链表)
ziplist
sethashtable
intset(集合里都是整数,就优化成intset)
zsetskiplist(跳表)
ziplist

查看数据类型的内部编码实现方式

object encoding key

上述命令可以查看key对应的value的实际编码方式

redis单线程模型 

多个请求同时到达redis服务器,也是要到队列中排队,再等待redis服务器一个一个的取出里面的命令再执行。微观上来讲,redis服务器是串行/顺序执行这多个命令的。

redis是单线程模型,为啥效率这么高呢?速度这么快呢?

首先效率高,速度快的参照物是数据库(mysql、oracle)

  1. redis访问的是内存,数据库访问的是硬盘
  2. redis核心功能比数据库的核心功能更简单,比如针对插入删除,数据库有各种约束,都会使数据库做额外的工作。
  3. 单线程模型,避免了一些不必要的线程竞争开销。
  4. 处理网络IO的时候,使用了epoll这样的IO多路服用机制,一个线程,就可以管理多个socket 

string字符串类型相关命令

redis中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换,存的是啥,取出来的还是啥。mysql默认的字符集是拉丁文,插入中文会失败。 

SET

语法:

SET key value ex 10 

等价于

set key value 

expire key 10

使用set设置key会存在下述情况:

  • 如果key不存在,创建新的键值对
  • 如果key存在,则是让新的value覆盖旧的value,可能会改变原来的数据类型,原来的这个key的生存时间也会失效

我们可以通过 NX判断key是否存在,不存在再创建,存在返回nil

 xx判断key是否存在,存在才能设置,不存在返回nil

FLUSHALL清空redis里所有键值对

GET

语法:

GET key

对于get来说,只支持字符串类型的value,如果value是其他类型,使用get获取就会出错。

MSET

一次设置多个key的值

语法:

MSET key value [key value ....]

时间复杂度O(n);此处的n是获取key的个数,因此也可以认为是O(1) 

示例: 

MGET 

一次获取多个key的值

语法:

GET key1 key2

时间复杂度O(n);此处的n是获取key的个数 

示例: 

mget相对于get的优势在于如果一次获取多个key只需要向redis服务器请求一次,而不用请求多次,如下图所示: 

SETNX

key不存在才能设置,存在则设置失败
语法:

setnx key value

示例:

SETEX

设置过期时间,单位是秒

 语法:

setex key second value

PSETEX

设置过期时间,单位是毫秒

 语法:

PSETEX key second value

value值为整数,进行加减操作

INCR

针对value+1

语法:

INCR key

这里的key对应的value必须是整数。

返回值是value+1之后的值。

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

INCRBY

针对value+n

语法:

INCRBY key

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

DECR

针对value-1

DECRBY

针对value-n

INCRBYFLOAT

针对value+/- 小数

由于reids处理命令的时候,是单线程模型,多个客户端同时针对同一个key进行incr的操作也不会引起线程安全的问题.

APPEND

如果key已经存在,并且value是一个string,会将新设置的value追加到原来的string后边,如果不存在,其效果等同于SET命令。

语法:

APPEND KEY VALUE

返回值:追加完成后string的长度,单位是字节。

时间复杂度:O(1); 

GETRANGE

返回key对应的string的子串,由start和end确定(左闭右闭),可以使用负数表示倒数,-1表示倒数第一个字符,-2表示倒数第二个字符,其他的与此类似。超过范围的偏移量会根据string的长度调整为正确的值。

语法:

GETRANGE key start end

时间复杂度:O(n);

返回值:取的string子串。

如果字符串中保存的是汉字,此时进行子串切分,很可能切出来,很可能切出来的就不是完整的汉字的。

SETRANGE

覆盖字符串的一部分呢,从指定的偏移开始

语法:

SETRANGE key offset value

  • offset是偏移量。
  • 当value是一个中文字符串的时候,进行setrange的时候可能会出问题,因为它是按照字节来替换的。
  • setrange针对不存在的key也是可以操作的,不过会把offset之前的内容填充成0x00

时间复杂度:O(1)。

返回值:替换后的string的长度。

示例:

STRLEN

获取字符串的长度,单位是字节。

当key对应的value的类型不是string时报错。

语法:

STRLEN key

时间复杂度:O(1)。

返回值:string的长度,或者当key不存在时,返回0。

string的内部编码

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

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

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

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

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

相关文章

VMwareWorkstation安装UOS系统(1070版本)教程

UOS系统是一款国产信创操作系统。目前市面上主流的系统版本是1070,下面我们用虚拟机来安装一下这款系统。 创建虚拟机 首先,我们先打开VMwareWorkstation软件,新建虚拟机 选择自定义,点击下一步 点击下一步 选择稍后安装操作系统…

【通信管理之c++基础01】std::future

std::future https://en.cppreference.com/w/cpp/thread/future https://cplusplus.com/reference/future/future/ std::async #

实验一 局域网设计

一、实验目的 1.掌握网络工程中需求分析方法。 2.子网IP地址规划及子网间互相通信的方法。 3.掌握局域网的构建方法。 二、实验描述 某中学拟建设一个校园网,网络使用192.168.10.0/24这个地址段。计算机主要分布如下:两个学生机房各为10台&#xff…

数据库课程 CMU15-445 2023 Fall Project-0 项目记录

0. 实验结果 1. 环境配置 1.1 虚拟机Ubuntu 22.04.4 LTS 1.2 Vscode 插件安装clangd:代码补全 1.3 参考官方Project 0完成环境配置 1.4 获取到的代码,切换分支到2023 Fall git checkout fc57dab // 仓库中2023 Fall release版本的哈希值 git branch d…

WPF 保姆级教程怎么实现一个树形菜单

先看一下效果吧: 我们直接通过改造一下原版的TreeView来实现上面这个效果 我们先创建一个普通的TreeView 代码很简单: <TreeView><TreeViewItem Header"人事部"/><TreeViewItem Header"技术部"><TreeViewItem Header"技术部-1&q…

低代码平台:助力企业数字化转型的利器

正文&#xff1a; 在数字化时代的浪潮中&#xff0c;企业需要快速适应市场变化和技术进步。传统的软件开发方法往往由于开发周期长、成本高和对技术人员的依赖程度高&#xff0c;难以满足企业的快速响应需求。此时&#xff0c;低代码平台&#xff08;Low-Code Platform&#x…

干货分享|分享一款微软出品的工作效率神器 PowerToys

工具介绍&#xff1a;Microsoft PowerToys 是一组实用工具&#xff0c;可帮助高级用户调整和简化其 Windows 体验&#xff0c;从而提高工作效率。 安装步骤&#xff1a;直接打开微软商店安装即可&#xff0c;并且可以保证下载到最新版本。 功能介绍&#xff1a; 高级粘贴 高级…

js react 笔记 2

起因&#xff0c; 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块 const { randomUUID } require(crypto);const uuid randomUUID(); console.log(uuid); // 输出类似 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d 2. 使用 props, 传递参数…

[uniapp/wx小程序] 关于cover-view滚动/点击穿透问题的解决方案/cover-view 的坑

情况&#xff1a;如果在原生组件上&#xff0c;搞了一些弹窗、覆盖层、操作栏等等的东西&#xff0c;有层级的情况&#xff0c;就会出现事件穿透的问题 问题&#xff1a;自然会想到官方给出的解决方案&#xff1a;使用cover-view。但有时穿透问题虽然解决了&#xff0c;但会出…

【NanoEdgeAIStudio】初次体验

本文前言 NanoEdge ai Studio是ST提供的免费软件&#xff0c;可以轻松地将ai添加到任何Arm Cortex-M MCU上运行的任何嵌入式项目中。官网首页&#xff1a;NanoEdge AI Studio&#xff0c;官方文档&#xff1a;AI:NanoEdge AI Studio。官方文档写的很详细&#xff0c;建议观看。…

Python 从入门到实战12(流程控制-跳出循环语句)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…

【数据结构】顺序表和链表——链表(包含大量经典链表算法题)

文章目录 1. 单链表1.1 概念与结构1.1.1 结点1.1.2 链表的性质1.1.3 链表的打印 1.2 实现单链表1.3 链表的分类1.4 单链表算法题1.4.1 移除链表元素1.4.2 反转链表1.4.3 链表的中间结点1.4.4 合并两个有序链表1.4.5 链表分割1.4.6 链表的回文结构1.4.7 相交链表1.4.8 环形链表1…

【运维监控】influxdb 2.0+grafana 监控java 虚拟机以及方法耗时情况(完整版)

关于java应用的监控本系列有文章如下&#xff1a; 【运维监控】influxdb 2.0telegraf 监控tomcat 8.5运行情况 【运维监控】influxdb 2.0grafana 监控java 虚拟机以及方法耗时情况 【运维监控】Prometheusgrafana监控tomcat运行情况 【运维监控】Prometheusgrafana监控spring b…

软考科目傻傻分不清?一次搞懂各科目考核内容!小白不再纠结!

2024年下半年软考报名已经逐步进入尾声了&#xff0c;大部分考生都已完成报名&#xff0c;但有不少小白因为是第一次报考&#xff0c;对各科目傻傻分不清&#xff0c;导致报错了科目…… 这种情况很可能会影响考试&#xff0c;浪费了一次报考机会。而为了尽量避免这一情况再发生…

个人简历 (自己设计的)

欢迎大家来观看。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

国产“小钢炮”MiniCPM3-4B:小参数,大能量!

前沿科技速递&#x1f680; 在 AI 大模型浪潮中&#xff0c;国内厂商面壁智能再次突破&#xff0c;推出了其最新的“小钢炮”系列——MiniCPM 3.0。这款全新模型不仅实现了在移动设备上运行 GPT-3.5 级别的能力&#xff0c;而且具备超强的推理、检索与代码解释功能。MiniCPM 3.…

Python必知必会:程序员必须知道的22个Python单行代码!

今天给大家分享24个每个Python程序员都必须知道的单行代码&#xff0c;帮你写出更简洁、更优雅、更高效的代码。 1. 列表推导式 列表推导式&#xff08;List Comprehensions&#xff09;可以提供一种简洁的方式创建列表。相较于传统的循环&#xff0c;列表推导式更高效、可读…

240909-ChuanhuChatGPT集成Ollama的环境配置

A. 最终效果 B. 需求文件 requirements.txt (至少需要安装这个&#xff0c;具体参见官网)requirements_advanced.txt &#xff08;如果安装了Ollama&#xff0c;并且可以进行对话&#xff0c;可以不需要安装&#xff0c;具体参见官网&#xff09;requirements_succcess.txt&am…

Qt5.4.1连接odbc驱动操作达梦数据库

Qt5.4.1连接odbc驱动操作达梦数据库 1 环境介绍2 Qt5.4.1 安装2.1 图形化界面安装Qt5.4.12.2 配置Qt5.4.1 环境变量2.3 Qt5.4.1 生成 libqsqlodbc.so 并配置2.3.1 生成Makefile2.3.2 查看 libqsqlodbc.so 文件并配置 3 配置Qt测试用例4 达梦数据库学习使用列表 1 环境介绍 CPU…

SAP加密解密功能设计

SAP加密解密功能设计 【场景】与外围系统对接时&#xff0c;出于信息安全等因素&#xff0c;经常需要对传输的信息做加密解密控制。 1. 公用类zcl_aes_utility *----------------------------------------------------------------------* * CLASS ZCL_AES_UTILITY DEFI…