(三)redis五大数据类型和key

news2024/11/19 4:41:16

目录

一、redis键(key)的常用操作

二、redis字符串(String)

1、简介

2、常用命令

3、数据结构

三、redis列表(List)

1、简介

2、常用命令

3、数据结构

四、redis集合(Set)

1、简介

2、常用命令

3、数据结构

五、redis哈希(Hash)

1、简介

2、常用命令

3、数据结构

六、redis有序集合Zset(sorted set)

1、简介

2、常用命令

3、数据结构

4、跳跃表


一、redis键(key)的常用操作

set key value   #添加键值对
keys *          #查看当前库所有key    (匹配:keys *1)
exists key      #判断某个key是否存在
type key        #查看你的key是什么类型
del key         #删除指定的key数据
unlink key      #根据value选择非阻塞删除。仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
expire key 20   #20秒钟:为给定的key设置过期时间
ttl key         #查看还有多少秒过期,-1表示永不过期,-2表示已过期
dbsize          #查看当前数据库的key的数量
flushdb         #清空当前库
flushall        #通杀全部库

二、redis字符串(String)

1、简介

String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。

2、常用命令

set <key> <value>             # 添加键值对
setnx <key> <value>           # 只有key值不存在时,可以将key-value添加数据库           
setex <key> <过期时间> <value> # 设置key值的同时,设置过期时间,单位秒

get <key>                     # 查询对应键值
append <key> <value>          # 将给定的<value> 追加到原值的末尾
strlen <key>                  # 获得值的长度

incr <key>                    # 将key中储存的数字值增1。只能对数字值操作,如果为空,新增值为1
decr <key>                    # 将key中储存的数字值减1。只能对数字值操作,如果为空,新增值为-1
incrby/decrby  <key> <步长>   #将 key 中储存的数字值增减。自定义步长

 

# 同时设置一个或多个 key-value对
mset <key1> <value1> <key2> <value2> ..... 
# 同时获取一个或多个 value
mget <key1> <key2> <key3> .....
# 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在才能成功。
# 原子性,有一个失败则都失败
msetnx <key1> <value1> <key2> <value2> ..... 
# 获得起始位置和结束位置(包含)的值
getrange <key> <起始位置> <结束位置>
# 用<value>覆写<key>所储存的字符串值,从<起始位置>开始(索引从0开始)。
setrange <key> <起始位置> <value>
# 以新换旧,设置了新值同时获得旧值
getset <key><value>

3、数据结构

String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

 如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。

三、redis列表(List)

1、简介

单键多值

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

2、常用命令

# 从左边/右边插入一个或多个值
lpush/rpush <key> <value1> <value2> <value3>....
# 从左边/右边吐出一个值。值在键在,值光键亡
lpop/rpop <key>
# 按照索引下标获得元素(从左到右),0是遍第一个,-1是右边第一个;0 -1 表示获取所有
lrange <key> <start> <stop>

# 从<key1>列表右边吐出一个值,插到<key2>列表左边
rpoplpush  <key1> <key2> 
# 按照索引下标获得元素(从左到右)
lindex <key> <index>
# 获得列表长度
llen <key>
# 在<value>的前面插入<newvalue>插入值
linsert <key> before <value> <newvalue>
# 在<value>的后面插入<newvalue>插入值
linsert <key> after <value><newvalue>
# 从左边删除n个value(从左到右)
lrem <key> <n> <value>

3、数据结构

List的数据结构为快速链表quickList。

首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。

它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist。

因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。

Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

四、redis集合(Set)

1、简介

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Redis的Set是string类型的无序集合它底层其实是一个valuenullhash,所以添加,删除,查找的复杂度都是O(1)

一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变

2、常用命令

# 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
sadd <key> <value1> <value2> .....
# 取出该集合的所有值
smembers <key>
# 判断集合<key>是否为含有该<value>值,有1,没有0
sismember <key> <value>
# 返回该集合的元素个数
scard <key>
# 随机从该集合中吐出一个值
spop <key>
# 删除集合中的某个元素
srem <key> <value1> <value2> ....
# 随机从该集合中取出n个值,不写默认1个。此操作不会从集合中删除 
srandmember <key> <n>

 

# 把集合中一个值从一个集合移动到另一个集合
smove <source> <destination> value
# 返回两个集合的交集元素
sinter <key1> <key2>
# 返回两个集合的并集元素
sunion <key1> <key2>
# 返回两个集合的差集元素(key1中的,不包含key2中的)
sdiff <key1> <key2>

3、数据结构

Set数据结构是dict字典,字典是用哈希表实现的。

Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。

五、redis哈希(Hash)

1、简介

Redis hash 是一个键值对集合。

Redis hash是一个string类型的fieldvalue的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>。

用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有两种:

第一种:

缺点:每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大。

第二种:

缺点:用户ID数据冗余。

Hash方式:

通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

2、常用命令

# 给<key>集合中的  <field>键赋值<value>
hset <key> <field> <value>
# 批量设置hash的值
hmset <key1> <field1> <value1> <field2> <value2>...
# 从<key>集合<field>中取出value
hget <key> <field>
# 查看哈希表 key 中,给定域 field 是否存在
hexists <key> <field>
# 列出该hash集合的所有field
hkeys <key>
# 列出该hash集合的所有value
hvals <key>
# 为哈希表 key 中的域 field 的值加上增量 1
hincrby <key> <field> <increment>
# 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
hsetnx <key> <field> <value>

3、数据结构

Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。

六、redis有序集合Zset(sorted set)

1、简介

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。

不同之处是有序集合的每个成员都关联了一个评分(score,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了

因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

2、常用命令

# 将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zadd  <key> <score1> <value1> <score2> <value2>…
# 返回有序集 key 中下标在<start><stop>之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集
zrange <key> <start> <stop>  [WITHSCORES]
# 返回有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的元素。有序集成员按 score 值递增(从小到大)次序排列
zrangebyscore key min max [withscores]
# 返回有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的元素。有序集成员按 score 值递减(从大到小)次序排列
zrevrangebyscore key max min [withscores]

# 为元素的score加上增量
zincrby <key> <increment> <value>
# 删除该集合下,指定值的元素 
zrem  <key> <value>
# 统计该集合,分数区间内的元素个数 
zcount <key> <min> <max>
# 返回该值在集合中的排名,从0开始
zrank <key> <value>

3、数据结构

SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。

zset底层使用了两个数据结构

(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

4、跳跃表

1、建立

跳跃表是一种有序的数据结构,其本质是一个带索引的有序链表。通过对链表做多级索引,可以实现链表的快速查找。我们先来看看常规跳表是什么样的。

 

如果所示,当我们对一个链表进行查找时,只能顺序遍历查找,时间复杂度O(n)。链表不像数组可以直接通过下标访问,那么要如何提高链表的查找效率呢?

没错,提高查找效率的最常用的方式就是建立索引。针对原始链表,每两个链表节点建立一个索引节点,索引节点通过指针指向下一个索引节点,并添加一个指向下一索引层节点的指针,这样就形成了一个一级索引。同样,再对一级索引层建立索引,形成二级索引。

当然,建立索引的规则并不是固定的,也可以是每3个,每4个,甚至是随机选定节点来创建索引。

2、查找

假如我们要查找5这个节点,我们先从二级索引查起,发现5处于1跟6中间,于是沿着1节点下移到一级索引,继续往后查找。然后发现5处于4跟6节点中间,沿着4节点下移到原始节点,往后查找,最后找到5这个节点。是不是非常像数组的二分查找呢。

3、时间复杂度

假定我们每k个节点建立一层索引,示例中k = 2 。那么在每层中最多遍历k个节点,即可进入下一层。

假定原始链表共有n个节点,一级索引节点数为Math.ceil(n/k),即n除以k并向上取整,近似等于n/k;同理,二级索引近似等于一级索引除以k;可推出第h级索引的节点数为n / (k ^ h) 。在最高层索引一般为2个节点,所以有 n / (k ^ h) = 2,可求出h = log以k为底,n / 2的对数 = log(k, n) - log(k, 2)。加上原始链表这一层,可得总层数m = log(k, n) - log(k, 2) + 1 。去掉常数阶后m = log(k, n)。

知道每层遍历的节点数k,以及层数m后,就可以求得查找的时间复杂度O(n) = k * m = k * log(k, n)。因为k为常数阶,去掉后O(n) = log(n)。

 

从此可以看出跳跃表比有序链表效率要高

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

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

相关文章

Django(16):rest_framework框架使用指南

目录1.安装配置2.数据序列化2.1 Serializer2.2 ModelSerializer2.3 序列化对象的属性和方法3.请求和响应3.1 Request3.2 Response3.3 状态码3.4 as_view3.5 format_suffix_patterns3.6 示例4.CBV构建&#xff08;基于类的视图&#xff09;4.1 如何构建4.2 类型视图的扩展功能4.…

DMIPS, FLOPS, OPS概念

DMIPS DMIPS(Dhrystone Million Instructions executed Per Second)&#xff1a;Dhrystone是测量处理器运算能力的最常见基准程序之一&#xff0c;常用于处理器的整型运算性能的测量。Dhrystone是一种整数运算测试程序。换句话说&#xff0c;就是使用Dhrystone这种程序在不同的…

【云原生 | 52】Docker三剑客之Docker Compose第三节

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

FineReport填报报表

二次确认&#xff0c;删除行&#xff1a;参考&#xff1a; JS实现删除时二次确认- FineReport帮助文档 - 全面的报表使用教程和学习资料JS实现记录填报操作- FineReport帮助文档 - 全面的报表使用教程和学习资料确认后直接校验提交// 二次确认 var cell this.options.location…

开始安装Domino 12.0.2

大家好&#xff0c;才是真的好。 上周我们话题是NotesDomino12.0.2产品发布&#xff0c;主要说到了Domino12.0.2的新特性&#xff0c;新特性很多&#xff0c;要用很多篇来进行测试和说明。 今天我们主要谈谈Domino 12.0.2的系统要求和安装等。 首先&#xff0c;Domino12.0.2…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS&#xff1f; 二、为什么选择FreeRTOS&#xff1f; 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS&#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system,中文就是实时操作…

python数据结构(一):字符串

一、字符串的格式化输出 1.1、格式化运算符 print("我跑完了第" str(lap 1) "圈")上面这段输出的代码使用了两个加号做了字符串拼接&#xff0c;并且将整形转换成了字符串。也可以使用一种更好的办法&#xff0c;格式化输出来打印这句话。 print(&quo…

xilinx srio ip学习笔记之再识srio

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 xilinx srio ip学习笔记之再识srio前言SRIO的理解IP核的理解前言 这段时间&#xff0c;随着对SRIO的学习&#xff0c;又有了更深的一点认识&#xff0c;不像一开始这么慌张了…

年终汇报工作,如何用项目管理工具展现成果

据报道&#xff0c;2022年11月20日的一次京东内部会议上&#xff0c;刘强东痛批京东中高层管理人员&#xff0c;表示部分高管醉心于 PPT 和奇妙词汇&#xff0c;或吹得天花乱坠但是执行一塌糊涂。 不可否认&#xff0c;刘强东提到的现象&#xff0c;的确是当今众多互联网大厂和…

基于frp实现外网访问个人本地服务器

适用对象想要通过frp实现内网服务被外网访问的人。关键词描述内网&#xff1a;内网指的是局域网&#xff0c;几台或者几十台电脑之间互访&#xff0c;也叫私网。外网&#xff1a;指的是我们上的Internet网络&#xff0c;也叫公网。需要具备的知识基础和条件1&#xff1a;外网服…

Java异常分类常见使用场景

今天在自己实现RxJava框架时&#xff0c;发现一些参数异常、流关闭异常等&#xff0c;Rxjava框架是会抛出相应的异常的&#xff0c;所以自己编写实现这块源码的时候&#xff0c;渐渐的也需要使用到这些知识&#xff0c;这里对这块做一下回顾总结。 使用 我们代码编写实现中&am…

开年喜讯!知道创宇一连斩获2022年度“IT168技术卓越奖”三项大奖

近日&#xff0c;业界知名IT垂直门户媒体IT168发布“2022年度IT168技术卓越奖”获奖名单&#xff0c;知道创宇凭借强大的技术优势与出色的产品能力脱颖而出&#xff0c;一举斩获网络安全领域三项大奖&#xff1a; 知道创宇创始人、CEO赵伟获评“数字化转型领军人物” ScanV-互…

【C++】优先级队列priority_queue/仿函数(函数对象)

这里写目录标题一.优先级队列1.优先级队列的介绍2.priority_queue的定义与使用二.仿函数/函数对象三.优先级队列的模拟实现一.优先级队列 1.优先级队列的介绍 1&#xff09;注意优先级队列和队列不是一个东西&#xff0c;队列是容器&#xff0c;优先级队列是一种容器适配器&am…

服务监控之promethues+grafana,直接送你上大师,这还不上热门吗

最近的项目需要上监控&#xff0c;虽然之前也是使用这个方案&#xff0c;但是作为使用者一直没有太关注细节&#xff0c;也没有真正的去部署过&#xff0c;刚好凑着这次机会&#xff0c;彻底掌握下这套监控系统 1、监控系统架构 监控的架构这个图几乎每个文章都有&#xff0c…

学习JS,实现自动打字机动效

前几天遇到一个需求&#xff0c;产品告诉我说&#xff0c;希望这些字可以像自动打字那样&#xff0c;一个一个的出来&#xff0c;于是在完成需求的同时&#xff0c;顺便把这个方法记录出来&#xff0c;看大家是否也需要。 目录 1、实现思路 2、html布局和css样式 3、预定义…

【数据库】什么是关系型数据库和非关系型数据库

数据库分类关系型数据库非关系型数据库键值对存储数据库列存储数据库搜索引擎数据库面向文档数据库图形数据库数据库优缺点应用程序都离不开数据库&#xff0c;那不同的数据结构&#xff0c;就会存放在不同的数据数据库中&#xff0c;所以数据库按数据结构分为关系型数据库和非…

spring事务失效的一些场景

1、 Transactional 只能作用在public修饰的方法上 spring事务的实现AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断&#xff0c;如果目标方法不是public&#xff0c;则TransactionAttribute返回null&#xff0c;即不支持事务。 2…

ORB-SLAM3算法和代码学习——跟踪参考关键帧TrackReferenceKeyFrame

0总述 无论是跟踪恒速运动模型还是跟踪参考关键帧&#xff0c;本质上都是基于帧间匹配跟踪。 跟踪恒速模型是当前帧和上一帧之间的匹配&#xff0c;使用基于恒速模型计算得到的位姿作为优化的初始位姿&#xff0c;基于网格和搜索半径寻找匹配关系。 跟踪参考关键帧是当前帧和…

SpringCloudAlibabaSentinel实现网关动态限流

目录 1.SpringCloudAlibabaSentinel实现网关动态限流 1.概念和来历 2.概览及控制台搭建 3.控制台有哪些能力 4.功能及设计理念 5.限流的几种方法 2.SpringCloud Alibaba Sentinel 的降级功能 1.yml中添加配置 2.编写配置类 3.编写兜底工具类 3.Sentinel还对Feigin实…

代码整洁之道,好的代码就是为了更美好的生活

概述 美国童子军有一条简单的军规&#xff1a;让营地比你来时更干净。当梳理代码时&#xff0c;坚守此军规&#xff1a;每次 review 代码&#xff0c;让代码比你发现它时更整洁。 一位大神说过&#xff1a;“衡量代码质量的唯一有效标准&#xff1a;WTF/min”&#xff0c;并配…