Redis常用数据类型及使用场景
Redis最为常用的数据类型
- 字符串(String)
- 字符串列表(list)
- 字符串集合(set)
- 哈希(hash)
- 有序的字符串集合(sorted set)
String(字符串)
字符串是最基本的一种Redis值。Redis字符串是二进制安全的,这意味着Redis字符串可以包含任何类型的数据,例如JPEG图像或序列化的Ruby对象。字符串的长度可以是最大512MB。
可以用Redis中的字符串做一些有趣的事情,例如:
- 将字符串用作原子计数器,使用INCR系列中的命令:INCR、DECR、INCRBY。
- 使用Append命令向字符串追加。
- 使用字符串作为带有GETRANGE和SETRANGE的随机访问向量。
- 在小空间中编码大量数据,或者使用GETBIT和SETBIT创建Redis支持的Bloom过滤器。
List(字符串列表)
Redis列表是简单的字符串列表,按插入顺序排序。可以将元素添加到Redis列表中,在列表的头部(左侧)或尾部(右侧)添加新元素。LPUSH命令在头部插入一个新元素,而RPUSH在尾部插入一个新元素。当对空键执行其中一个操作时,将创建一个新列表。类似地,如果列表操作将清空列表,则从键空间中删除该键。这些都是非常方便的语义,因为如果使用不存在的键作为参数进行调用,那么所有列表命令的行为都与使用空列表调用它们时的行为完全相同。
列表操作和结果列表的一些示例:
LPUSH mylist a # now the list is "a"
LPUSH mylist b # now the list is "b","a"
RPUSH mylist c # now the list is "b","a","c" (使用 RPUSH命令)
列表的最大长度是2^32 - 1个元素(4294967295,每个列表可以包含超过40亿个元素)。从时间复杂性的角度来看,Redis列表的主要特性是支持在头和尾附近不断地插入和删除元素,即使插入了数百万元素。访问元素在列表的极端位置非常快,但是如果你试图访问一个非常大的列表的中间位置,则速度会很慢,因为这是一个O(N)操作。
可以用Redis中的字符串做一些有趣的事情,例如:
- 为社交网络中的时间轴建模,使用LPUSH在用户时间线上添加新元素,使用LRANGE检索最近插入的一些项。
- 可以使用LPUSH和LTRIM一起创建一个列表,该列表的元素数量不会超过给定的元素数量,但是只记住最新的N个元素。
- 列表可以用作消息传递原语,例如用于创建后台作业的著名Resque Ruby库。
- 可以使用列表做更多的事情,这种数据类型支持许多命令,包括像BLPOP这样的阻塞命令。
Set(集合)
Redis集合是字符串的无序集合。可以在O(1)中添加、删除和测试成员的存在性(无论集合中包含多少元素,时间都是常量)。Redis集具有不允许重复成员的理想属性。多次添加相同的元素将导致一个集合具有此元素的单一副本。实际上,这意味着添加成员不需要检查是否存在,然后添加操作。关于Redis集合,它们支持从现有集合开始计算集合的许多服务器端命令,因此可以在很短的时间内完成集合的并集、交集和差异。一个集合的最大成员数是2^32 - 1(4294967295,每个集合的成员数超过40亿)。
可以用Redis集合做很多有趣的事情,例如:
- 可以使用Redis集跟踪唯一的东西。想知道访问给定博客文章的所有唯一IP地址吗?每次处理页面视图时只需使用SADD即可。不用担心重复ip问题,因为集合会自动过滤。
- Redis集合很好地表示关系。可以使用Redis创建一个标记系统,使用一个集合来表示每个标记。然后,可以使用SADD命令将具有给定标记的所有对象的所有id添加到表示该特定标记的集合中。也可以使用SINTER命令返回交集成员集合。
- 可以使用集合使用SPOP或SRANDMEMBER命令随机提取元素。
Hash(哈希)
Redis散列是字符串字段和字符串值之间的映射,因此它们是表示对象的最佳数据类型(例如,具有多个字段(如name、姓氏、年龄等)的用户):
@cli
HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000
- 带有几个字段的散列(其中几个字段的意思是最多100个左右)以一种占用很少空间的方式存储,因此可以在一个小型Redis实例中存储数百万个对象。
- 虽然散列主要用于表示对象,但它们能够存储许多元素,因此你也可以将散列用于许多其他任务。
- 每个散列最多可以存储2^32 1个字段值对(超过40亿)。
Sorted-set(有序的set集合)
与Redis集合类似,Redis排序集是字符串的非重复集合。不同之处在于,排序集的每个成员都与分数相关,分数是用来对排序集进行排序的,从最小的分数到最大的分数。虽然成员是唯一的,分数可以重复。使用排序的集合,可以以一种非常快的方式(在与元素数量的对数成比例的时间内)添加、删除或更新元素。可以非常快速地按分数或按级别(位置)获取范围。访问排序集的中间也非常快,所以可以使用排序集作为一个非重复元素的智能列表,在其中你可以快速访问所需的一切:元素顺序,快速存在测试,快速访问中间元素!简而言之,使用排序集,你可以完成许多性能优异的任务,这些任务在其他类型的数据库中很难建模。
有了排序集,你可以:
- 在一款大型在线游戏中,你可以选择一个排行榜,每当有新的分数被提交时,你就可以使用ZADD进行更新。可以轻松地使用ZRANGE获取顶级用户,还可以在给定用户名的情况下,使用ZRANK返回其在列表中的排名。同时使用ZRANK和ZRANGE,可以向用户显示与给定用户类似的分数。这些操作都非常快。
- 排序集通常用于索引存储在Redis中的数据。例如,如果有许多表示用户的散列,那么可以使用一个已排序的集合,其中的元素以用户的年龄为得分,以用户的ID为值。因此,使用ZRANGEBYSCORE检索给定时间间隔的所有用户既简单又快速。
- 排序集可能是最先进的Redis数据类型,所以花点时间检查排序集命令的完整列表,以发现可以使用Redis做什么!
Redis常用数据类型及使用场景的更多相关文章
- Redis常用数据类型介绍、使用场景及其操作命令
Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...
- Redis常用数据类型
Redis常用数据类型 转载自:http://blog.sina.com.cn/s/blog_7f37ddde0101021q.html Redis最为常用的数据类型主要有以下五种: ●Str ...
- Redis常用数据类型及各种数据类型应用和实现方式
Redis常用数据类型: StringHashListSetSorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的: 首先Red ...
- Redis常用数据类型以及操作
Redis常用数据类型以及操作 目录 Redis常用数据类型以及操作 一.String数据类型 1. SET/GET/APPEND/STRLEN 2. INCR/DECR/INCRBY/DECRBY ...
- Redis各种数据类型的应用场景
redis是一种key values形式的非关系型数据库,通过内存存储,也可以把数据持久化到本地文件中. redis支持丰富的数据类型,String,list,set,zset,hash,下面说一下各 ...
- redis之 Redis常用数据类型
Redis最为常用的数据类型主要有以下7种: 一. String (字符) 常用命令: set,get,decr,incr,mget 等. 应用场景:String是最常用的一种数据类型,普通的key ...
- Redis常用数据类型和事物以及并发
Redis数据类型 基本类型(String int): 如 set key value .get key 等 所有命令都是按照 key value keys * 可以将全部数据列出,其中后面的 &qu ...
- Redis各种数据类型的使用场景
Redis的六种特性 l Strings l Hashs l Lists l Sets l Sorted Sets l Pub/Sub Redis各特性的应用场景 Strings Strings 数据 ...
- 一文搞定Redis五大数据类型及应用场景
本文学习知识点 redis五大数据类型数据类型:string.hash.list.set.sorted_set 五大类型各自的应用场景 @TOC 1. string类型 1-1 string类型数据的 ...
随机推荐
- flask_maple使用文档
安装 To install Flask-Maple: pip install flask-maple Or alternatively, you can download the repository ...
- python 数据类型一 (重点是字符串的各种操作)
一.python基本数据类型 1,int,整数,主要用来进行数学运算 2,bool,布尔类型,判断真假,True,False 3,str,字符串,可以保存少量数据并进行相应的操作(未来使用频率最高的一 ...
- 转---单页面应用下的JS内存管理
正文从这开始- 内存问题对于后端童鞋而言可能是家常便饭,特别是C++童鞋.我在实习时做过半年的c++游戏客户端开发(也是前端开发哦),也见识了各式各样的内存问题,就说说我的第一个坑,当时做个需求,就是 ...
- js 开发过程中经验及总结记录
一 let 和 var 作用域 1 普通用法 for (var i = 0; i < 5; i++) { console.log(i); } console.log(i); //-- ...
- mvc大对象json传输报错
public ActionResult GetLargeJsonResult() { return new ContentResult { Content = new JavaScriptSerial ...
- Stack Overflow 2016 最新架构探秘
原文:http://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/ 转载:http://www ...
- 公共技术点( Java 反射 Reflection)
转载路径:http://p.codekk.com/blogs/detail/5596953ed6459ae7934997c5 本文为 Android 开源项目源码解析 公共技术点中的 Java 反射 ...
- c# winform as3相互调用
C#主要代码: 首先要添加COM组件-Shockwave Flash Object //接收flash发送过来的信息 private void axShockwaveFlash1_Fla ...
- Vue源码翻译之渲染逻辑链
本篇文章主要要记录说明的是,Vue在Vdom的创建上的相关细节.这也是描绘了Vue在界面的创建上的一个逻辑顺序,同时我也非常拜服作者编码的逻辑性,当然或许这么庞大复杂的编码不是一次性铸就的,我想应该也 ...
- 【java初探】——格式化字符串
String 类的静态方法format()方法用于创建格式化字符串,format()方法有两种重载形式: format(String fromat,Object...args) 该方法使用指定的格式字 ...