Redis数据结构众多,如何指定key对应那种数据类型呢?
使用 type 命令:
> set str-key strval
OK
> type str-key
string
Redis支持数据类型
字符串(strings)
Redis字符串能包含任意类型的数据。
一个字符串类型的值最多能存储512M字节的内容。
散列(hashes)
Hashes,由field和关联的value组成的map。field和value都是字符串
列表(lists)
lists基于Linked Lists实现。意味着即使在一个list中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别。
lists是简单的字符串列表,按照插入顺序排序。
可以添加一个元素到列表的头部(左边:LPUSH)或者尾部(右边:RPUSH)。
一个列表最多可以包含232-1个元素(4294967295,每个表超过40亿个元素)。
可以同时使用LPUSH和LTRIM去创建一个永远不会超过指定元素数目的列表并同时记住最后的N个元素。
集合(sets)
set是一个无序集合,不允许相同成员存在的字符串合集.
有序集合(sorted sets)
sorted sets和sets类似,是不包含相同字符串的合集。
每个sorted sets的成员都关联着一个评分(score,浮动数值floating number value),这个评分用于把sorted sets中的成员按最低分到最高分排列。
使用sorted sets,你可以非常快地(O(log(N)))完成添加,删除和更新元素的操作。
元素是在插入时就排好序的,所以很快地通过评分(score)或者位次(position)获得一个范围的元素。
范围查询
bitmaps
位图不是实际的数据类型,而是在 String 类型上定义的一组面向位的操作。 由于字符串是二进制安全的 blob,并且它们的最大长度为 512 MB,因此它们适合设置最多 2^32 个不同的位。
位操作分为两组:
- 恒定时间的单个位操作,例如将位设置为 1 或 0,或获取其值;
- 对位组的操作,例如计算给定位范围内设置位的数量。
位图的最大优点之一是它们在存储信息时通常可以极大地节省空间。 例如,在不同用户由增量用户 ID 表示的系统中,仅使用 512 MB 的内存就可以记住 40 亿用户的单个位信息(例如,知道用户是否想要接收时事通讯)。
HyperLogLogs
HyperLogLogs是被用于估计一个 sets 中元素数量的概率性的数据结构(用来做基数统计的算法)。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
主要适用场景是海量数据的计算。特点是速度快。占用空间小。
地理空间(geospatial) 索引半径查询
时间复杂度:每一个元素添加是O(log(N)) ,N是sorted set的元素数量。
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。
经纬度有效范围:
1.有效的经度从-180度到180度。
2.有效的纬度从-85.05112878度到85.05112878度。
它是如何工作的?
sorted set使用一种称为Geohash的技术进行填充。经度和纬度的位是交错的,以形成一个独特的52位整数. 我们知道,一个sorted set 的double score可以代表一个52位的整数,而不会失去精度。
这种格式允许半径查询检查的1 + 8个领域需要覆盖整个半径,并丢弃元素以外的半径。通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的sorted set中的查询。
Redis keys
Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。
key的几条规则:
- 键值不宜太长,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
- 键值不宜太短,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读。
- 最好坚持一种命名模式。例如:”object-type🆔field”就是个不错的注意,像这样”user:1000:password”。
key长度是否有限制呢?
有的,最大值限制512M。