首页 > 数据库 >redis高级用法:慢查询、pipline与事务、发布订阅、bitmap位图、HyperLogLog、GEO地理位置

redis高级用法:慢查询、pipline与事务、发布订阅、bitmap位图、HyperLogLog、GEO地理位置

时间:2023-08-29 12:33:32浏览次数:39  
标签:订阅 pipeline HyperLogLog redis slowlog 事务 查询 位图

目录

一 高级用法之慢查询

1.1 生命周期

配置一个时间,如果查询时间超过了我们设置的时间,我们就认为这是一个慢查询
配置的慢查询,只在命令执行阶段
客户端超时不一定慢查询,但慢查询是客户端超时的一个可能因素

1.2 两个配置

1.2.1 slowlog-max-len

  • 慢查询是一个先进先出的队列
  • 固定长度
  • 保存在内存中

1.2.2 slowlog-max-len

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

  • slowlog-log-slower-than=0,记录所有命令
  • slowlog-log-slower-than <0,不记录任何命令

1.3 设置慢查询

# 慢查询演示
	-设置慢查询--->只要超过某个时间的命令--->都会保存起来
    # 设置记录所有命令
    CONFIG SET slowlog-log-slower-than 0
    # 最多记录100条
    config set slowlog-max-len 100
    # 持久化到本地配置文件
    config rewrite
    
# 就会记录所有命令了


## 1.4 查看慢查询队列
```python
slowlog get [n]
slowlog len #获取慢查询队列长度
slowlog reset #清空慢查询队列

1.5 作用

# 有什么用,如何聊?
	-公司好多项目用这一个redis实例
    -最近公司发现,redis响应非常慢
    -通过排查它的 慢查询-->排查出一些慢命令
    -找到对应的执行项目--->位置
   	-避免再执行这些命令了

二 pipline与事务

2.1 什么是pipeline(管道)

Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现

将一批命令,批量打包,在redis服务端批量计算(执行),然后把结果批量返回

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

pipeline期间将“独占”链接,此期间将不能进行非“管道”类型的其他操作,直到pipeline关闭;如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为pipeline操作新建Client链接,让pipeline和其他正常操作分离在2个client中。不过pipeline事实上所能容忍的操作个数,和socket-output缓冲区大小/返回结果的数据尺寸都有很大的关系;同时也意味着每个redis-server同时所能支撑的pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力

2.2 python客户端实现pipline

import redis
pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)
#创建pipeline
pipe = r.pipeline(transaction=True)
#开启事务
pipe.multi()
pipe.set('name', 'lqz')
#其他代码,可能出异常

pipe.set('role', 'nb')
pipe.execute()  # 事务的执行

2.3 与原生操作对比

通过pipeline提交的多次命令,在服务端执行的时候,可能会被拆成多次执行,而mget等操作,是一次性执行的,所以,pipeline执行的命令并非原子性的

2.4 使用建议

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

2 pipeline每次只能作用在一个Redis的节点上

3 M(mset,mget….)操作和pipeline的区别

2.5 原生redis操作操作事务

# 1 mutil  开启事务,放到管道中一次性执行
multi   # 开启事务
set name lqz
set age 18
exec


# 2 模拟事务  mutil +watch 模拟事务   乐观锁
# 在开启事务之前,先watch
watch age
multi
decr age
exec

# 另一台机器
multi
decr age
exec  # 先执行,上面的执行就会失败(乐观锁,被wathc的事务不会执行成功)


# django+mysql实现乐观锁
# 使用python+redis实现乐观锁
https://www.cnblogs.com/liuqingzheng/p/9997092.html

三 发布订阅

3.1 角色

# 发布者发布了消息,所有的订阅者都可以收到,就是生产者消费者模型(后订阅了,无法获取历史消息)
# 设计模式的:观察者模式

3.2 模型

3.3 使用

# 发布消息,向lqz频道发送了hellowrold-->不会有人收到--->没有人订阅
publish lqz "hello world"

# 订阅消息客户端1
subscribe lqz
# 订阅消息客户端2
subscribe lqz


# 发布订阅和消息队列的区别
发布订阅,订阅者都能收到,
消息队列有个抢的过程,只有一个抢到

四 bitmap位图

4.1 位图是什么

位图是一种特殊的散列表。
申请一个大小为1亿、布尔类型(true或者false)的数组。将这1千万个整数作为数组下标,将对应的数组值设置成true。比如,整数5对应下标为5的数组值设置为true,也就是array[5]=true。
查询某个整数K是否在这1千万个整数中的时候,只需将array[K]取出来,看是否等于true。如果等于true,那说明1千万整数中包含这个整数K;相反,就表示不包含这个整数K。
不过,很多语言中提供的布尔类型,大小是1个字节的,并不能节省太多内存空间。实际上,表示true和false,只需要一个二进制位(bit)就可以了。
```python

下面是字符串big对应的二进制(b是98)
![](/i/l/?n=23&i=blog/3095768/202308/3095768-20230829122025573-1032170354.png)


## 4.2 相关命令
```python
# 操作 比特位
set hello big  #放入key为hello 值为big的字符串
getbit hello 0 #取位图的第0个位置,返回0
getbit hello 1 #取位图的第1个位置,返回1 如上图


# 设置比特位
etbit hello 7 1 #把hello的第7个位置设为1 这样,big就变成了cig


# 获取指定字节范围内,有几个1
bitcount key 0 3   # 数字指的是字节

4.3 独立用户统计

-假设有1亿用户,假设5千万活跃--->统计日活
	-使用集合:大约需要200m
    -使用bitmap位图:大约需要12m内存
-如果活跃用户量少,不适合用bitmap
数据类型 每个userid占用空间 需要存储用户量 全部内存量
set 32位(假设userid是整形,占32位) 5千万 32位*5千万=200MB
bitmap 1位 1亿 1位*1亿=12.5MB
# 面试题:
redis的key值最大多少 512M
redis的string 类型vaule值最大多少  512M

五 HyperLogLog

5.1 介绍

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

本质还是字符串

5.2 三个命令

# 基于HyperLogLog算法:极小的空间完成独立数量统计,去重

# 布隆过滤器

# 具体操作
pfadd uuids "uuid1" "uuid2" "uuid3" "uuid4"   # 增加值
pfcount uuids  # 统计个数

# 数据不能删除单个

# 跟集合很像,但是占的内存空间很小
    百万级别独立用户统计,百万条数据只占15k
    错误率 0.81%
    无法取出单条数据,只能统计个数
# 作用:
	-爬虫去重
    -黑白名单
    -垃圾邮件过滤
    -独立用户统计
    	-有个用户登录,就把用户id放到HyperLogLog中
        -最后只需要统计一下 个数  就能统计出今天的活跃人数
   

六 GEO地理位置信息

6.1 介绍

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

# 类似于
	-附近的人,餐馆,医院
    -附近5km内的 xx
    -我距离某个好友的距离
    
    
# 经纬度哪里来?
	-前端(app,web),都是可以申请,获得经纬度的-->是前端做
    -前端拿到--->调用我们的一个接口--->把经纬度传入--->存起来-->redis的geo中
    -我要统计我附近5公里以内的好友
    	-需要我的经纬度
        -我所有好友的经纬度,已经在 redis的geo中存好了

6.2 案例

geoadd cities:locations 116.28 39.55 beijing 
geoadd cities:locations 117.12 39.08 tianjin
geoadd cities:locations 114.29 38.02 shijiazhuang
geoadd cities:locations 118.01 39.38 tangshan
geoadd cities:locations 115.29 38.51 baoding


# 计算两个地理位置的距离
geodist cities:locations beijing tianjin km


# 计算北京方圆 150km内的城市
georadiusbymember cities:locations beijing 90 km


# geo本质时zset类型

标签:订阅,pipeline,HyperLogLog,redis,slowlog,事务,查询,位图
From: https://www.cnblogs.com/zjyao/p/17664437.html

相关文章

  • redis数据类型和使用命令
    目录一通用命令1.1通用命令1.2数据结构和内部编码1.3单线程架构,二字符串类型2.1字符串键值结构2.2常用命令三hash类型3.1哈希值结构3.2常用命令3.3hashvsstring四列表类型4.1列表特点常用命令五集合类型5.1特点5.2常用命令六有序集合类型6.1特点6.2常用命令......
  • Redis介绍跟安装配置
    目录一redis介绍1.1redis是什么1.2redis的特点二centos上安装redis三redis启动方式3.1最简启动3.2动态参数启动(了解)3.3配置文件启动一redis介绍1.1redis是什么开源:早起版本2w3千行基于键值对的存储系统:字典形式多种数据结构:字符串,hash,列表,集合,有序集合高性能,功......
  • redis客户端操作
    目录一redis客户端操作二redis使用场景一redis客户端操作#客户端链接 redis-cli-h地址-p端口#非交互式的 res=subprocess.getoutput('systemctlstartmysqld')res=subprocess.getoutput('systemctlstopmysqld')res=subprocess.getoutput('redis-clige......
  • redis分布式锁,setnx+lua脚本的java实现 | 京东物流技术团队
    1前言在现在工作中,为保障服务的高可用,应对单点故障、负载量过大等单机部署带来的问题,生产环境常用多机部署。为解决多机房部署导致的数据不一致问题,我们常会选择用分布式锁。目前其他比较常见的实现方案我列举在下面:基于缓存实现分布式锁(本文主要使用redis实现)基于数据库实现分布......
  • Redis常用命令
    目录起因配置bind端口连接开启连接关闭连接命令key相关字符串相关hash相关List相关Set相关SortedSet相关GEO相关服务器命令引用起因从标题来看,似乎这篇博文没有看下去的必要了,谁用redis还敲命令行,不都是GUI嘛。确实,GUI现在特别的好用,直观、高效还美观。但是,在生产环境下GUI可......
  • Redis基础
    1.Redis5种数据类型string(字符串)hash(哈希散列)list(列表)set(集合)zset(sortedset:有序集合)2.对应的基本操作2.1Stringvalue:最大为512Msetnamezhangsangetname2.2hash最多属性字段为2的32次方-1个hmsetuserid:1namezhangsanage1hmgetalluserid:1hmgetu......
  • 基于Redis的队列
    1.队列//发布@ApiOperation(value="put普通队列")@PostMapping("/queuePut")publicObjectput(@RequestBodyCommonMapRespDTOrespDTO){for(inti=0;i<20;i++){//队列RQueue<Object>queue=redissonClient.g......
  • Redis 入门篇
    1.初始Redis1.1认识NoSQL‍NoSql可以翻译做NotOnlySql(不仅仅是SQL),或者是NoSql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库​,因此也称之为非关系型数据库。‍1.1.1结构化与非结构化‍​​1.1.2关系型与非关系型的差异存储方式......
  • redis 消息队列方案
    List实现消息队列使用LPUSH、RPOP左进右出或RPUSH、LPOP右进左出,实现消息顺序消费使用BLPOP、BRPOP这种阻塞式读取的命令,实现消息及时消费ack机制使用,使用index读取list的消息,正常消费完成后再使用POP删除//使用redission实现@Slf4j@ServicepublicclassQue......
  • Redis 缓存满了怎么办?
    Redis缓存使用内存来保存数据,随着需要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。此时,应该怎么办?本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。值得注意的是,在Redis中 过期策略和内存淘汰策略是两个完全不同的概念。Redis过期策略指的是Redis使用......