IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis 有序集合(zset)取交集(zinterstore)操作耗时测试 -> 正文阅读

[大数据]Redis 有序集合(zset)取交集(zinterstore)操作耗时测试

? ? ? ? ?取交集的场景很多,比如公众号文章显示有多少个好友已读,又或者群聊成员列表显示有多少个好友已经入群。最近遇到一个类似场景,一开始的觉得线上数据量较大,redis 取交集操作时间复杂度在O(N),实时计算会不会不合适?是否离线计算更好?请教了组内资深大佬,大佬说数据量不大的情况下redis计算挺快的。听了之后感觉需要实际测试一下,不然贸然上线心里没底。下面是测试流程,有需要的同学可以参考下。

? ? ? ? 假定测试目标是统计在线用户中付费用户数量,测试结果如下图,先说结论:耗时和数据集大小以及数据集重合度有关(废话,耗时肯定和数据集大小有关^_^)。测试结果也和zinterstore 的时间复杂度是一致的。下图右侧是提高重合度的结果,耗时明显有增加。

ZINTERSTORE 时间复杂度: O(N*K)+O(M*log(M)) 
这里N表示有序集合中成员数最少的数字,K表示有序集合数量。M表示结果集中重合的数量。

测试设备:

????????腾讯云服务器 16核 32G内存

数据集通过redis lua脚本跑出

create_data.lua 脚本:

-- 1000 用户量
redis.call("del","online_user_1000", "rich_user_1000","online_user_5000","rich_user_5000","online_user_10000","rich_user_10000","online_user_50000","rich_user_50000","online_user_100000","rich_user_100000")
for i = 1, 1000, 1 do
redis.call("zadd", "online_user_1000", math.random(1000000)*math.random(100000), math.random(10000000))
redis.call("zadd", "rich_user_1000", math.random(1000000)*math.random(100000), math.random(10000000))
end

-- 5000 用户量
for i = 1, 5000, 1 do
redis.call("zadd", "online_user_5000", math.random(1000000)*math.random(100000), math.random(10000000))
redis.call("zadd", "rich_user_5000", math.random(1000000)*math.random(100000), math.random(10000000))
end

-- 10000 用户量
for i = 1, 10000, 1 do
redis.call("zadd", "online_user_10000", math.random(1000000)*math.random(100000), math.random(10000000))
redis.call("zadd", "rich_user_10000", math.random(1000000)*math.random(100000), math.random(10000000))
end

-- 50000 用户量
for i = 1, 50000, 1 do
redis.call("zadd", "online_user_50000", math.random(1000000)*math.random(100000), math.random(10000000))
redis.call("zadd", "rich_user_50000", math.random(1000000)*math.random(100000), math.random(10000000))
end

-- 100000 用户量
for i = 1, 100000, 1 do
redis.call("zadd", "online_user_100000", math.random(1000000)*math.random(100000), math.random(10000000))
redis.call("zadd", "rich_user_100000", math.random(1000000)*math.random(100000), math.random(10000000))
end

-- 500000 用户量
for i = 1, 500000, 1 do
redis.call("zadd", "online_user_500000", math.random(1000000)*math.random(100000), math.random(10000000))
redis.call("zadd", "rich_user_500000", math.random(1000000)*math.random(100000), math.random(10000000))
end

-- 1000000 用户量
for i = 1, 1000000, 1 do
redis.call("zadd", "online_user_1000000", math.random(1000000)*math.random(100000), math.random(10000000))
redis.call("zadd", "rich_user_1000000", math.random(1000000)*math.random(100000), math.random(10000000))
end

return "OK"

?测试工具:redis-benchmark

测试命令如下,-n表示执行次数

redis-benchmark -n 10000 zinterstore inter_user_1000 2 online_user_1000 rich_user_1000
redis-benchmark -n 10000 zinterstore inter_user_5000 2 online_user_5000 rich_user_5000
redis-benchmark -n 10000 zinterstore inter_user_10000 2 online_user_10000 rich_user_10000
redis-benchmark -n 10000 zinterstore inter_user_50000 2 online_user_50000 rich_user_50000
redis-benchmark -n 10000 zinterstore inter_user_100000 2 online_user_100000 rich_user_100000
redis-benchmark -n 10000 zinterstore inter_user_500000 2 online_user_500000 rich_user_500000
redis-benchmark -n 10000 zinterstore inter_user_1000000 2 online_user_1000000 rich_user_1000000

测试截图:

? ? ? ? ?在我的业务场景里,数据集一般在1万以下,上限不会超过100万,结合本次实测结果,实时计算应该没啥问题。测试过程中也发现,虽然单个请求耗时不大,但是如果存在大量请求,并且这些请求对应数据规模很大,则势必占用redis server大量处理时间,带来普通请求的延迟或者超时,这一点也需要在业务中考虑。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:51:25  更:2021-09-20 15:54:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:33:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码