深入理解redis数据类型

转载请注明出处:https://www.cnblogs.com/wenjunwei/p/9720033.html

redis的存储模型

redis不是普通的键值对存储,它实际上是一个数据结构存储服务器,可以支持不同类型的值。这意味着redis相比传统键值对字符串key和字符串value存储来说,redis的值可以包含更复杂的数据结构。

redis支持哪些数据结构呢?

1.String: 二进制安全字符串(Binary-safe strings)

2.列表(Lists): 根据插入顺序排序的字符串元素集合。从根本上来说就是链表。

3.集合(Sets): 无序且唯一的字符串元素集合。

4.有序集合(Sorted sets): 与Sets类似,但每个字符串元素都与一个浮点数关联,称为分数(score)。这里的元素总是会按分数来进行排序,因此又与Sets不同。(例如:你可以这样取值: 我要前十名、我要后十名)

5.哈希(Hashes): 是由与值相关联的字段组成的映射。字段和值都是字符串。这与Ruby或Python哈希非常相似。

6.位数组或简称位图(Bit arrays or simply bitmaps): 可以使用特殊命令处理字符串值,如:您可以设置和清除各个位,将所有位设置为1,查找第一组或未设置位等等。

7.HyperLogLogs: 这是一个概率数据结构,用于计算集合的基数。

 

Redis Key

RedisKey是二进制安全的,这意味着您可以使用任何二进制序列作为key,从"foo"这样的字符串到JPEG文件内容,又或者是空字符串,都是有效键。

rediskey的一些规则:

1.key太长是不好的。例如:一个1024字节的key,在内存方面就占用不少,而且在数据集中查找key的时候可能会需要几次高昂的key对比的过程。即使现在任务需要一个很大的key,我们通过散列法hashing(如SHA1)来获得key,从带宽和内存来看,这也是一个更好的办法。

2.key太短也是不好的。如果你将一个"user:1000:followers"的key改为"u1000flw",那是没有任何意义的。因为这种做法节省的空间很小,但是前者会更顾名思义。我们在工作中应该要找到一个衡量key值的平衡点。

3.最好坚持使用一种命名格式。例如:“object-type:id”,如“user:1000”。而点或短划线通常用于多字词字段,如“comment:1234:reply.to”或“comment:1234:reply-to”。可以定一个命名规范。

4.最大内存。redis中允许的key值最大是512MB。

 

Redis expires:有时间限制的key

在使用更复杂的数据结构之前,我们讨论一个无论任何数据类型都有的一个特性,称为Redis过期。您可以为key设置一个超时时间,这是一个有限的生存时间。当生存时间过去时,key就会自动销毁,就类似于key被调用了del命令一样。

关于redis到期信息:

1.可以使用秒或者毫秒精度进行设置。

2.但是,到期时间的分辨系数始终为1毫秒。

3.过期信息将被复制保留在磁盘中,当redis服务器停止时,时间依然在度过(这意味着redis会保存key过期的时间)。

 

一.Redis String

Redis的String类型是最简单的类型,与redis key有着密切关联。也是Memcached中唯一的数据类型,对于新手来说,在redis使用这个类型是很自然的。

由于Redis key是字符串,当value也是字符串的时候,会将字符串映射到另一个字符串。

常见实例:

1.例如缓存HTML片段或页面。

2.session缓存。

3.验证码缓存。

  

二.Redis Lists

列表实现主要有数组和链表,两种实现方法的到的list的属性差异很大。Redis Lists是通过链表实现的。这意味着即使列表中有数百万个元素,在列表头部或尾部新增元素的速度都是一样的。当然链表结构也是有缺点的,使用数组实现list,通过索引访问元素的速度非常快,而使用链表就咩有那么快了。

Redis使用链表实现Lists,对于数据库而言,最重要的是能够以非常快的方式将元素添加到很长的列表中。当快速访问大量元素集合的中间位置很重要时,可以使用不同的数据结构,称为sorted sets(后面会介绍到)。

常见实例

1.记住用户发布到社交网络的最新消息。

2.流程之间的通信,使用生产者将项目列表推入订阅模式。redis具有特殊的命令,使用这些用例更加的可靠和高效。

3.每次用户发布新照片,我们都可以将其ID添加到列表中。

4.当用户访问主页时,我们通过LRANGE 0 9命令获取最新的10个项目。

 

三.Redis Hashes

我们可以将Redis Hashes看为使用'哈希'作为对key/value的映射表。

添加和删除操作都是O(1)(平均)的复杂度。hash类型特别适合用于存储对象,但是放入的hash对象实际上的没有限制(除了可用内存之外),因此在应用程序中可以以许多不同的方式使用散列。

在field的数量在限制的范围内以及value的长度小于指定的字节数,即小哈希中,会在内存中以特殊的方式编码,会比较节省内存。

常用实例:

1.用于存储关系数据表或对象信息:如 {name:'张三',age:17}

四.Redis Sets

Redis Sets是无序的字符串集合。我们可以用作元素集合存储,也可以针对集合做其他操作。比如测试给定的元素是否存在,执行多个集合之间的交集,并集或差异等。

存储的数据结构是哈希表,所以增删改查的操作复杂度都是O(1)。

常见实例:

1.用于集合去重。

2.用于分布式锁。

 

五.Redis Sorted Sets

Sorted Sets数据类型就像是set和hash的混合。与sets一样,Sorted Sets是唯一的,不重复的字符串组成。可以说Sorted Sets也是Sets的一种。

虽然在Sets内部元素没有进行排序,但是Sorted Sets中每个元素都与浮点值相关联,称为分数(因为每个元素都映射到一个值,所以说有点类似hash)。

此外,Sorted Sets中的元素按顺序排序,他们的规则如下:

1.如果A和B是两个具有不同分数的元素,如果A.score > B.score,则 A > B。

2.如果A和B分数相同,如果A字符串在字典排序上大于B字符串,则A>B。在Sorted Sets中A、B字符串不能相等。

实现方式:Sorted Sets是通过Skip List(跳跃表)和hash Table(哈希表)的双端口数据结构实现的,因此每次添加元素时,Redis都会执行O(log(N))操作。所以当我们要求排序的时候,Redis根本不需要做任何工作了,早已经全部排好序了。元素的分数可以随时更新。

用法实战可看这篇文章:Redis实现世界杯排行榜功能(实战)

常见实例:

1.获取排行集合:获取第10-50名元素集合。

2.在分数范围操作:获取分数在60-80的元素集合。

3.Redis2.8后,在分数相同情况下,我们还可以根据字典顺序进行排序。

4.可以获取某个元素在集合中的名次。

 

六.Bitmaps

位图不是实际的数据类型,而是String类型上定义了一组面向位的操作。由于字符串是二进制安全的blob ,并且他们的最大长度为512MB,所以他们最多适合2^32不同的位。

位图的最大优势之一就是他们在存储信息时通常可以节省大量的空间。

常见实例:

1.各种实时分析。

2.存储与对象ID关联的节省空间但高性能的布尔信息。

 

七.HyperLogLogs

HyperLogLogs是用来做基数(不重复元素)统计的算法。HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

常见实例:

1.用来做基数统计的算法

 

 总结

通过上面的类型介绍,我们使用Redis时,通常会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),而每一种数据类型都有着各自的特性,我们需要根据自己的应用场景选择最合适的数据类型,利用最合适的特性,可以达到事半功倍的效果。

 

感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。

转载于:https://www.cnblogs.com/wenjunwei/p/9720033.html

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

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

相关文章

centos7 登陆报错 grep:write error

出现这个原因是因为磁盘空间满了 通过df -h查看存储空间 发现磁盘空间满了,可以用 find / -type f -size 1000M 查找大于1000M的文件删除 然后找到用rm -rf 命令删除 然后就不会出现这个问题了!转载于:https://www.cnblogs.com/lxs1314/p/8961113.html

你敢在post和get上刁难我,就别怪我装逼了

> 掘金编辑提醒:本文疑似有误,参考 听说「99% 的人都理解错了 HTTP 中 GET 与 POST 的区别」 之前好几次面试都被问到post和get有什么区别,肯定很多同学和我一样说了一大堆什么post比get安全,get比post传的少乱起八糟这样的答案…

昂首阔步:让开发人员喜欢使用您的REST API

随着JAX-RS API的发展,以及今年早些时候在JSR-339下发布的2.0版本,使用出色的Java平台创建REST服务变得更加容易。 但是,极大的简化带来了巨大的责任:记录所有这些API,以便其他开发人员可以快速了解如何使用它们。 不…

thinkphp mysql 更新_THINKPHP5修改数据库数据出现“缺少更新条件”的错误

查询数据库的数据分配显示在页面山修改后的数据准备传递到第三章图里接收数据,然后修改到数据问题出现的环境背景及自己尝试过哪些方法相关代码// 请把代码文本粘贴到下方(请勿用图片代替代码)第一张图代码public function edit(){$db_01new DB();$id_editRequest::…

angular ajax get post 参数,Angular的Post 传递参数问题及解决方法

一、传递参数过程中POST会出问题,问题来源:我们都知道向后台传参可以使用get、post,其形式类似于nameiyy&id001 。但是在angular中却发现使用$http post 进行异步传输的过程中后台是接收不到数据的,其实这个问题就是因为请求头…

[No0000187]可能是把Java内存区域讲的最清楚的一篇文章

写在前面(常见面试题) 基本问题: 介绍下 Java 内存区域(运行时数据区)Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式&#xff…

Java语言基础及java核心

一、Java语言特点 1、 简单 2、 面向对象 3、 分布式 4、 健壮 5、 安全 6、 中性架构跨平台 7、 超强的可移植性 8、 高性能 9、 多线程 二、java的环境变量 JAVA_HOMEC:\Program Files\Java\jdk1.8.0_101 (到你的安装目录下) CLASSPASH./ &#xff0…

如何使用Quartz Scheduler和日志记录创建Web应用程序

我有时会在Quartz Scheduler论坛中为用户提供帮助。 有时,有人会问他/她如何在Web应用程序中设置Quartz。 实际上,这是一件相当简单的事情。 该库已经带有一个ServletContextListener ,您可以使用它启动调度程序。 我将在这里向您展示一个简单…

移动端日期选择插件rolldate

rolldate为上一版jquery移动端时间插件的全新版本,目前保留了上一版的大部分功能,并且增加了回调函数,以及主题风格选取,最重要的是解决了上一版本的遗留问题,依赖jquery、滑动不够流畅、参数设计不够合理等等。开发日…

ik分词器 mysql php_php环境下使用elasticSearch+ik分词器进行全文搜索

首先需要说明的一点是,如果需要启用ik分词器,那么分词器的版本必须与es版本一致,即6.3.0的分词器需要同样6.3.0版本的es支持。安装javawin-64bit的安装包需要去java英文官网查找安装ES6.3.0版本es下载地址:https://www.elastic.co…

服务器如何查看gpu型号,linux 查看服务器gpu

linux 查看服务器gpu 内容精选换一换本节操作介绍通过华为云APP连接Linux实例的操作步骤。云服务器状态为“运行中”。已获取Linux云服务器用户名和密码,忘记密码请参考在控制台重置云耀云服务器密码重置密码。云耀云服务器已经绑定弹性公网IP。所在安全组入方向已开…

Antd-Select组件的深入用法

一、Antd-Select提供几种类型 最基础版只提供下拉功能的选择器带搜索功能的下拉选择器可多选的下拉选择器可搜索、可多选、可随意输入内容的tag下拉选择器(支持自动分词)多级联动下拉选择器搜索远程数据下拉框二、一些潜在用法 如果Select.Option选项的数量特别大:2k、3k... 假…

WS-Security:使用BinarySecurityToken进行身份验证

众所周知,WS-Security设定的目标之一是对SOAP消息强制执行完整性和/或保密。 在完整性的情况下,添加到SOAP消息的签名是数学过程的结果,该过程涉及发送者的私钥,从而导致加密的消息摘要。 默认情况下,大多数框架&…

Vue(ES6)中的data属性为什么不能是一个对象?

以下引官网原文:当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!通过提供 data 函数&#xff…

echarts vue 柱状图实例_VUE中使用Echarts绘制柱状图

在main.js中引入echartsimport echarts from ‘echarts‘Vue.prototype.$echarts echarts在相应的vue中导入echartsimport echarts from ‘echarts‘;实现柱状图显示mounted: function () {// 基于准备好的dom,初始化echarts实例let myChart echarts.init(documen…

从计算机体系结构方面思考深度学习

今年 1 月,谷歌人工智能负责人 Jeff Dean(当时还是谷歌大脑负责人)与 2017 年图灵奖得主、体系结构巨擘 David Patterson(当时获奖结果尚未公布)联合发表了题为《计算机体系结构黄金时代:赋能机器学习革命》…

使用Apollo通过WebSocket通过STOMP轻松进行消息传递

在我以前的文章中,我介绍了几个有趣的用例,这些用例使用著名的消息代理HornetQ和ActiveMQ通过Websockects实现STOMP消息传递。 但是我没有介绍的是Apollo,因为我个人认为它的API是冗长的,并且不像Java开发人员那样表现力强。 尽管…

h5渲染性能一瞥

内容来源:2018 年 6 月 30 日,饿了么前端主管向勇在“饿了么技术沙龙・第27弹 【前端专场】”进行《h5渲染性能一瞥》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发…

爬虫系列之requests

爬取百度内容: 1 import requests2 url "https://www.baidu.com"3 4 if __name__ __main__:5 try:6 kv {user-agent: Mozilla/5.0}7 r requests.get(url, headerskv)8 r.raise_for_status() #返回状态值,如果…

高并发常见面试题

1、线程与进程 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代…