我们都知道Redis常用的数据结构有五种分别为String,hash,set,list,zset。
特殊的数据结构有四种:bitmap,hyperLogLog,bloomFilter,GeoHash
虽然大家都也听说过,今天就来总结一下吧,毕竟Redis非常重要!
先大致写一下常用的:
String
String类型是 Redis中最常使用的类型,内部的实现是通过 SDS来存储的。SDS 类似于 Java 中的 ArrayList,它可以存储任意二进制数据,可以通过预分配冗余空间的方式来减少内存的频繁分配。 用处:普通的get,set方法KV操作,常规。
Hash
类似Map的一种结构。 用处:可以存入结构化数据,例如往缓存存一个对象,可以方便的操作其中的某个字段。
List
用处:使用List(有序链表)的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令(返回列表指定区间的元素),做基于redis的分页功能,性能极佳。
Set
Set 是无序集合,很明显的一个作用就是去重,不用多说。
Sorted Set(zset)
排好序的Set,底层实现跳表,多了一个权重参数score分数,写进去自动根据分数排序。
用处:排行榜应用之类的,用Sorted Sets来做带权重的队列。
接下来就是不常用的奥。
Bitmap
位图,字符串一个字符是8个比特, bitmap 底层就是 string, 用处:例如计算一个用户在指定时间内签到的次数,8位,1位表示一天,0表示未签到,1表示签到。
HyperLogLog
提供不精确的去重计数,小规模使用set去重,那要是访问量巨大呢?HyperLogLog就出现了,优势就是只占用 12KB 的内存。
GeoHash
可以用来保存地理位置,并作位置距离计算或者根据半径计算位置等。常用来计算 附近的人,附近的商店。
BloomFilter
他叫布隆,没错就是那个布隆,布隆过滤器。我第一次听说他的作用就是防止缓存穿透,利用高效算法来判断某个值是否存在。 用处:垃圾邮件过滤,缓存穿透
原理:当我们向 BloomFilter 添加数据的时候,它首先会将我们的数据(key)做几次hash运算,每个hash运算都会得到一个不用的位数组索引下标,此时我们就将算出的几个下标的位置的值改成1就行(就是放入bitmap中)。如果判断元素是否存在,只要 判断所在的所有索引下标的值都是1 就行了。
很明显有一个问题,下标重复了咋办,没办法,这就是误差,所以说,没有的肯定没有,有的也不一定有。