转载请注明出处: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种对象类型(字符串、哈希、列表、集合、有序集合),而每一种数据类型都有着各自的特性,我们需要根据自己的应用场景选择最合适的数据类型,利用最合适的特性,可以达到事半功倍的效果。

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

深入理解redis数据类型的更多相关文章

  1. redis数据类型及使用场景

    Redis数据类型  String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令:  set,get,decr,incr,mge ...

  2. Redis数据类型介绍

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  3. Redis-cluster集群【第一篇】:redis安装及redis数据类型

    Redis介绍: 一.介绍 redis 是一个开源的.使用C语言编写的.支持网络交互的.可以基于内存也可以持久化的Key-Value数据库. redis的源码非常简单,只要有时间看看谭浩强的C语言,在 ...

  4. 深入理解Redis:底层数据结构

    简介 redis[1]是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...

  5. Redis笔记(二):Redis数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  6. Redis 基础:Redis 数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  7. Redis数据类型及常用命名总结

    Redis数据类型: Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合).  1.String(字符串) ...

  8. Redis(三):Redis数据类型

    Redis数据类型目录导航: Redis五大数据类型 哪里去获取Redis常见数据类型操作命令 Redis键(Key) Redis字符串(String) Redis列表(List) Redis集合(S ...

  9. Redis数据类型和操作

    <"Java技术员"成长手册>,包含框架.存储.搜索.优化.分布式等必备知识,都收集在GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎指导 Redis ...

随机推荐

  1. 如何安装ubuntu系统

    https://www.cnblogs.com/Chinasf/archive/2010/05/06/1728840.html    [Ubuntu 下挂ISO到虚拟光驱的方法] 各种方法参考如下论坛 ...

  2. CentOS 7 rpm安装jdk

    RPM 安装jdk1.8.0_111 ,查询系统自带的jdk rpm -qa | grep java 查询结果如下: [root@bogon ~]# rpm -qa | grep java javap ...

  3. easyui的下拉框combox动态复赋值显示在前端

    editbale:false设置为本输入框禁止编辑

  4. 支持Linux,嗅探和注入功能的网卡

    支持的WiFi USB 以下是已知可以很好地支持Linux,嗅探和注入功能,外部天线(可以替换)和强大的TX功率以及良好的RX灵敏度的Wifi卡的列表 TP-LINK TL-WN722N(仅限卷1) ...

  5. repo 用法

    repo的用法(zz) 注:repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是说,他是用来管理给git管理的一个个仓库的) ...

  6. Fiddler的配置

    增加监控请求的详情时间  //添加请求的响应时间 public static BindUIColumn("Time Taken")           function CalcT ...

  7. 每天学点SpringCloud(六):Hystrix使用

    Hystrix是一个实现断路器模式的库.什么是断路器模式呢?就像我们家庭中的电闸一样,如果有那一处出现意外,那么电闸就会立刻跳闸来防止因为这一处意外而引起更大的事故,直到我们确认处理完那一处意外后才可 ...

  8. Ubuntu18.04或者Deepin15.8 部署Django项目

    一.首先先安装nginx静态服务 1.安装gcc g++的依赖库sudo apt-get install build-essential && sudo apt-get install ...

  9. jQuery.extend(object)

     为jQuery类添加类方法,可以理解为添加静态方法. jQuery.extend({ min: function(a, b) { return a < b ? a : b; }, max: f ...

  10. Kali学习笔记6:二层发现

    先介绍下ARPING命令: arping命令是用于发送ARP请求到一个相邻主机的工具 arping使用arp数据包,通过PING命令检查设备上的硬件地址.能够测试一个IP地址是否是在网络上已经被使用, ...