Redis数据类型简介:
Redis支持字符串、哈希表、列表、集合、有序集合、位图、地理位置和HyperLogLog这八种数据类型。Redis的所有数据结构都以唯一的key字符串作为名称,然后通过这个唯一的key值获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。
1、字符串(string)
Redis的字符串时动态字符串,是可以修改的字符串,内部结构类似于Java的ArrayList。它采用预分配冗余空间的方式来减少内存的频繁分配,内部为当前字符串分配的实际空间capacity一般要高于实际字符串长度len。当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB的空间。需要注意的是字符串最大长度为512MB。
常见用途:
存储用户信息。存储对象时,将用户对象使用JSON序列化成字符串,然后塞进Redis来缓存。取出对象时,将JSON字符串反序列化用户对象。
2、列表(list)
Redis的列表相当于Java的LinkedList,注意它时链表而不是数组。这意味着list的插入与删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。列表中的每个元素之间都使用双向指针顺序连接,同时支持前后向遍历。当列表弹出最后一个元素时,该数据结构被自动删除,内存被回收。
常见用途:
充当异步队列。一个线程将需要延后处理的任务结构体序列化成字符串,塞进Redis的列表,另一个线程从这个列表中轮询数据进行处理。
3、字典(hash)
Redis的字典相当于Java语言里面的HashMap,如下图所示,它是无序字典,内部存储了很多键值对。实现结构上与HashMap也是一样的,都是 “数组 + 链表” 形式的二维结构,第一维hash的数组位置碰撞时,就会将碰撞的元素使用链表串联起来。
不同的是,Redis的字典的值只能是字符串,另外它们的rehash的方式也不一样。因为Java的HashMap在字典很大时,rehash是个耗时的操作,需要一次性全部rehash。Redis为了追求高性能,不能堵塞服务,所以采用渐进式的rehash策略。
渐进式的rehash会在rehash的同时,保留新旧两个hash结构,查询会同时查询两个hash结构,然后在后续的定时任务或者hash操作指令 (hset、hdel) 中,循环渐进地将旧hash的内容一点点地迁移到新的hash结构中。当搬迁完成后,就会使用新的hash结构取而代之。当hash移除了最后一个元素之后,该数据结构被自动删除,内存被回收。

常见用途:
存储用户信息,可以对用户结构中每个字段单独操作。
4、集合(set)
Redis集合相当于Java中的HashSet,它内部存储的值是无序的、唯一的。它的内部相当于一个特殊的字典,只不过字典中的所有的value都是一个值NULL。当集合中最后一个元素被移出之后,数据结构被自动删除,内存被回收。
常见用途:
存储活动中中奖的用户ID,因为自带去重功能,可以保证同一个用户不会中奖两次。
5、有序集合(zset)
Redis有序集合,如下图所示,类似于Java的SortedSet和HashMap的结合体。一方面它是一个set,保证了内部value的唯一性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重。它内部实现用的是一种叫作 “跳跃列表” 的数据结构。zset中最后一个value被移除后,数据结构被自动删除,内存被回收。

常见用途:
1、zset可以用来存储粉丝列表,value值是粉丝的用户ID,score是关注时间。实现对粉丝列表按关注时间进行排序。
1、zset可以用来存储学生成绩,value值是学生的ID,score是学生的成绩。对成绩进行排序得到其名次。
6、位图(bitmap)
Redis在2.2.0版本添加了对位图bitmap的支持。bitmap是一串连续的二进制数字 (0或1),每一位所在的位置为偏移 (offset),在bitmap上可执行AND,OR和XOR以及其它位操作。
常见用途:
统计日活跃用户或者网站页面访问量。
7、地理位置
Redis在3.2.0版本添加了对地理位置 (GEO) 的支持。它使用geohash保存地理位置的坐标,使用有序集合 (zset) 保存地理位置的集合。
常见用途:
1、根据经纬度查找地理位置;
2、根据地理位置计算经纬度;
3、根据地理位置,计算两地距离。
8、HyperLogLog
Redis在2.8.9版本添加了HyperLogLog数据结构。HyperLogLog是用来做基数统计的算法。它的优点是,在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。
在Redis里面,每个HyperLogLog键只需要占12KB的存储空间。在计数比较小时,它的存储空间才用稀疏矩阵存储,空用占用很小,仅仅在计数慢慢变大,稀疏矩阵占用空间渐渐超过阈值时,才会一次性转变成稠密矩阵,才会占用12KB的内存。HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身。它提供不精确的去重计数方案,标准误差是0.81%。
常见用途:
统计网站页面访问量。