读书笔记之《Redis开发与运维》—— 二
由于内容过多,分一个系列来写,这是第二篇。
三、小功能大用处
1、慢查询分析
慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息记录下来。注意是命令执行前后,redis客户端执行一条命令分为四步:发送命令、命令排队、命令执行、返回结果。所以没有慢查询不代表客户端没有超时问题。
redis提供了slowlog-log-slower-than和slowlog-max-len配置。slowlog-log-slower-than用于设置阀值,单位微秒,默认10毫秒,也就是超过10毫秒,判定为慢查询。slowlog-max-len表示慢查询最多存储多少条,redis使用了一个列表来存储慢查询日志。当超过最大数量时,对头的第一条数据出列。
2、Redis Shell
redis-cli、redis-server、redis-benchmark(可以为redis做基准性能测试)等shell工具。
3、Pipeline
redis提供了批量操作命令,但是大部分命令不支持批量操作。Pipeline机制能够将一组redis命令进行组装,通过一次往返时间传输给redis,再将这组redis命令的执行结果按照顺序返回给客户端。注意:每次Pipeline组装的命令个数不要过大,否则会加大客户端的等待时间,也会造成一定的网络阻塞,可以将包含大量命令的Pipline拆分成多次较小的Pipline来完成。
4、事务与Lua
redis提供了简单的事务功能以及集成Lua脚本来保证多条命令组合的原子性。将一组需要一起执行的命令放到multi和exec两个命令之间,multi代表事务开始,exec代表事务结束,他们之间的命令原子顺序执行。如果要停止事务的执行,可以使用discard代替exec。
如果事务中的命令出现错误,如果是语法错误,会造成整个事务无法执行,如果是运行时错误,可能一部分运行成功,一部分失败。redis不支持回滚功能。如果在事务之前,需要确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行,可以使用watch命令。
redis中执行Lua脚本有两种方式:eval和evalsha。如果Lua脚本较长,可以使用redis-cli --eval执行脚本文件。--eval本质和eval一样,客户端如果想要执行Lua脚本,首先在客户端编写好Lua脚本代码,然后把脚本作为字符串发送给服务端。使用evalsha时,首先将Lua脚本加载到Redis服务端,得到脚本的SHA1校验和,evalsha使用SHA1作为参数可以直接执行对应的Lua脚本,避免每次发送Lua脚本的开销。这样脚本常驻服务端,脚本功能得到了复用。
script load命令将脚本内容加载到Redis内存中。
Lua可以使用redis.call、redis.pcall函数实现对redis的访问。注意:如果redis.call执行失败,脚本执行结束会直接返回错误,而redis.pcall会忽略错误继续执行脚本。
Lua脚本功能带来的好处:
Lua脚本在Redis中是原子执行的,执行过程中不会插入其他命令。
Lua脚本可以帮助开发人员创造出自己定制的命令,并可以将这些命令常驻Redis内存中,实现复用的效果。
Lua脚本可以一次性打包多条命令,有效减少网络开销。
script flush:清除redis内存已经加载的所有Lua脚本; script kill:杀掉正在执行的Lua脚本,如果当前Lua脚本正在执行写操作,那么script kill将
不会生效。
5、Bitmaps
Bitmaps实际上是字符串,可以对字符串的位进行操作,可以把Bitmaps看成是一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。
6、HyperLogLog
HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,比如统计ID、IP等。HyperLogLog占用内存非常小,但是需要注意存在错误率,有一定的误差。
7、发布订阅
和专业的消息队列系统比,redis的发布订阅略显粗糙,这里省略。
8、GEO
redis实现了GEO功能,用于实现基于地理位置信息的应用,底层实现是zset。
五、客户端
客户端与服务端之间的通信协议是在TCP协议之上构建的,Redis定制了RESP(Redis序列化协议)实现客户端和服务端的交互。
1、Jedis
直接和使用连接池两种。使用JedisPool不需要每次连接都生成Jedis对象,降低开销。 Jedis的Pipeline用法和Lua脚本用法。
2、客户端API
client list:列出与Redis服务端相连的所有客户端连接信息。
info clients:列出与redis服务端相连的客户端总数,最大缓冲区等。
输入缓冲区:Redis为每个客户端分配了输入缓冲区,将客户端发送的命令临时保存,同时Redis会从输入缓冲区拉取命令并执行。输入缓冲区会根据输入内容大小的不同动态调整,每个客户端缓冲区的大小不能超过1G,超过后客户端将被关闭。
输出缓冲区:Redis为每个客户端分配了输出缓冲区,保存命令执行的结果返回给客户端,为redis和客户端交互返回结果提供缓冲。
输入缓冲区和输出缓冲区不会受到maxmemory限制。
monitor命令用于监控Redis正在执行的命令,注意:一旦redis的并发量较大,那么monitor客户端的输出缓冲会暴涨,可能瞬间占用大量内存。禁止生产环境使用monitor。
原文地址:https://www.cnblogs.com/yaofengdoit/p/12993698.html
- 【专知-Java Deeplearning4j深度学习教程06】用卷积神经网络CNN进行图像分类
- 万恶的剪贴板==》为存储而生
- AdaBoost算法(R语言)
- CTF---Web入门第六题 因缺思汀的绕过
- 小案例(六):预测小偷行为(python)
- 小案例(五):销量预测(python)
- SQL:插入指定标识列的数据时候的小错误
- 逻辑回归与梯度下降详解
- 决策树(R语言)
- ExecuteReader在执行有输出参数的存储过程时拿不到输出参数
- CTF---Web入门第十三题 拐弯抹角
- 小案例(四):销售额下滑(python)
- 【最新TensorFlow1.4.0教程01】TF1.4.0介绍与动态图机制 Eager Execution使用
- 把插入的数据自动备份到另一个表中 ~ 语境:本地和服务器自动同步
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vue 3 入门基础知识
- 在Linux系统中使用Vim读写远程文件的命令详解
- Vue.js实现咸鱼底部Tab凸起|vue自定义导航条组件
- 在Linux中查看所有正在运行的进程的方法
- Apache跨域资源访问报错问题解决方案
- Windows Telemetry服务特权提升
- 滥用DComposition在外部窗口上渲染
- 通过LUMP_PAKFILE的源引擎内存损坏
- MongoDB Change Stream之一——上手及初体验
- MongoDB 慢日志字段解析
- leetcode哈希表之第一个只出现一次的字符
- 转录组RNA-Seq使用docker+bioconda搭建分析环境
- 企业自建GitLab代码仓库安装与基础配置使用
- 全网最全的数据库操作命令,一口气从头看到尾,蛮有收获的!
- 【C++】 使用sort函数进行容器排序