String类型(字符串类型)

String 是Redis中最基本的类型。Redis中的String 类型是二进制安全的,也就是说在Redis中String类型可以包含各种数据,比如一张JPEG图片或者是一个序列化的Ruby对象。一个String类型的值最大长度可以是512M。

在Redis中String有很多有趣的用法,比如:

  • 把String当做原子计数器,这可以使用INCR家族中的命令来实现:INCR, DECR, INCRBY。
  • 使用APPEND命令来给一个String追加内容。
  • 把String当做一个随机访问的向量(Vector),这可以使用GETRANGE和 SETRANGE命令来实现
  • 使用GETBIT 和SETBIT方法,在一个很小的空间中编码大量的数据,或者创建一个基于Redis的Bloom Filter 算法。

查看String类型可用命令来获得更多信息,或者阅读Redis数据类型介绍一章。

Lists类型(列表类型)

Redis的列表类型中存储一系列String值,这些String按照插入的顺序排序。Redis的List可以从头部(左侧)加入元素,也可以从尾部(右侧)加入元素。

LPUSH 命令是在头部加入一个新元素,RPUSH 命令是在尾部加入一个新元素。当在一个空的键值(key)上执行这些操作时会创建一个新的列表。类似的,当一个操作清空了一个list时,这个list对应的key会被删除。这非常好理解,因为从命令的名字就可以看出这个命令是做什么操作的。如果使用一个不存在的key调用的话就会使用一个空的list。

一些例子:

1 LPUSH mylist a   # 现在list是 "a"
2 LPUSH mylist b   # 现在list是"b","a"
3 RPUSH mylist c   # 现在list是 "b","a","c" (注意这次使用的是 RPUSH)

list的最大长度是2^32 – 1个元素(4294967295,一个list中可以有多达40多亿个元素)

从时间复杂度的角度来看,Redis list类型的最大特性是:即使是在list的头端或者尾端做百万次的插入和删除操作,也能保持稳定的很少的时间消耗。在list的两端访问元素是非常快的,但是如果要访问一个很大的list中的中间部分的元素就会比较慢了,时间复杂度是O(N)。

Redis的Lists类型有很多有趣的用法,比如:

  • 在社交网络中使用List进行时间表建模,使用LPUSH命令在用户时间线中加入新的元素,然后使用LRANGE 命令来获得最近加入的元素。
  • 可以把LPUSH 和LTRIM 命令结合使用来实现定长的列表,列表中只保存最近的N个元素
  • 在创建后台运行的工作时,Lists可以作为消息传递原语,例如著名的Ruby库 Resque
  • 还有很多可以使用lists来做的事,这种数据类型支持很多命令,包括像BLPOP这样的阻塞命令

请查看lists类型可用命令来获得更多的信息,或者阅读Redis数据类型介绍一章

Sets类型(集合类型)

Redis的Sets类型是String的无序集合。增加,删除,测试元素是否存在的时间复杂度都是O(1)(不管集合中有多少元素都是稳定的时间消耗)

Redis Sets的一个重要特性是不允许重复元素。向集合中添加多次相同的元素,集合中只存在一个该元素。在实际应用中,这意味着在添加一个元素前不需要先检查元素是否存在。

关于Redis Sets一个非常有意思的事情是,它们支持多个服务器端命令来从现有集合开始计算集合,所以执行集合的交集,并集,差集都可以很快。

set的最大长度是2^32 – 1个元素(4294967295,一个set中可以有多达40多亿个元素)

Redis Sets有很多有趣的用法,比如:

  • 你可以使用Redis Sets来记录唯一的事物,比如,你想知道访问某个博客的IP地址,不要重复的IP,这种情况只需要在每次处理一个请求时简单的使用SADD命令就可以了,可以确信不会插入重复的IP.
  • Redis Sets 可以很好的表示关系。你可以使用Redis创建一个标签系统,每个标签使用一个Set来表示。然后你可以使用SADD 命令把具有特定标签的所有对象的所有ID放在表示这个标签的Set中。如果你想要知道同时拥有三个不同标签的对象,那么使用SINTER命令就好了。
  • 你可以使用SPOP 或者 SRANDMEMBER 命令从集合中随机的提取元素。

查看Set可用命令获得更多信息,或者阅读Redis数据类型介绍一章

Hashes哈希类型

Redis Hashes 保存String域和String值之间的映射,所以它们是用来表示对象的绝佳数据类型(比如一个有着用户名,密码等属性的User对象):

1 @cli
2  HMSET user:1000 username antirez password P1pp0 age 34
3  HGETALL user:1000
4  HSET user:1000 password 12345
5  HGETALL user:1000

一个有着少量数据域(这里的少量大概100上下)的hash,其存储方式占用很小的空间,所以在一个小的Redis实例中就可以存储上百万的这种对象。

虽然Hashes主要用于表示对象,他们可以存储很多的元素,所以你可以使用Hashes来做许多其他的工作。

Hash的最大长度是2^32 – 1个域值对(4294967295,一个Hash中可以有多达40多亿个域值对)

查看Hash类型可用命令来获得更多信息,或者阅读Redis数据类型介绍一章

Sorted sets 类型(有序集合类型)

Redis有序集合类型与Redis的集合类型类似,是非重复的String元素的集合。不同之处在于,有序集合中的每个成员都关联一个Score,Score是在排序时候使用的,按照Score的值从小到大进行排序。集合中每个元素是唯一的,但Score有可能重复。

使用有序集合可以很高效的进行,添加,移除,更新元素的操作(时间消耗与元素个数的对数成比例)。由于元素在集合中的位置是有序的,使用get ranges by score或者by rank(位置)来顺序获取或者随机读取效率都很高。(本句不确定,未完全理解原文意思,是根据自己对Redis的浅显理解进行的翻译)访问有序集合中间部分的元素也非常快,所以可以把有序集合当做一个不允许重复元素的智能列表,你可以快速访问需要的一切:获取有序元素,快速存在测试,快速访问中间的元素等等。

简短来说,使用有序集合可以实现很多高性能的工作,这一点在其他数据库是很难实现的。

使用有序集合你可以:

  • 在大型在线游戏中创建一个排行榜,每次有新的成绩提交,使用ZADD命令加入到有序集合中。可以使用ZRANGE命令轻松获得成绩名列前茅的玩家,你也可以使用ZRANK根据一个用户名获得该用户的分数排名。把ZRANK 和 ZRANGE结合使用你可以获得与某个指定用户分数接近的其他用户。这些操作都很高效。
  • 有序集合经常被用来索引存储在Redis中的数据。比如,如果你有很多用户,用Hash来表示,可以使用有序集合来为这些用户创建索引,使用年龄作为Score,使用用户的ID作为Value,这样的话使用ZRANGEBYSCORE 命令可以轻松和快速的获得某一年龄段的用户。

有序集合可能是Redis中最高级的数据类型了,所以请花一些时间查看一下 有序集合命令列表 来获得更多信息,同时你可能也想阅读Redis数据类型介绍

Bitmaps and HyperLogLogs类型(位图类型和HyperLogLogs类型)

Redis 也支持位图类型和HyperLogLogs 类型,他们是在String基本类型基础上建立的类型,但有自己的语义。

请参考Redis数据类型介绍 获得这些类型的信息。

  • 转载自 并发编程网 - ifeve.com

《Redis官方文档》Data types—数据类型相关推荐

  1. StackExchange.Redis 官方文档(五) Keys, Values and Channels

    StackExchange.Redis 官方文档(五) Keys, Values and Channels 原文:StackExchange.Redis 官方文档(五) Keys, Values an ...

  2. 《Redis官方文档》用Redis构建分布式锁

    <Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...

  3. Redis官方文档(入门必备)

    函数大全 中文文档 官方文档

  4. Redis 官方文档阅读之 High Availability

    文章目录 Distributed nature of Sentinel(sentinel的分布式特性) Quick Start Obtaining Sentinel(获取哨兵) Running Sen ...

  5. StackExchange.Redis官方文档(四)【键、值以及通道】

    键.值以及通道 在对待Redis时候,键和其他的事物之间有个相当重要的区别.键是在数据库中一段数据的唯一标识(可能String,List,Hash或者其他的Redis数据类型).键是没有任何实质意义, ...

  6. 《Redis官方文档》 FAQ

    参考:http://ifeve.com/redis-faq/ 为什么Redis与其他的k-v存储相比不一样 有两个主要的原因 redis在键-值数据库中是一个不同的发展方向,值可以包含更复杂的数据类型 ...

  7. 翻译: Oralce官方文档-- Data Blocks, Extents, and Segments

    Data Blocks, Extents, and Segments                                                                   ...

  8. 《Redis官方文档》Redis调试指南

    原文链接      译者:Adeline Redis开发过程中十分注重其稳定性:我们尽一切努力来保证每一个版本的稳定,不出现突然崩溃等情况.但是即使在我们百分百的努力下,仍然没办法保证百分百的无bug ...

  9. StackExchange.Redis 官方文档(六) PipelinesMultiplexers

    流水线和复用 糟糕的时间浪费.现代的计算机以惊人的速度产生大量的数据,而且高速网络通道(通常在重要的服务器之间同时存在多个链路)提供了很高的带宽,但是计算机花费了大量的时间在 等待数据 上面,这也是造 ...

最新文章

  1. message/maillog日志提示磁盘innode、io错误等,扫描磁盘很多坏道
  2. 第六章、epub文件处理 -- 解析container文件与.opf文件
  3. MATLAB数值计算与符号运算
  4. 小程序确定取消弹窗_浅析微信小程序modal弹窗关闭默认会执行cancel问题
  5. python 网页自动化框架_python+selenium自动化框架
  6. sqlachemy入门基础手册
  7. 论HTML5 Audio 标签歌词同步的实现
  8. mysql 图片转为二进制_php 图片转为二进制数据的方法
  9. python核心编程;可以帮你提高Python编程效率十条建议
  10. Qualcomm Atheros ar9285 连不上 tp link无线 的 问题
  11. html页面数学公式添加(附图)
  12. Android PreferenceActivity设置菜单使用
  13. 5年没发论文,读博想放弃?中科大博导万字自述:曾连收13封拒稿信...
  14. Linux中访问tomcat方式,linux软连接_Linux中为Tomcat启用软链接的三种方式
  15. mod mpm event php7.1,CentOS 7 安裝 PHP-FPM 及使用 mod_mpm_event
  16. 怎样在Word中添加批注?分享干货!word如何加入批注?
  17. SDHC 与SD的区别
  18. 基于lerna重构Concis组件库
  19. 【Leetcode_SQL】1179.重新格式化部门表
  20. 【基础练习】【BFS+A*】codevs1225八数码难题题解

热门文章

  1. 通过日志恢复MSSQL数据例子
  2. sql优化——模糊查询
  3. vi或vim查找替换
  4. python相比于excel的优势_对照Excel使用Python进行数据分析,更快掌握
  5. c语言printf %llo,c++ - Printf疯狂了 - 堆栈内存溢出
  6. android 获取phone实例,android – 可以通过sdk来实例化一个telephony.Phone对象吗?
  7. 计算机用语优秀怎么算,计算机专业用语
  8. mysql如何管理空间_管理空间的mysql数据库
  9. vue中自定义指令、组件化、生命周期、节流和防抖、获取DOM、mint-ui简介、过渡和动画
  10. 实战Zabbix-Server数据库MySQL的libdata1文件过大