(三)Redis的其他小功能

news2024/11/17 15:40:37

一 慢查询分析

所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息(例如:发生时间、耗时、命令的详细信息)记录下来。

1.1 生命周期

发送命令-> 命令排队 -> 执行命令 -> 返回结果
在这里插入图片描述

  • 慢查询一般发生在第三阶段
  • 客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能性因素

1.2 慢查询的两个配置参数

  • slowlog-max-len: 保存慢查询队列的最大长度,默认值128
  • slowlog-log-slower-than: 慢查询阀值(单位:微秒),表示执行时间大于多少时被记录为慢查询,设为0表示记录所有命令,小于0不记录任何命令,默认值10000(10毫秒)

修改配置的方式:

  1. 直接修改redis的配置文件
  2. 直接通过config set 动态修改
config set slowlog-max-len 256
config set slowlog-log-slower-than 1000 

1.3 慢查询命令

虽然慢查询日志是存放在 Redis 内存列表中的,但是 Redis 并没有暴露这个列表的键,而是通过一组命令来实现对慢查询日志的访问和管理。

  • slowlog get [n]: 获取慢查询队列
  • slowlog len: 获取慢查询队列当前长度
  • slowlog reset: 清空慢查询队列

慢查询日志结构
在这里插入图片描述

1.4 生产运维

  • slowlog-log-slower-than 不要设置过大,默认 10ms,通常设置 1ms
  • slowlog-max-len 不要设置过小,通常设置 1000 左右
  • 理解命令的生命周期,慢查询只记录命令执行时间,并不包括命令排队或网络传输时间
  • 定期持久化慢查询日志,由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令。

二 流水线(pipeline)

Redis 提供了批量操作命令(例如 mget、mset 等),有效地节约 RTT(Round Trip Time,往返时间)。但大部分命令是不支持批量操作的,例如要执行 n 次 hgetall 命令,并没有 mhgetall 命令存在,需要消耗 n 次 RTT。
Pipeline(流水线)机制能改善上面这类问题,它能将一组 Redis 命令进行组装,通过一次 RTT 传输给 Redis再将这组 Redis 命令的执行结果按顺序返回给客户端

2.1 流水线的使用

@Autowired
	private RedisTemplate redisTemplate;

	@GetMapping("/testRedisPipeline")
	@Inner(value = false)
	public R testRedisPipeline(){
		StopWatch stopWatch = StopWatch.create("test:for");
		String testKey = "test:for";
		stopWatch.start();
		for (int i = 0; i< 1000; i++) {
			redisTemplate.opsForHash().put(testKey,"filed"+i,"value"+i);
		}
		stopWatch.stop();
		log.info("for循环耗时:{}",stopWatch.getTotalTimeMillis());

		StopWatch pipelineStopWatch = StopWatch.create("test:pipeline");
		final String pipelineKey = "test:pipeline";
		pipelineStopWatch.start();
		redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
			connection.openPipeline();
			for (int i = 0; i< 1000; i++) {
				String key = "filed"+i;
				String value = "value"+i;
				connection.hSet(pipelineKey.getBytes(StandardCharsets.UTF_8),key.getBytes(StandardCharsets.UTF_8),value.getBytes(StandardCharsets.UTF_8));
			}
			return null;
		});
		pipelineStopWatch.stop();
		log.info("pipeline耗时:{}",pipelineStopWatch.getTotalTimeMillis());

		return R.ok();
	}

执行结果:

2022-12-08 15:00:05.333  INFO 21320 --- [  XNIO-1 task-1] c.c.c.a.controller.GenTestController     : for循环耗时:5884
2022-12-08 15:00:05.416  INFO 21320 --- [  XNIO-1 task-1] c.c.c.a.controller.GenTestController     : pipeline耗时:83

2.2 原生批量命令与 Pipeline 对比

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

三 redis的事务

3.1 什么是事务

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

3.2 事务的原理

当执行multi命令将会开启事务,那么所有命令就会加入事务队列暂存,不会真正的直接执行,如果遇到exec就会把队列中的命令依次执行-提交事务,需要注意的是即使有的命令执行失败了,也不会影响其他命令的执行结果-不回滚,但是如果遇到discard就会放弃执行队列中的命令-取消事务 , 如下:
在这里插入图片描述

3.3 事务操作

multi: 标记一个事务块的开始。

 multi		#开启事务
 
 set name zs	#添加字符串值
 set age  18	#添加数字值
 incr name		#name的值+1
 incr age		#age的值+1

exec: 执行所有事务块内的命令

exec		#提交事务,开启 multi 后的所有命令将被执行,如果有命令失败了也不会回滚成功的命令依然成功
		    #incr name命令会执行失败因为字符串是不能+1的,incr age命令会执行成功,age的值是数字能+1
get name	#返回zs
get age		#返回19

discard:取消事务,如果在开启multi后选择执行discard命令,将会 放弃执行事务块内的所有命令。

discard		#取消事务,开启multi后的所有命令将取消执行
get name	#会返回空值
get age		#会返回空值

四 位图(BitMaps)

Redis 提供了 Bitmaps 这个“数据结构”可以实现对位的操作。

数据结构模型:

  • 本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作
  • BitMaps 单独提供了一套命令,所以在 Redis 中使用 BitMaps 和使用字符串的方法不太相同。

API

  • setbit key offset value:给位图指定索引设置值,第 offset 位设置成 value,value 只能是 0 或 1
  • getbit key offset:获取某一位的值
  • bitcount key [start end]:获取位图指定范围(start 到 end,单位为字节,不指定表示获取所有)位值为1的个数
  • bitop op destkey key [key...]:做多个 Bitmap 的 and(交集),or(并集),not(非),xor(异或)操作,并将结果保存到 - destkey 中
  • bitops key targetBit [start] [end]:计算位图指定范围(start 到 end,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于 targetBit 的位置。

五 Hyperloglog

数据结构模型

  • 并不是一种新的数据结构,实际类型也是字符串类型,而是一种基数算法,通过 Hyperloglog 可以利用极小的内存空间完成独立总数的统计,数据集可以是 IP、Email、ID 等。

API

  • pfadd key element [element ...]:向 Hyperloglog 添加元素
  • pfcount key [key ...]:计算 Hyperloglog 的独立总数
  • pfmerge destkey sourcekey [sourcekey ...]:合并多个 Hyperloglog

使用经验

  • 是否能够容忍错误?Redis 官方给出的数字是 0.81% 的失误率
  • 是否需要单条语句?这里是无法取出单条语句
  • 使用场景可以是统计一些用户数,而且可以接受一个很小的误差

六 发布/订阅

6.1 什么是发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。没订阅的接收者当然是接收不到消息的,(pub/sub)是一种广播模式,及会把消息发送给所有的订阅者
在这里插入图片描述
消息接收者通过 SUBSCRIBE channel 命令订阅某个频道 , 消息发布者通过 PUBLISH channel message 向该频道发布消息,那么订阅了该频道的所有接收者就可以收到消息。

6.2 API

  • publish channel message:向 channel 频道发布 message 消息,返回结果是订阅者数
  • subscribe [channel]:可订阅一个或多个频道
  • unsubscribe [channel]:取消订阅
  • psubscribe [pattern...]:订阅模式
  • punsubscribe [pattern...]:退订指定的模式
  • pubsub channels:列出至少有一个订阅者的频道
  • pubsub numsub [channel...]:列出给定频道的订阅者数量
  • pubsub numpat:列出被订阅模式的数量

七 GEO(地理信息定位)

Redis 提供的 GEO 功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。

  • geoadd key lng lat member [lng lat member ...]:增加地理位置信息
  • geopos key member [member ...]:获取地理位置信息
  • geodist key member1 member2 [unit]:获取两个地理位置的距离,unit:m(米),km(千米),mi(英里),ft(尺)
  • georadius:获取地理位置信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 容超出三行之后显示下拉箭头 (可适配富文本)

问题提出&#xff1a;后台返回富文本&#xff0c;前端实现内容超出三行之后显示下拉箭头&#xff0c;展示全部&#xff0c;还可以收起 难点&#xff1a;富文本内容不稳定 会出现换行等 或者字体大小问题会印象 ps&#xff1a; 就算不是富文本只是正常的文章也是可以使用的呢 思…

嵌入式学习(3)ADC、DMA、通信方式

对寄存器的理解 寄存器&#xff0c;是连接软件跟硬件的桥梁&#xff0c;软件可对寄存器读写&#xff0c;而每个寄存器下面都连着一根导线&#xff0c;读写寄存器来改变状态&#xff0c;从而控制硬件 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC…

使用spire.pdf往某个位置处写文本信息

使用开发工具idea2022&#xff0c;java1.8版本&#xff0c;利用spire.pdf往一个现成的pdf中写入文本信息&#xff0c;经过一番研究&#xff0c;实现了&#xff0c;现在贴出代码分享&#xff1a; 首先导入Spire.Pdf.jar到maven汇总&#xff0c;因为我采用他的官网在pom中加依赖…

用DevExpress实现基于HTMLCSS的桌面应用程序的UI(三)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

Spring Boot超大文件上传,实现秒传

文件上传是一个老生常谈的话题了&#xff0c;在文件相对比较小的情况下&#xff0c;可以直接把文件转化为字节流上传到服务器&#xff0c;但在文件比较大的情况下&#xff0c;用普通的方式进行上传&#xff0c;这可不是一个好的办法&#xff0c;毕竟很少有人会忍受&#xff0c;…

VMware Fusion 13.0 SLIC 2.6 MOD

请访问原文链接&#xff1a;VMware Fusion 13.0 SLIC 2.6 MOD&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 使用 VMware Fusion 在虚拟机 (VM) 中运行 Windows、Linux、容器、Kubernetes 等而无需重新启动&#xff0c;充…

电信CDMA PDU短信号码字段编码转换的python实现

参考链接&#xff1a;CDMA(3GPP2)SMSPDU全解析-爱码网 CDMA SMS pdu解码_zx249388847的博客-CSDN博客_cdma smscdma pdu解析终极文档_月之海的博客-CSDN博客CDMA PDU 编解码补充解析_zx249388847的博客-CSDN博客 CDMA – lytsings Blog 一、PDU串解析 CDMA的pdu格式与GSM的相…

JavaMail 网易邮件发送demo-发送带附件的邮件

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 JavaMail 网易邮件发送demo-发送带附件的邮件 - joshua317的博客 使用Java应用程序发送 E-mail&#xff0c;需要在机子上安装 JavaMail API 和Java Activation Framework (JAF) 。 可以从 Java 网站下载最…

装饰器(Decorator)模式Recap

设计模式是一套积累并融合了大量经验与成熟思考的设计心法&#xff0c;每一个程序员在成长道路上都应该始终保持对最佳设计方案的不断追求。设计模式也会常用常新&#xff0c;值得反复研究和应用。本文简单Recap一下装饰器&#xff08;Decorator&#xff09;模式。 说句体外话…

【Paper】2020_离散多智能体系统的事件触发二分一致性研究_刘雨欣

文章目录第 4 章 有向符号图下离散多智能体系统的事件触发二分一致性4.3.1 示例一4.3.2 示例二系统 动态方程、控制输入及事件触发条件分别如式(2.1)、(3.1)及式(3.6)所示。 本文考虑一阶离散多智能体系统&#xff0c;第 iii 个智能体的动态方程如下: xi(k1)xi(k)ui(k)(2.1)\b…

千字长文!C++每日一练——Day3

&#x1f411;本文作者&#xff1a;C橙羊&#x1f411; &#x1f3ae;&#x1f50a;本文代码适合编译环境&#xff1a;DEV-C&#x1f4bb; ✨&#x1f9e8;温馨提示&#xff1a;此文乃作者心血&#xff0c;如要转载请标注版权&#xff0c;否则视为抄袭&#xff01;&#x1f389…

多线程——线程同步器CountDownLatch

多线程——线程同步器CountDownLatch&#xff08;一&#xff09;CountDownLatch案例入门【1】CountDownLatch和join的区别【2】CountDownLatch案例一&#xff1a;等待线程等待工作线程【3】CountDownLatch案例二&#xff1a;主线程main等待子线程【4】CountDownLatch案例三&…

.NET Conf China 2022 精彩回顾 | IOT专场

12月充满惊喜 各种美好的节日纷至沓来 奖励一年辛苦劳作的我们 本月程序员第一场节日 就是精彩的 .NET Conf China 2022 .NET Conf China 2022是面向开发人员的社区峰会&#xff0c;延续 .NET Conf 2022的活动&#xff0c;庆祝 .NET7的发布和回顾过去一年来 .NET在中国的发…

举个栗子~Alteryx 技巧(4):教你设置 Alteryx Server 用户权限

分析用户在用 Alteryx Designer 创建好工作流之后&#xff0c;如何在企业内部实现共享和管理分析工作流程、模型及数据呢&#xff1f;方法很简单&#xff1a;发布到 Alteryx Server &#xff01; Alteryx Server 通过内置的数据治理、集中管理的安全性和高可用性&#xff0c;可…

svn:E720005 move .svn/tmp拒绝访问

cleanup也clean不了 此时要用sqlite3.exe来解决了到有.svn的目录地下&#xff0c;把sqllite3.exe拷贝到这个下面 在目录里面打开cmd窗口&#xff0c;执行 sqlite3 .svn/wc.db "select * from work_queue" 如果查出内容&#xff0c;那么执行 sqlite3 .svn/wc.db …

【Dubbo3高级特性】「性能优化技术」Dubbo3完成扩展使用高效的Kryo和FST序列化开发实战

系列文章目录 如果你看到了这里&#xff0c;那么接下来你将会认识Dubbo3的诞生将如何引领微服务领域更进一步&#xff0c;从而迈入云原生的领域&#xff0c;这当然不仅仅是Dubbo3&#xff0c;之前也介绍了Java生态另外一个云原生领域的技术Quarkus等技术&#xff0c;而本文内容…

Spring Boot 实现微信点餐系统

架构 前后端分离&#xff1a; 部署架构&#xff1a; 补充&#xff1a; setting.xml 文件的作用&#xff1a;settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。 maven的作用…

校招求职经验分享——我是如何本科进入大厂的

写在开头 最近签完了三方&#xff0c;大学前三年的生涯规划和努力最终还是得到了兑现&#xff0c;脑子里不断涌现这几年来的经历&#xff0c;一直想着写点什么东西记录一下&#xff0c;刚好大四空闲时间真的太多&#xff0c;心血来潮&#xff0c;不如还是写写吧&#xff0c;记录…

mysql cdc 整库迁移 (mysql to mysql)

技术思想 利用 mysql catalog&#xff0c;mysql cdc&#xff0c;flink jdbc 等技术实现 mysql 整库迁移至下游数据库&#xff0c;这里是示范 mysql to mysql &#xff0c;其他 sink 组件可自行扩展实现。 通过 flink ParameterTool&#xff0c;可以选择是整库同步还是多表亦或…

2023年天津天狮学院专升本报名考试的安排

天津天狮学院2023年高职升本科考试报名时间安排的通知 一、报名条件 报名条件和具体要求按照天津市招生委员会的文件规定执行。考生必须完成文化课报名环节&#xff0c;且填报天津天狮学院志愿&#xff0c;且具备我校提出的线上考试条件&#xff0c;方可报考我校专业课考试。考…