背景:使用 string存储key,value,当保存的数据较小时,反而空间占用大,可以考虑使用hash 进行解决空间过大的问题。
这些entry不需要指针进行连接。
Redis 基于压缩列表实现了 List、Hash 和 Sorted Set 这样的集合类型,这样做的最大好处就是节省了 dictEntry 的开销。当你用 String 类型时,一个键值对就有一个 dictEntry,要用32 字节空间。但采用集合类型时,一个 key 就对应一个集合的数据,能保存的数据多了很多,但也只用了一个 dictEntry,这样就节省了内存。
127.0.0.1:6379> info memory
# Memory
used_memory:1039120
127.0.0.1:6379> hset 1101000 060 3302000080
(integer) 1
127.0.0.1:6379> info memory
# Memory
used_memory:1039136
一旦超过下面的阈值,hash类型就会使用哈希表来保存数据,一旦由压缩列表转为哈希表就不会逆转了。
例如上面使用了 后三位作为hash的key,这样hash-max-ziplist-entries
设置为1000,就可以一直使用Hash来节省空间了。
set的交,并, 差 计算复杂度高,会导致reids阻塞,可以选择一个从库,专门进行计算。
list 按照进入顺序排序,zset根据权重排序
二值状态,0 ,1类型 使用bitmap
HyperLogLog 适合基数统计,误差概率 0.81%
zadd online_users $timestamp $user_id
统计一段时间在线的用户数 zcount online_users $start_timestam p $end_timestamp
sadd user1 apple orange banana
、sadd user2 apple banana peach
记录2个用户喜欢的水果,zunionstore fruits_union 2 user1 user2
结果存储到fruits_union 中,zrange fruits_union 0 -1 withscores可以得出每种水果被喜欢的次数。
HyperLogLog的 pfcount page1:uv page2:uv page3:uv
或pfmerge page_union:uv page1:uv page2:uv page3:uv
得出3个页面的UV总和。
如果是在集群模式使用多个key聚合计算的命令,一定要注意,因为这些key可能分布在不同的实例上,多个实例之间是无法做聚合运算的,这样操作可能会直接报错或者得到的结果是错误的!
geo使用GeoHash编码,“二分区间,区间编码”
1.先对经度和纬度分别编码,然后再把经纬度各自的编码组合成一个最终编码
经度值 116.37,经度 编码[-180,180]。
纬度值 39.86,维度编码[-90,90]
我们刚刚计算的经纬度(116.37,39.86)的各自编码值是 11010 和 10111,组合之后,第0 位是经度的第 0 位 1,第 1 位是纬度的第 0 位 1,第 2 位是经度的第 1 位 1,第 3 位是纬度的第 1 位 0,以此类推,就能得到最终编码值 1110011101,
GEO 类型是把经纬度所在的区间编码作为 Sorted Set 中元素的权重分数,把和经纬度相关的车辆 ID 作为 Sorted Set 中元素本身的值保存下来,这样相邻经纬度的查询就可以通过编码值的大小范围查询来实现了。
GEOADD cars:locations 116.034579 39.030452 33
GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10
上一篇:R语言基础(八):绘图函数
下一篇:数据科学复习学习