Redis-不常用类型

105 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

慢查询

说明:

1、慢查询发生在执行命令阶段

2、客户端超时不一定慢查询,但慢查询是客户端超时的一个可能因素

两个配置

可以动态设置

1、slowlog-max-len:默认值128

先进先出队列

固定长度

保存在内存内

2、slowlog-log-slower-than:默认值10000(10微秒)

慢查询阈值(单位:微秒 = 1毫秒/1000)

slowlog-log-slower-than=0,记录所有命令

slowlog-log-slower-than<0,不记录任何命令

命令

1、slowlog get [n]:获取慢查询队列

2、slowlog len:获取慢查询队列长度

3、slowlog reset:清空慢查询队列

经验

1、slowlog-max-len不要设置过小,默认128,通常设置1000左右

2、slowlog-log-slower-than不要设置过大,默认10ms,通常设置1ms

3、定期持久化慢查询,如存mysql

pipeline(流水线)

1次pipeline(n条命令) = 1次网络时间+n次命令时间

redis命令是微秒级别,pipeline减少网络多次请求

原生M操作是原子性的,pipeline不是原子性的,redis提供简单事物,不支持回滚,如果执行事务中,监控的key改变会导致提交事物失败

避免每次pipeline携带命令数量

pipeline每次只能作用在一个节点,所以集群不支持pipeline,但是可以自定义实现

发布订阅

类似生产者消费者模式

订阅者都收到消息

消息队列消息需要抢

角色:发布者,订阅者,频道

API

1、publish channel message:将消息message发布到频道channel,返回订阅人数

2、subcribe [channel]:订阅一个或多个频道

3、unsubcribe [channel]:取消订阅一个或多个频道

4、psubscribe [pattern...]:订阅模式

5、punsubscribe [pattern...]:退订指定模式

6、pubsub channels:列出至少有一个订阅者的频道

7、pubsub numsub [channel...]:列出给定频道的订阅者数量

8、pubsub numpat:列出被订阅模式的数量

位图Bitmap

1、基于最小的单位bit进行存储,所以非常省空间。

2、设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的

3、二进制数据的存储,进行相关计算的时候非常快

4、方便扩容

5、type = string,最大512MB

使用场景

1、用户签到

原理:以用户ID为KEY,以当前时间距离开始时间的时间差为偏移量,若用户签到一次,则将位置为 1。最后 bitcountKEY,获取用户一共签到的次数。

2、用户在线状态

方案:使用bitmap存储用户在线状态。使用一个KEY,若用户在线,则以用户ID位偏移量,将位设为 1;若不在线,则设置为 0

3、统计活跃用户

方案:若某用户上线,则以日期为KEY,以用户user_id为偏移量(若ID不为整数,则将ID hash化为唯一ID),设置位为 1

4 、各种状态值

API

1、setbit key offset value:给位图指定索引设置值

2、getbit key offset:获取位图指定索引的值

3、bitcount key [start end]:获取位图指定范围(start到end,单位为字节,如果不指定就是获取全部)位值为1的个数

4、bitop op destkey key[key...]:多个bitmap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destkey中

5、bitpos key targetBit [start end]:计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于targetBit的位置

注意:注意setbit时的偏移量,可能有较大耗时;位图在数据量大的时候使用合理

HyperLogLog

1、基于HyperLogLog算法:极小空间完成独立数量统计

2、本质是字符串

API

1、pfadd key element [element...]:向hyperloglog添加元素

2、pfcount key [key....]:计算hyperloglog的独立总数

3、pfmerge destkey sourcekey [sourcekey...]:合并多个hyperloglog

注意

1、有错误率:0.81%

2、无法取出单条数据

GEO

地理信息定位:存储经纬度,计算两地距离,范围计算。。。

3.2版本以后提供的

类型是有序集合

没有删除API:可以使用zrem key member

API

1、geoadd key longitude latitude member [longitude latitude member...]:增加地理位置信息

2、geopos key member [member]:获取地理位置信息

3、geodist key member1 member2 [unit]:获取两地地理位置距离,unit:m(米)、km(千米)、mi(英里)、ft(尺)

4、georadius key longitude latitude radius m|km|gt|mi [WITHCOORD][WITHDIST] [WITHHASH][ASC|DESC] [COUNT count] :以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的而所有位置元素。

选项:

  • WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。
  • WITHCOORD:将位置元素的经度和纬度也一并返回。
  • WITHHASH:以52位有符号整数的形式,返回位置元素经过原始geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
  • ASC:根据中心的位置,按照从近到远的方式返回位置元素
  • DESC:根据中心的位置,按照从远到近的方式返回位置元素