一、扩展数据类型
除了String、List、Set、ZSet、Hash以外还有Bitmap、HyperLogLog、GEO等
- Bitmap:主要用来做二进制数据的统计(数据内容只有0/1状态);
- HyperLogLog:主要用来统计海量的不重复数据数量;
- GEO:主要用来保存经纬度数据。
扩展知识:
Redis如何存储经纬度数据,并且比较两个经纬度数据表示的地理位置的相近情况(应用于当前地图定位软件,外卖、打车…)。
不只是在Redis中,其他应用中(116.025489, 30.02546)和(125.54378, 45.78348)这样的经纬度数据之间都是可以比较的,而且存储时也是将一组包含两个浮点数的坐标转化为一串只包含0/1的编码(GeoHash编码);
GeoHash算法:
利用二分区间法,对比当前的经纬度分别属于哪一个区间,位于左侧区间那么该层取值为0,位于右侧区间那么在该层就取1,经纬度分别计算的到一个01组成的二进制串,最终依次从经度二进制串取一个数+从纬度二进制串取一个数+经度取二进制串下一个数+纬度取二进制串下一个数+…,得到的就是一个经纬度二进制串相互交叉的新二进制串,任意两组经纬度经过GeoHash得到的二进制串越接近,实际地理位置上两个位置也越接近,简单的可以用下图总结GeoHash算法。
二、自定义数据类型
其实就是自己封装一种数据类型,底层先用基本数据类型(int, long, byte……)定义该数据,然后再定义该数据的构造方法以及内存释放方法以及基本的增删改查等操作方法,需要一系列操作指令,有需要时可以再去学习。
当要使用该数据结构是,就现在内存中开辟该数据的空间,然后在底层内存空间中将其与RedisObject的元数据指针相连就能引用了(任何数据都是通过RedisObject引用的,当数据为整型时,直接在RedisObject的内存空间中用一个8字节内存代替指针,如果数据非整型就将RedisObject的8字节指针指向该数据在内存中的位置),简单如下图所示
参考文章:
https://time.geekbang.org/column/article/281745