Redis数据类型(list\hash)

news2024/11/27 2:17:29

 "we had our heads in the clouds"


String类型

        字符串类型是Redis最基础的数据类型,关于字符串需要特别注意的是:
● Redis中所有的键类型都是字符串类型.⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型。

● 字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似JSON、XML格式的字符串,数字;可以是整型或者浮点型;甚⾄是⼆进制流数据(视频、音频),但是其总大小不得超过512MB。

(1) SET | MSET        

SET命令

● NX: 如果key不存在,才设置;如果key存在,则不设置返回(nil).

● XX: 如果key存在,进行更新;如果key不存在,则不设置返回(nil).

● PX: 使⽤毫秒作为单位设置key的过期时间.

● EX: 使⽤秒作为单位设置key的过期时间.

        在redis文档中的语法格式说明:  "[]" 相当于一个独立的单元,其中的所有参数都是可选项。"[]"之间可以同时存在。"|"表示多个选项中,只能出现一个的意思。

        

 注:  如果key存在,让新的value去覆盖旧的value的同时,可能会改变原来的数据类型,原来key的ttl也会失效。

        其中SETNX | SETTX | SETPX都是SET命令带上“[]"里的效果,所以会用一个SET命令仅够用了。

        ⼀次性设置多个key的值. 

(2) GET | MGET 

        

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

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

多次getvs单次mget:       

        我们先使用 "keys *" 将缓存在redis中的数据打印出来,现在我们需要得到这些keys的value是什么。                这两种查询方法有什么区别呢?是不是都是一样呢?

        redis作为网络服务器,任何一条请求、命令都是需要通过网络设备进行发送的,当你发送多条命令,意味着多次网络IO,相反如果你能使用一次网络IO就将你需要的结果拿到,效率一定是更快的。               

(3) 计数命令

INCR:

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

        Redis中的String支持数字,这也就意味着String更容易支持 运算符操作。

INCRBY:

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

        INCRBY的使用同INCR是一样的,只不过你可以指定增加多少。

       

DECR\DECRBY:

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


 

INCRBYFLOAT:

        将key对应的string表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数。 

        针对这个浮点数版本, redis没有提供负数版本,但是通过控制"+-"也可以实现减法版本。 因为redis在处理命令的时候,是单线程模型,虽然多个客户端可能同时对一个key进行INCR,但也不会引发线程安全问题。

(4) 其他命令字符串命令

        前面的一些命令似乎和字符串关系不大,本小结的一些命令会让这个value字符串类型更像字符一样使用。

APPEND:

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


 

redis中的字节与字符:

        我们重启redis-cli客户端,并携带选项--raw。 

GETRANGE:        

        返回key对应的string的⼦串,由start和end确定(左闭右闭)。可以使⽤负数表⽰倒数。-1代表倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据string的⻓度调整成正确的值。        

         

SETRANGE:

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

 

STRLEN: 

        获取key对应的string的⻓度。当key存放的类似不是string时,报错.

 

String命令小结:

命令执行效果时间复杂度
set key value设置key的值valueO(1)
get key获取key的valueO(1)
del key [key ...]删除指定的keyO(k),k为键个数
mset key value [key value..]批量设置多个key和valueO(N)
mget key批量获取多个keyO(N)
incr\incrby +b key指定key+1\+nO(1)
decrby key n 指定key-1O(1)
incrbyfloat key n指定key +- nO(1)
strlen key获取字符串类型key的长度O(n),字符长度
setrange key offset value从offset的位置用value覆盖keyO(n),n是字符串长度
getrange key start end指定获取key的value 从start到endO(n),n为字符串长度

String 内部编码

        字符串类型的内部编码有3种:
• int:64位/8字节的正数。
• embstr:⼩于等于39个字节的字符串,压缩字符串适合存储短字符串。
• raw:⼤于39个字节的字符串。普通字符串,只是一个单纯的字节数组。 
        我们可以通过这个命令,查看一个key对应的数据value的内部编码:

 

                这里到底是超过多少字节就由embstr 转为 raw这个限度是可以进行配置的。

        因为redis存储小数,本质上仍然是用字符串来存储的,这就和单纯存储整数相差挺大的。当小数参与到算术运算时,一定要做的步骤是,将字符串转换为小数数值,得到结果后又将该小数转换为字符串。 

 

String应用场景

① 缓存Cache功能:

        我们可以看如下的一个典型场景:

        其中redis作为缓冲层,Mysql作为主要存储层,绝大部分请求数据会通过redis缓存拿到结果。因为redis具有⽀撑⾼并发的特性,缓存常能起到加速读写和降低后端压⼒的作⽤。

        随着访问量的增加,redis一定会遇到缓存被打满的情况,redis提供了一系列措施来解决redis面对的存储空间变小的,例如 给key设置过期策略,定期、惰性删除以及当redis内存不足时,使用的淘汰策略。

② 计数器Counter:

        做自媒体的博主,十分在意的就是用户浏览量。许多应⽤都会使⽤Redis作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。       

 

③ 会话Session:

什么是session?        

        Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。

        在一个分布式Web中,如果服务器将⽤⼾的Session信息保存在各⾃的服务器中,这样做就会导致一个问题:由于负载均衡器的缘故,分布式服务会将⽤⼾的访问请求均衡到不同的服务器上,也就是你的第一次请求和第二次请求可能被打在了不同的服务器上。很显然,接收你第二次请求的服务器不应该知道你是已经登录过了的,或者你历史访问的信息。        

         以上介绍了使⽤Redis的字符串数据类型可以使⽤的⼏个场景,当然其适⽤场景远不⽌于此,开发⼈员可以结合字符串类型的特点以及提供的命令,充分发挥⾃⼰的想象⼒,在⾃⼰的业务中去找到合适的场景去使⽤Redis的字符串类型。
 


Hash类型

        ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数
组、映射。在Redis中,哈希类型是指值(value)本⾝⼜是⼀个键值对结构。

字符串 vs 哈希结构:

(1) HSET\HGET

 

        设置hash中指定的字段(field)的值(value)。

        获取hash中指定字段的值。 

 

 

(2) HDEL\HEXISTS

        删除hash类型中指定的字段。
        判断hash中是否有指定的字段。

 

(3) HKEYS\HVALS

        获取指定key中hash的所有字段。这个先根据key,找到对应的hash(O(1)),然后再遍历整个hash。

        获取hash中的所有的值。
        这个两个操作同 “keys * " 大同小异,实际中在我们不知道field和value的情况下,不用为上策。

(4) HGETALL\HMGET

        获取hash中的所有字段以及对应的值。
 

                ⼀次获取hash中多个字段的值。


        因为HSET已经可以设置多个field 、value 所以虽然有HMSET但是可以被替代了。

(5) HLEN 

        获取hash中的所有字段的个数。

(6) HSETNX\HINCRBYFLOAT\HINCRBY

        在字段不存在的情况下,设置hash中的字段和值。

 

 

 

        HINCRBY的浮点数版本,将hash中字段对应的数值添加指定的值。
 

Hash命令小结:

命令执行效果时间复杂度
hset key field value设置值O(1)
hget key field 获取值O(1)
hdel key field [field...]删除fieldO(n),n是field的个数
hlen key计算field个数O(1)
hgetall key获取所有的field-valueO(n),n是field的个数
hmget field[field...]批量获取valueO(n),n是field的个数
hmset field value [field value....]批量设置值O(n),n是field的个数
hexists key field 判断field是否存在O(1)
hkeys\vals key获取所有的key\valueO(n),n是field的个数
hsetnx key field valuefiled不存在才成功O(1)
hincrby key field n对应的value+nO(1)
hincrbyfloat key field n浮点数版本O(1)
hstrlen key field计算value的字符串长度O(1)

Hash内部编码:

        哈希的内部编码有两种:

• ziplist(压缩列表)当哈希类型元素个数⼩于hash-max-ziplist-entries配置(默认512个)、
同时所有值都⼩于hash-max-ziplist-value配置(默认64字节)时,Redis会使⽤ziplist作为哈
希的内部实现,ziplist使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐
hashtable更加优秀。

• hashtable(哈希表)当哈希类型⽆法满⾜ziplist的条件时,Redis会使⽤hashtable作为哈希
的内部实现,因为此时ziplist的读写效率会下降,⽽hashtable的读写时间复杂度为O(1)。
 

如何理解压缩?        

        ziplist也是同理,因为一个普通的哈希表,如果存储少量的值,存在一定的空间浪费,这显然对redis这类极其看重空间的组件来说是不能容忍的。但,ziplist付出的代价是,进行读写元素时速度还是很慢,这种效果随着插入的元素增多而愈发明显。

 

Hash应用场景:

① 关系型表数据转换

关系型数据库表
uidnameagecity
1LeBron James38LosAngels
2Anthony Davis30LosAngels


映射关系表⽰⽤⼾信息:        

        但是需要注意的是哈希类型和关系型数据库有两点不同之处:

uidnameagecitygenderfavor
1James38LosAngel<null>sports
2Davis30LosAngel<null>sports

● 哈希类型是稀疏的,⽽关系型数据库是完全结构化的.

● 关系数据库可以做复杂的关系查询,⽽Redis去模拟关系型复杂查询.

② 缓存⽅式对⽐

● 原⽣字符串类型⸺使⽤字符串类型,每个属性⼀个键

# 这里的field中的value 是字符串
set user:1:name James
set user:1:age 38
set user:1:city LosAngel

优点:实现简单,针对个别属性变更也很灵活。
缺点:占⽤过多的键,内存占⽤量较⼤,同时⽤⼾信息在Redis中⽐较分散,缺少内聚性,所以这种⽅案基本没有实⽤性。

 ● 序列化字符串类型,例如JSON格式 

set user:1 经过序列化后的⽤⼾对象字符串

优点:针对总是以整体作为操作的信息⽐较合适,编程也简单。同时,如果序列化⽅案选择合适,内存的使⽤效率很⾼。
缺点:本⾝序列化和反序列需要⼀定开销,同时如果总是操作个别属性则⾮常不灵活。

        当我们需要修改Json中的某些值时,需要将Json中保存的所有值先反序列化成字符串,操作field,再重写完成后序列化成Json,再写回去。

● 哈希类型

hmset user:1 name James age 38 city LosAngel

优点:简单、直观、灵活。尤其是针对信息的局部变更或者获取操作。

缺点:需要控制哈希在ziplist和hashtable两种内部编码的转换,可能会造成内存的较⼤消耗。


本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~ 

 

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

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

相关文章

社保先关事宜

个人账户实行完全积累制 在社保账户中&#xff0c;有“统筹账户”和“个人账户”&#xff0c;缴费基数均为当地上年度在岗职工平均工资&#xff0c;单位所缴费用相当于缴费基数的20%&#xff0c;进入社会统筹账户。个人所缴费用相当于缴费基数的8%&#xff0c;进入个人账户&am…

抖店总是有人给中差评怎么办?聊下抖店的运营,对你有帮助的!

我是王路飞。 做抖店的商家&#xff0c;最想要的就是店铺爆单以及客户给出好评了。 但是也只能是想想了&#xff0c;每个做抖店或者说做网店的&#xff0c;不可能没遇到过中差评&#xff0c;我们能做的就是尽量避免。 那么抖店总是有人给中差评怎么办呢&#xff1f; 给你们…

分布式锁之mysql实现

本地jvm锁 搭建本地卖票案例 package com.test.lockservice.service.impl;import com.test.lockservice.mapper.TicketMapper; import com.test.lockservice.service.TicketService; import org.springframework.beans.factory.annotation.Autowired; import org.springframew…

定时任务库的详解与魅力应用:探索schedule的无尽可能性

文章目录 摘要一些示例其他的示例向任务传递参数取消任务运行一次任务获取所有任务取消所有任务按标签获取多个任务以随机间隔运行作业运行一项作业&#xff0c;直到某个时间距离下次执行的时间立即运行所有作业&#xff0c;无论其计划如何在后台运行多个调度器 记录日志自定义…

海康机器人工业相机 Win10+Qt+Cmake 开发环境搭建

文章目录 一. Qt搭建海康机器人工业相机开发环境 一. Qt搭建海康机器人工业相机开发环境 参考这个链接安装好MVS客户端 Qt新建一个c项目 cmakeList中添加海康机器人的库&#xff0c;如下&#xff1a; cmake_minimum_required(VERSION 3.5)project(HIKRobotCameraTest LANG…

微信小程序隐私协议接入

自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后&#xff0c;方可调用微信提供的隐私接口。 相关公告见&#xff1a;关于小程序隐私保…

计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

格创校园跑腿小程序独立版v2.0.7+前端

应用介绍 格创校园跑腿SAAS管理系统小程序独立版v2.0.7前端 格创校园跑腿小程序系统独立版是一款基于ThinkPHP6框架开发的多校园专业跑腿平台&#xff0c;可应用至小区、街区、园区、厂区等。 格创校园跑腿小程序系统是校园创业版块热门应用&#xff0c;全新UI界面&#xff0c…

(202308)科研论文配图 task5 安装LaTex + 书籍第二章SciencePlots部

SciencePlots 序言阅读笔记绘图包介绍Windows下安装Windows下的安装MikTexWindows下的安装ghostscript加入系统环境变量安装scienceplots 序言 有幸在这次的组队学习活动中&#xff0c;拜读宁海涛先生的《科研论文配图绘制指南——基于python》一书&#xff0c;这本书文辞亲切…

【网络安全带你练爬虫-100练】第19练:使用python打开exe文件

目录 一、目标1&#xff1a;调用exe文件 二、目标2&#xff1a;调用exe打开文件 一、目标1&#xff1a;调用exe文件 1、subprocess 模块允许在 Python 中启动一个新的进程&#xff0c;并与其进行交互 2、subprocess.run() 函数来启动exe文件 3、subprocess.run(["文件路…

【百草阁送书-第二期】一名阿里服务端开发工程师的进阶之路

文章目录 一、前言二、AI 时代&#xff0c;服务端开发面临新挑战三、服务端开发会被 AI 取代吗&#xff1f;四、知识体系化&#xff0c;构建核心竞争力五、业界首本体系化、全景式解读服务端开发的著作六、参与抽奖方式 一、前言 目前&#xff0c;资讯、社交、游戏、消费、出行…

c++(8.28)菱形继承,虚继承,多态,抽象类,模板+Xmind

xmind: 作业&#xff1a; 1.编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴…

OLED透明屏是什么?什么叫做OLED透明屏的原屏?

OLED透明屏是一种新型的显示技术&#xff0c;具有高对比度、高亮度和能耗低等优势&#xff0c;正被越来越广泛地应用于各个领域中。 在OLED透明屏中&#xff0c;原屏是至关重要的元件之一。本文将深入探讨OLED透明屏原屏的意义、制造过程、品质要求、应用案例和发展趋势&#…

2023-8-28 排列数字(DFS)

题目链接&#xff1a;排列数字 #include <iostream>using namespace std;const int N 10;int n;int path[N];bool st[N];// u 看第几个位置 void dfs(int u) {if(u n){for(int i 0; i < n; i ) cout << path[i] << ;cout << endl;return ;}//…

初试Eureka注册中心

Eureka是spring cloud中的一个负责服务注册与发现的组件。遵循着CAP理论中的A(可用性)P(分区容错性)。一个Eureka中分为eureka server和eureka client。其中eureka server是作为服务的注册与发现中心。 搭建eureka服务 引入eureka依赖 引入SpringCloud为eureka提供的starter依…

0828|C++day6 菱形继承+虚继承+多态+抽象类+模板

一、思维导图 二、今日知识回顾 1&#xff09;多态 父类的指针或者引用&#xff0c;指向或初始化子类的对象&#xff0c;调用子类对父类重写的函数&#xff0c;进而展开子类的功能。 #include <iostream> using namespace std;class Zhou { private:string name;int age…

论文阅读_扩散模型_LDM

英文名称: High-Resolution Image Synthesis with Latent Diffusion Models 中文名称: 使用潜空间扩散模型合成高分辨率图像 地址: https://ieeexplore.ieee.org/document/9878449/ 代码: https://github.com/CompVis/latent-diffusion 作者&#xff1a;Robin Rombach 日期: 20…

Spring补充

一.Spring JDB 配置两个jar包 <!-- spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.2.RELEASE</version> </dependency> <!-- 阿里数据…

Python实现T检验

今天来分享一下T检验的python实现方法。 01 先来上一波概念。 1.单样本t检验&#xff0c;又称单样本均数t检验&#xff0c;适用于来自正态分布的某个样本均数与已知总体均数的比较&#xff0c;其比较目的是检验样本均数所代表的总体均数是否与已知总体均数有差别。已知总体均数…

权限提升-数据库提权-MSF-UDF提权

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…