Redis自学之路—基础数据结构(二)

news2024/11/18 20:34:28

目录

简介

Redis应用场景

Redis基础数据结构

一、string(字符串)

 string类型相关指令

二、list(列表)

 list类型相关指令

三、hash(字典)

hash类型相关指令

四、set(集合)

set类型相关指令

五、zset(有序列表)

zset类型相关指令

参考文献

通用规则

过期时间


简介

        Redis由意大利人Salvatore Sanfilippo(网名Antirez)开发,Redis得默认端口是6379,这个端口号也不是随机选的,而是由手机键盘字母“MERZ”的位置决定的;“MERZ”在Antirez 的朋友圈语言中是“愚蠢”的代名词,它由于意大利广告女郎“Alessia Merz”在电视节目上说了一堆愚蠢的话而被人熟知。

                

Redis应用场景

  • 热点数据缓存、对象缓存、全页缓存、热点数据缓存——缓存(string)
  • 分布式Session——数据共享分布式(string)
  • 分布式锁(string)
  • 全局ID(int,incrby)
  • 文章的阅读量、微博点赞数——计数器(int, incrby)
  • 限流(int,incrby)
  • 位统计(string)
  • 购物车(string或hash)
  • 用户消息时间线timeline(list)
  • 消息队列(list)
  • 抽奖(自带一个随机获得值:spop myset)
  • 点赞、签到、打卡
  • 商品标签
  • 商品筛选
  • 用户关注、推荐模型
  • 排行榜

Redis基础数据结构

        Redis有5种基础数据结构,分别为: string(字符串)、list(列表)、hash(字典)、set(集合)和zset(有序集合)。

一、string(字符串)

        字符串string是Redis最简单的数据结构,它的内部表示就是一个字符数组。Redis所有的数据结构都以唯一的key字符串作为名称,然后通过这个唯一key值来获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。

        Redis的字符串是动态字符串,是可以修改的字符串,内部结构的实现类似于Java的ArrayList,采用预分配冗余空间的方式减少内存的频繁分配,内部为当前字符串分配的实际空间capacity一般要高于实际字符串长度len。当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB的空间。

注意:

        字符串最大长度为512MB。

                        

 string类型相关指令

常用指令说明
get/set/del查询/设置/删除
set rekey data设置已经存在的key,会覆盖
setnx rekey data设置已经存在的key,不会覆盖

set key value ex time

设置带过期时间的数据
expire key设置过期时间
ttl查看剩余时间,-1永不过期,-2过期
append key合并字符串
strien key字符串长度
incr key累加1
decr key累减1
incrby key num累加给定数值

decrby key num

累减给定数值
getrange key start end截取数据,end=-1代表到最后
setrange key start newdata从start位置开始替换数据
mset连续设值
mget连续取值
msetnx连续设置,如果存在则不设置
其他指令说明
select index切换数据库,总共默认16个
flushdb删除当前下边db中的数据
flushall删除所有db中的数据

二、list(列表)

        Redis的列表相当于Java语言里面的LinkedList,注意它时链表而不是数组。这意味着list的插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。

        列表中的每个元素都是用双向指针顺序,串起来可以同时支持前向后向遍历。当列表弹出了最后一个元素之后,该数据结构被自动删除,内存被回收。

        Redis的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串,塞进Redis的列表,另一个线程从这个列表中轮询数据进行处理。

                

 list类型相关指令

指令说明
lpush userList  1 2 3 4 5构建一个list,从左边开始存入数据
rpush userList 1 2 3 4 5构建一个list,从右边开始存入数据
lrange list start end获得数据
lpop从左侧开始拿出一个数据
rpop从右侧开始拿出一个数据
llen listlist长度
lindex list index获取list下标的值
lset list index value把某个下标的值替换
linsert list before/after value插入一个新的值
lrem list num value删除几个相同数据
ltrim list start end截取值,替换原来的list

三、hash(字典)

        Redis的字典相当于Java语言里面的HashMap,它是无序字典,内部存储了很多键值对。实现结构上与Java的HashMap也是一样的,都是“数组+链表”二维结构。

        第一维hash的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。

        

不同的是,Redis的字典的值只能是字符串,另外它们rehash的方式不一样,

  •  Java的HashMap在字典很大时,rehash是个耗时的操作,需要一次性全部rehash。
  • Redis为了追求高性能,不能堵塞服务,所以采用了渐进式rehash策略。

渐进式rehash会在rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务以及hash操作指令中,循序渐进地将旧hash的内容一点点地迁移到新的hash结构中。当搬迁完成了,就会使用新的hash结构取而代之。

        

 当hash移除了最后一个元素之后,该数据结构被自动删除,内存被回收。

注意:存储对象(不能有嵌套对象)

hash类型相关指令

指令说明举例
hset key property value创建hash对象

hset user name xiaobai

创建一个user对象,这个对象中包含name属性,name值为xiaobai

hget key property获取key对象中的property的值hget user name 获取用户对象中的name的值
hmset设置对象中的多个键值对hmset user age 18 phone 123123
hmsetnx设置对象中的多个键值对,存在则不添加

hmsetnx user age 18

这种则不会添加

hmget获得对象中多个属性

hmget user age phone

获取user对象中的age和phone属性 

hgetall user获取整个对象的内容
hincrby user age 2累加属性
hincrby user age 2.2累加属性
hien user有多少个属性
hexists user age判断属性是否存在
hkeys user 获得所有属性
hvals user获得所有值
hdel user删除对象

四、set(集合)

        Redis的集合相当于Java语言里面的HashSet,它内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值NULL。

        当集合中最后一个元素被移除之后,数据结构被自动删除,内存被回收。

        set结构可以用来存储在某活动中中奖的用户ID,因为有去重功能,可以保证同一个用户不会中奖两次。

set类型相关指令

指令说明
sadd set [value……]添加(构建)set内容
smembers set查询set中所有的内容
scard set查看set中包含的数量
sismember set value判断值是否存在,1存在 0 不存在
srem set value删除值
spop set随机获取值
spop set index指定index获取值
srandmember key [count]随机获取count个内容
smove source target value将source 中的value移动到target中
sdiff set1 set2差集
sinter set1 set2交集
sunion set1 set2并集

五、zset(有序列表)

        zset可能是Redis提供的最有特色的数据结构,它类似于Java的SortedSet和HashMap的结合体,一方面是一个set,保证了内部value的唯一性,另一方面可以给每个value赋予一个score,代表这个value的排序权重。它的内部实现用的是一种叫作“跳跃列表”的数据结构。

        zset中最后一个value被移除后,数据结构被自动删除,内存被回收。

跳跃列表

        zset内部的排序功能是通过“跳跃列表”数据结构来实现的,它的结构非常特殊,也比较复杂。

        因为zset要支持随机的插入和删除,所以它不宜使用数据来表示。

 我们需要这个链表按照score值进行排序。这意味着当有新元素需要插入时,要定位到特定位置的插入点,这样才可以继续保证链表是有序的。通常我们会通过二分查找来找到插入点,但是二分查找的对象必须是数组,只有数组才可以支持快速位置定位,链表做不到,那该怎么办?

        跳跃列表就类似于层级制,最下面一层所有的元素都会串起来。然后每隔几个元素挑选出一个代表,再将这几个代表使用另外一级指针串起来。然后在这些代表里再挑出二级代表,再串起来。最终就形成了金字塔结构。

        “跳跃列表”之所以“跳跃”,是因为内部的元素可能“身兼数职”,中间的这个元素,同时处于L0、L1和L2层中,可以快速在不同层次之间进行“跳跃”。

         跳跃列表采取一个随机策略来决定新元素可以兼职到第几层。

        首先其位于 LO 层的概率肯定是 100% ,而兼职到 Ll 层只有 50% 的概率,至IJ L2 层只有 25% 概率,到 L3 层只有 12.5% 的概率,以此类推, 直随机到最顶层 L31 绝大多数元素都过不了几层,只有极少数元素可以深入到顶层。列表中的元素越多, 能够深入的层次就越深,元素能进入到顶层的可能性就会越大。

zset类型相关指令

指令说明

zadd zset 10 value1 20 value2 30 value3

设置memeber和对应的分数
zrange zset 0 -1查看所有zset中的内容
zrange zset 0 -1 withscores查看所有zset中的内容,带有分数
zrank zset value获取对应的下标
zscore zset value获得对应的分数
zcard zset统计个数
zrangebyscroe zset 分数1 分数2查询分数之间的member(包含分数1和分数2)
zrangebyscore zset (分数1 (分数2查询分数之间的member(不包含分数1和分数2)
zrangebyscore zset 分数1 分数2 limit start end查询分数之间的member(包含分数1 分数2),获得的结果集再次根据下标区间做查询
zrem zset value删除member

参考文献

Redis常用命令手册http://c.biancheng.net/redis2/zrangebyscore.htmlRedis命令中文翻译版(Redis Command Reference/ Redis Documentation)http://redisdoc.com/

通用规则

 list、set、hash、zset这四种数据结构是容器型数据结构,它们共享下面两条通用规则。

  • create if not exists:如果容器不存在,那就创建一个,再进行操作。比如rpush操作刚开始是没有列表的,Redis就会自动创建一个,然后再rpush进去新元素。
  • drop if no elements:如果容器里的元素没有了,那么立即删除容器,释放内存。这意味着lpop操作到最后一个元素,列表就消失了。

过期时间

        Redis所有的数据结构都可以设置过期时间,时间到了,Redis会自动删除相应的对象。需要注意的是,过期是以对象为单位的,比如一个hash结构的过期是整个hash对象的过期,而不是其中的某个字key的过期。

        还有一个需要特别注意的地方,如果一个字符串已经设置了过期时间,然后你调用set方法修改了它,它的过期时间会消失。


作者:筱白爱学习!!

欢迎关注转发评论点赞沟通,您的支持是筱白的动力!

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

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

相关文章

Mysql多表和窗口函数

1.多表查询--自关联查询 # 格式: select * from A join A on 条件; 或者 select * from A left join A on 条件; # 自关联查询的用法和 内连接, 外连接等操作一模一样, 只不过是: 表自己关联自己. # 应用场景: 分类表(多级), 行政区域表(3级, 省市区). # 查询结果: 跟上述多…

一起来学shiny把(2)—-shiny页面布局

什么是shiny?Shiny是一个R包,可让您轻松地直接从 R 构建交互式 Web 应用程序(应用程序)。本系列是个长教程,带你由浅入深学习shiny。 上一节我们在文章《R语言系列教程—–一起来学shiny吧(1)》…

什么是语音识别的语音搜索?

前言 随着智能手机、智能音箱等智能设备的普及,语音搜索已经成为了一种趋势。语音搜索不仅方便快捷,而且可以实现双手的解放。语音搜索的实现离不开语音识别技术,本文将详细介绍语音识别的语音搜索。 语音识别的基本原理 语音识别是将语音信…

高光谱图像处理的spectral模块一些用法

目录 1、安装 2、读取高光谱图像 3、显示高光谱图像 4、spectral的特点 5、标签图显示 6、标签、地物融合显示 8、显示三维立方体 9、保存图像 1、安装 pip install spectral -i https://pypi.tuna.tsinghua.edu.cn/simple 2、读取高光谱图像 # -*- coding:utf-8 _*…

react笔记_14在react中使用echarts

目录 echarts官网在项目引入echarts[1]下载[2-1] 全量引入[2-2]按需引入问题 - 仅引入核心模块 图表配置[1] 柱状图(bar)横/纵向柱状图 [2] 漏斗图(funnel)漏斗图的形状 echarts官网 echarts官网 在项目引入echarts [1]下载 npm install echarts [2-1] 全量引入 import *…

FPGA_学习_05_管脚约束

前言:就初学管脚约束相关知识而言,内容还不足以构成饱满的文章。 但管脚约束是一个独立的内容,它是值得有一篇单独的博客的。若后续学习了管脚约束新的知识,则进一步扩充本篇博客内容。 1 XDC基础语法 Vivado的管脚约束文件用XDC…

易基因:m5C高甲基化介导EGFR突变的非小细胞肺癌耐药潜在机理|国人佳作

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 对EGFR酪氨酸激酶抑制剂(EGFR-TKI)的固有耐药(Intrinsic resistance)和获得耐药(acquired resistance)是EGFR突变型非小细胞肺癌(NSCLC)患…

当上了小领导如何管理手下员工才能最高效的工作?

公司新建了一个项目,我负责招人并管理,之前没有正式的管理经验,如何才能更好的管理新人,快速推进工作? 在公司新建项目时,担任小领导的你需要负责招人和管理团队成员。作为一个没有正式管理经验的人&#x…

Elsevier Ocean Engineering Guide for Authors 解读

文章目录 ★Types of contributions★Submission checklistEthics in publishing★Declaration of competing interestDeclaration of generative AI in scientific writingSubmission declaration and verificationPreprint posting on SSRNUse of inclusive languageReportin…

vue-antd-admin加载动态菜单的步骤——vue3动态菜单——技能提升

最近在写后台管理系统时,发现老系统有个需求,就是动态加载菜单 以往的静态菜单:路由都放在router/config.js中,菜单页面放在pages里面。 加载的动态菜单:路由是通过接口获取,然后加载到路由中&#xff0c…

凌恩生物美文分享 | Nature教你如何深入开展植物基因组研究,看这篇绝对够!

自三代测序技术面世以来,基因组的相关研究迈上了一个新台阶,无论是完整性、连续性、准确性较二代测序技术组装基因组均有较大的提升。凌恩生物也紧随前沿,整合多种优势技术及信息分析平台,涵盖Illumina,Pacbio等多种测…

阿里主动改革,再次引领国内公司治理新浪潮

北京时间2023年5月18日美股盘前,阿里公布2023财年Q4及全年财报,整体财务状况符合市场预期,但推动组织变革的进度,却给了市场一个“惊喜”。 财报中,阿里宣布了整体组织变革背景下,旗下数个业务的未来方向&…

【HISI IC萌新虚拟项目】Package Process Unit模块整体方案·PART2

4.系统功能和主要技术指标论证 4.1芯片总体结构图 芯片总体结构框图如图2所示。 图 2 packet_process_unit 芯片结构框图 芯片内部主要电路包括 cpu_if 接口电路、sram 检测电路 test_core 以及 spt 包转发接口电 路。以下对主要部分分别进行简要介绍: 1.cpu_if 接口电路 该…

LOTO示波器如何测试阻抗的频响曲线

LOTO示波器如何测试阻抗的频响曲线 模块的输入输出端口,在电路分析上,一般简单表征为电阻来进行计算和分析。但多数情况下,这些端口并不是纯电阻的特性,更精确一些,它可能是电阻电容以及电感的组合,表现为非…

Vite打包优化

关于指标,这里简单介绍下常见的优化指标 FCP(First Contentful Paint):白屏时间(第一个文本绘制时间)Speed Index:首屏时间TTI(Time To Interactive): 第一次可交互的时l…

什么是合伙企业?普通合伙和有限合伙区别?

1.什么是合伙企业? 合伙企业是指由各合伙人订立合伙协议,共同出资,共同经营,共享收益,共担风险,并对企业债务承担无限连带责任的营利性组织。合伙企业一般无法人资格,不缴纳企业所得税,缴纳个…

自制0-36V便携电源:typec+pd诱骗

1、芯片选择: 1.1、LDR6321 选用LDR6321,最高诱骗输出20V,手册如下: https://atta.szlcsc.com/upload/public/pdf/source/20211112/6C547DE14631DD2A11892D79A9F4FADD.pdf 该芯片立创商城有售,淘宝也有售&#xff0c…

pix2pixHD

High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs pix2pixHD提出了一个模型用于从label map中生成真实的photo。 pix2pixHD都是使用的CGAN的思想,不同的是本文可以产生更加高清的图像,pix2pix生成的是256x256&#xf…

js内存泄露

文章目录 定义引起内存泄漏的操作:Chrome 控制台查看内存情况无痕模式PerformanceMemotry1. 先用 Allocation instrumentation on timeline 确认问题2. 再用 Head snapshot 定位代码 闭包函数使用不当 js内存泄露如何检测?场景有哪些?如何定位…

2023年财务管理案例研究与应用(圆桌)论坛在京举办

2023年5月13日,由中国企业财务管理协会、机械工业信息研究院与用友网络科技股份有限公司共同策划的 2023 财务管理案例研究与应用 (圆桌) 论坛在用友产业园成功举办。 国务院国资委财务监管与运行评价局局长李冰,中国企业财务管理协会副会长(…