redis的一些小功能

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/m0_37719047/article/details/102556561

慢查询分析

redis执行一条命令分为如下四个部分:发送部分,排队,执行命令,返回结果
慢查询只统计执行命令的时间,所以没有慢查询不代表客户端没有超时问题

如何设置阈值

redis设置了slowlog-log-slower-than 和slowlog-max-len配置来解决这两个问题
slowlog-log-slower-than 表示执行时间超过这个时间的命令会被记录在日志中
slowlog-max-len说明慢查询日志最多存储多少条,
在redis中有两种修改配置的方法,一种是修改配置文件,另一种是使用config set命令动态修改,
在这里插入图片描述
虽然慢查询日志是存储在内存列表中的,但是redis并没有暴露这个列表的键,而是通过一组命令实现对慢查询日志的访问和管理
slowlog get
slowlog length
slowlog reset

Pipeline

pipeline 概念

redis客户端执行一条命令分为如下
redis提供了批量操作命令,有效的节约了RTT,但是大部分命令是不支持批量操作的,多次操作会使得网络成为性能的瓶颈
pipeline能够将一组redis命令进行组装,通过一次rtt传输给redis,再将这组redis命令的执行结果按顺序返回给客户端,
在这里插入图片描述
redis命令的真正执行的时间通常是在微秒级别,所以才会有redis性能瓶颈是网络这样的说法

性能测试

pipeline执行速度一般比逐条执行要快
客户端和服务端网络延时越大,pipeline的效果越明显

原生批量和pipeline的对比

原生批量命令是原子的,pipeline命令是非原子的
原生批量命令是一个命令对应多个key,pipeline支持多个命令
原生批量命令是redis服务端支持实现的,而pipeline需要服务端和客户端共同实现

事务与Lua

为了保证多条命令组合的原子性,redis提供了简单的事务功能以及集成Lua脚本来解决这个问题,本节首先介绍redis中事务的使用方法以及他的局限性,之后重点介绍Lua语言的基本使用方法,以及如何将redis和Lua脚本进行集成,redis管理Lua脚本的相关命令。

redis提供了简单的事务功能,将一组需要将一起执行的命令放在multi和exec两个命令之间,multi命令代表事务开始,exe代表事务结束,他们之间的命令是原子执行的

redis并不支持回滚功能
有些应用场景需要在事务之前执行,确保事务中的key没有被其他客户端修改,才执行事务,否则不执行,redis提供了watch命令来解决这类问题
redis提供了简单的事务,之所以说它简单,主要是它提供了不支持事务中的回滚特性,同时无法计算命令之间的逻辑关系,当然也体现了redis的keep it simople的特性

Redis与Lua

在redis中执行Lua脚本有两种方法,eval和evalsha
(1) eval 脚本内容 key个数 key列表 参数列表
在这里插入图片描述在这里插入图片描述(2) evalsha
除了使用eval,redis还提供了evalsha命令来执行Lua脚本,首先要把Lua脚本加载到redis服务端,得到该脚本的额sha1校验和,evalsha命令使用sha1作为参数直接执行对应的Lua脚本,避免每次发送Lua脚本的开销,这样客户端就不需要每次执行脚本内容,而脚本也会常驻在服务端,脚本功能得到了复用。
在这里插入图片描述
Lua可以使用redis.call函数实现对redis的访问
例如下面的代码使用redis.call调用了redis的set和get操作
redis.cal(‘get’,‘hello’)
放在redis的执行效果如下
eval ‘return redis.call(‘get’,KEYS[1])’ 1 hello “word”

Lua脚本功能为redis开发和运维人员带来了如下三个好处
Lua脚本在redis中时原子执行的,执行过程中不会插入其他命令
Lua脚本可以帮助开发和运维人员创造出自己定制的命令,并且可以将这些命令常驻在redis内存中,实现复用的效果
Lua可以将多条命令一次性打包,有效的减少网络开销

BitMaps

现代计算机使用二进制作为信息的基础单位,一个字节等于8位,redis提供了bitmap这个数据结构实现对位的操作,把数据结构加上引号主要因为:
bitmaps不是一种数据结构,实际上他就是字符串,但是他可以对字符串的位进行操作

命令

设置值
setbit key offset value
获取值
gitbit key offset
获取bitmaps指定范围值为1的个数
bitcount [start] [end]
bitMaps间的位运算
bitop op destkey key [key]
bitop是一个复合操作,他可以做多个bitmaps的交集,并集,非异或操作并且将结果保存在destkey中

HyperLogLog

HyperLogLog并不是一种新的数据结构,而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP,Email,ID等

命令

pfadd key element [element]
pfcount key [key …]
pfcount用于计算一个或者多个HyperLogLog的独立总数
pfmerge destkey sourcekey [sourcekey …]
pfmerge可以求出多个hyperloglog
HyperLogLog内存占用率非常小,但是存在错误率,开发者在进行数据结构选型的时候只需要确定如下两条即可:
只是为了计算独立总数,不需要获取单条数据
可以容忍一定的误差率,毕竟hyperLogLog在内存的占用率上具有很大的优势

发布订阅

redis提供了基于发布订阅模式的消息机制,在这种情况下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道发布消息,订阅该频道的每个客户端都可以收到该消息,redis提供了若干个命令支持该功能
在这里插入图片描述

命令

发布消息
publish channel message
订阅消息
subscribe channel [channel …]
有关订阅命令有两点需要注意:
客户端在执行订阅命令后进入订阅状态,只能够接受subcribe,psubscribe,unsubcribe,punsubscribe的四个命令
新开启的订阅客户端,无法接收到该频道之前的消息,因为redis不会对发布的消息进行持久化
取消订阅
ubsubcribe channel [channel …]
按照模式订阅和取消订阅
psubsribe pattern [pattern …]
pubsubsribe pattern [pattern …]

聊天室,公告牌,服务之间利用消息解耦都可以使用发布订阅模式
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37719047/article/details/102556561
今日推荐