Redis 数据结构扩展
共 3216字,需浏览 7分钟
·
2021-07-05 16:15
0x01:Pipeline
在用 普通 jedis 方式连接 redis 的时候,由于每次发送命令都会与 redis 进行连接,而实际处理命令的时间是非常短的,而连接却十分耗时,性能很低
n 个命令时间 = n 次连接时间 + n 次处理时间
使用一个缓冲区,命令全部写入缓冲区中,一次性发送给 redis,这样就可以不用建立多次连接
n 个命令时间 = 1 次连接时间 + n 次处理时间
注意:使用 Pipeline 的操作是非原子操作
Jedis jedis = new Jedis("127.0.0.1", 6379);
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
Pipeline pipeline = jedis.pipelined();
for (int j = i * 100; j < (i + 1) * 100; j++) {
pipeline.hset("bbbb" + j, "bbbb" + j, "bbbb" + j);
}
pipeline.syncAndReturnAll();
}
long end = System.currentTimeMillis();
System.out.println(end - start); // 118 ms
jedis.close();
0x02:GEO
是 zset 数据类型的一个扩展
127.0.0.1:6379> GEOADD locations 116.419217 39.921133 beijin
127.0.0.1:6379> GEOADD locations 117.23689,31.825596
127.0.0.1:6379> GEOPOS locations beijin
127.0.0.1:6379> GEODIST locations hefei beijin km // 计算距离
127.0.0.1:6379> GEORADIUSBYMEMBER locations beijin 150 km // 通过距离计算周边城市
注意:没有删除命令 它的本质是 zset (type locations)
所以可以使用 zrem key member 删除元素
zrange key 0 -1 表示所有 返回指定集合中所有value
0x03:hyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
127.0.0.1:6379> PFADD 2017_03_06:count 'yes' 'yes' 'yes' 'yes' 'no'
127.0.0.1:6379> PFCOUNT 2017_03_06:count # 统计有多少不同的值
127.0.0.1:6379> PFADD 2017_09_08:count uuid9 uuid10 uu11
127.0.0.1:6379> PFMERGE 2016_03_06:count 2017_09_08:count # 合并
注意:本质还是字符串 ,有容错率,官方数据是0.81%
0x04:bitmaps
Bitmap 本质是 string,是一串连续的 2 进制数字( 0 或 1 ),每一位所在的位置为偏移(offset)。string(Bitmap)最大长度是 512 MB,所以它们可以表示 2 ^ 32 = 4294967296 个不同的位。
127.0.0.1:6379> set test abc
OK
127.0.0.1:6379> get test
"abc" # 1100001 1100010 1100011
127.0.0.1:6379> setbit test 6 1
(integer) 0
127.0.0.1:6379> setbit test 7 0
(integer) 1
127.0.0.1:6379> get test
"bbc"
127.0.0.1:6379> setbit test 1000 0 # 扩容至 1000 位,后面的用 0 填充
(integer) 0
127.0.0.1:6379> getbit test 1000 # 获取第 1000 位
(integer) 0
127.0.0.1:6379> bitcount test # 统计 1
(integer) 10
应用场景:
点赞功能:用户 ID 必须是数值类型
点赞
setbit 朋友圈ID 用户ID 1
取消点赞
setbit 朋友圈ID 用户ID 0
统计点赞数
bitcount 朋友圈ID
查看是否点赞
getbit 朋友圈ID 用户ID
喜欢,在看