Redis 数据结构扩展

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

喜欢,在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值