Redis核心技术-数据结构2-数据(String、Hash、List、Set、Sorted Set、bitmaps、hyperLogLogs)类型

  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亿个元素)。

  可以同时使用LPUSHLTRIM去创建一个永远不会超过指定元素数目的列表并同时记住最后的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. 恒定时间的单个位操作,例如将位设置为 1 或 0,或获取其值;
  2. 对位组的操作,例如计算给定位范围内设置位的数量。

  位图的最大优点之一是它们在存储信息时通常可以极大地节省空间。 例如,在不同用户由增量用户 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的几条规则:

  1. 键值不宜太长,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
  2. 键值不宜太短,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读。
  3. 最好坚持一种命名模式。例如:”object-type🆔field”就是个不错的注意,像这样”user:1000:password”。

  key长度是否有限制呢?
  有的,最大值限制512M

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冲上云霄的Jayden

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值