评论

收藏

[NoSQL] Redis 数据结构扩展

数据库 数据库 发布于:2021-07-05 11:06 | 阅读数:464 | 评论:0

DSC0000.jpeg

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 msjedis.close();
 0x02:GEO是 zset 数据类型的一个扩展
127.0.0.1:6379> GEOADD locations 116.419217 39.921133 beijin127.0.0.1:6379> GEOADD locations 117.23689,31.825596127.0.0.1:6379> GEOPOS locations beijin127.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:hyperLogLogRedis 在 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 uu11127.0.0.1:6379> PFMERGE 2016_03_06:count 2017_09_08:count # 合并
注意:本质还是字符串 ,有容错率,官方数据是0.81% 
 
0x04:bitmapsBitmap 本质是 string,是一串连续的 2 进制数字( 0 或 1 ),每一位所在的位置为偏移(offset)。string(Bitmap)最大长度是 512 MB,所以它们可以表示 2 ^ 32 = 4294967296 个不同的位。
127.0.0.1:6379> set test abcOK127.0.0.1:6379> get test"abc" # 1100001 1100010 1100011127.0.0.1:6379> setbit test 6 1(integer) 0127.0.0.1:6379> setbit test 7 0(integer) 1127.0.0.1:6379> get test"bbc"127.0.0.1:6379> setbit test 1000 0 # 扩容至 1000 位,后面的用 0 填充(integer) 0127.0.0.1:6379> getbit test 1000 # 获取第 1000 位(integer) 0127.0.0.1:6379> bitcount test # 统计 1(integer) 10
应用场景:

  •   点赞功能:用户 ID 必须是数值类型


  •   点赞


  •   setbit 朋友圈ID 用户ID 1


  •   取消点赞


  •   setbit 朋友圈ID 用户ID 0


  •   统计点赞数


  •   bitcount 朋友圈ID


  •   查看是否点赞


  •   getbit 朋友圈ID 用户

  
关注下面的标签,发现更多相似文章