美文网首页
瑞士军刀Redis

瑞士军刀Redis

作者: 薛之谦chj | 来源:发表于2020-04-23 16:34 被阅读0次

瑞士军刀Redis

一 功能介绍:慢查询    pipeline    发布订阅     bitmap   HyperLogLog GEO

慢查询: 

生命周期两点说明:

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

(2)客户端超市不一定是慢查询, 但慢查询是客户端超市的一种可能因素

两个配置: 

slowlog-max-len

1.先进先出队列

2.固定长度

3.保存在内存中

slowlog-log-slower-than

1.慢查询阈值(单位:微秒)

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

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

配置方法

1.默认值

config get slowlog-max-len = 128   设置 默认长度

config get slowlog-log-slower-than  设置阈值10000微秒=10毫秒

2.修改配置文件启动

3.动态配置

config get slowlog-max-len 1000      支持动态配置

config get slowlog-log-slower-than  1000 支持动态配置

慢查询命令

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

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

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

慢查询运维经验

1.slow-log-max-len 不要设置过大 默认10ms 通常设置为1ms

2.slow-log-slower-than 不要设置过小  通常设置为 1000左右

3.理解命令生命周期

4.定期持久化慢查询


pipeline :流水线

1.什么是pipeline?

一次时间=一次网络时间+一次命令时间

命令时间 很小 因为redis很快  网络事件很慢 因为网络可能是内网可能是外网 跨机房 跨地区,

所以有了pipeline 来操作

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

两点注意:

1.Redis的命令时间是微妙级别

2.Redis的每次挑输要控制(网络)。

命令传输时间例子:

光速=3*10的8次方米/秒 = 3000公里/秒

距离=1300公里

光纤传输速度 约等于 光速的2/3

一次传输时间= (1300*2)/(30000*2/3)=13毫秒

2.pipline-Jedis实现?

首先引入maven依赖 然后操作

3.使用建议

1.注意每次pipeline携带数据量

2.pipeline 每次只能作用在一个Redis节点上 (不能作用于集群上,不能作用与多个节点上)

3.M(原生操作)操作与pipeline区别


发布订阅功能: 角色  模型  API 发布订阅与消息队列 

发布订阅功能 :没有消息堆积的功能 ,就是没有获取历史的消息

角色: 发布者(publisher)  订阅者(subscriber)  频道(channel)

API: publish(发布命令)   subcribe(订阅) unsbcribe(取消订阅)

public channel(频道) message

subscribe [channel] : 一个或多个

unsubscribe [channel] : 一个或多个

其他API (非常用) psubcribe  punsubcribe   punsub-channel     pubsub-numsub

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

punsubscribe [pattern...] :推定指定的模式

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

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

发布订阅总结:

消息队列: 发布者发布消息 只有一个消息订阅者可以收到 是一种抢的模式(Redis没有实现消息队列)

1.发布订阅模式中的角色

2.重要的API


bitmap(位图)

相关API: setbit  getbit  bitcount  bittop bitpos

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

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

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

位置为1的个数。

bittop op destkey key [key ...] :做多个Bitmap的and(交集) or(并集) not(非) xor(异或)

操作并将结果保存在destkey中。

bitpos key targetbit [start end ] :计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)

第一个偏移量对应的值等于targetBit的位置

独立用户统计

1.使用set和Bitmap存储

2. 一亿用户,五千万独立对应需要的全部存储量

set: 全部存储量 = 32位*50000000 约等于 200MB

bitmap:  全部存储量 = 1位 * 100000000 = 12.5MB

如果只有10独立用户呢?

set: 全部存储量 = 32位*100000 约等于4MB

bitmap:  全部存储量 = 1位 * 100000000 约等于 12.5MB

所以总结来说 如果数据量大用bitmap 小的话 用其他的 。

bitmap(位图)使用经验

1.type = string 最大512MB  如果超过512 就可以将bitmap拆分成多个key

2.注意setbit时的偏移量可能有较大耗时  因为redis是单线程

3.bitmap(位图)不是绝对的好用 分场景的!


HyperLogLog

新的数据结构?

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

2.本质还是字符串(string)

三个命令

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

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

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

内存消耗(百万独立用户)

内存消耗:一天:15kb 一个月:450kb 一年:15*365约等于 5MB

所以来说相对于Bitmap来说 内存消耗更小

使用经验

1.是否能容忍错误?(错误率:0.81%)

2.是否需要单挑数据?

3.是否想要很少的内存来解决问题?


GEO(地理信息定位)

GEO是什么?

存储经纬度,计算两地距离,范围计算等

应用场景:可以做微信摇一摇  按照距离来算 周围的酒店,餐馆等

相关API:  geoadd  geopos geodist   georadius   georadiusbymember

geo key longitude latitude member(标识)  [longitude latitude member ...] :增加地理位置信息

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

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

georadius key longitude latitude radiusm ....(以下多个参数) :获取指定经纬度范围内的地理信息集合

georadiusbymember key member  radiusm ....(以下多个参数) :获取指定位置(member)范围内的地理位置信息集合

有以下参数:

withcoord:返回结果中包含经纬度

withdist :返回结果中包含距离中心节点位置

withhash:返回结果中包含geohash

COOUNT count :指定返回结果的数量

asc|desc: 返回结果按照距离中心节点的距离做升序或者降序

store key: 将返回结果的地理位置信息保存在指定键

storedist key: 将返回结果距离中心节点的距离保存到指定键

相关说明

1. 是redis3.2+版本后提供的功能

2.type geokey = zset  zeo是使用zset来实现的

3. zeo 没有删除的API  可以使用 zrem key member 来删除

相关文章

网友评论

      本文标题:瑞士军刀Redis

      本文链接:https://www.haomeiwen.com/subject/ptooihtx.html