Redis开发运维实践开发者设计规范之延迟考虑

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

4.5 延迟考虑

1. 尽可能使用批量操作:

  • mget、hmget而不是get和hget,对于set也是如此。
  • lpush向一个list一次性导入多个元素,而不用lset一个个添加
  • LRANGE 一次取出一个范围的元素,也不用LINDEX一个个取出

2. 尽可能的把redis和APP SERVER部署在一个网段甚至一台机器。

3. 对于数据量较大的集合,不要轻易进行删除操作,这样会阻塞服务器,一般采用重命名+批量删除的策略:

排序集合:

# Rename the key
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.zset.key", newkey)

# Delete members from the sorted set in batche of 100s
while redis.ZCARD(newkey) > 0
 redis.ZREMRANGEBYRANK(newkey, 0, 99)
end

集合:

# Rename the key
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.set.key", newkey)

# Delete members from the set in batches of 100
cursor = 0
loop
 cursor, members = redis.SSCAN(newkey, cursor, "COUNT", 100)
 if size of members > 0
redis.SREM(newkey, members)
 end
 if cursor == 0
break
 end
end

列表:

# Rename the key
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.list.key", newkey)

# Trim off elements in batche of 100s
while redis.LLEN(newkey) > 0
 redis.LTRIM(newkey, 0, -99)
end

Hash:

# Rename the key
newkey = "gc:hashes:" + redis.INCR( "gc:index" )
redis.RENAME("my.hash.key", newkey)

# Delete fields from the hash in batche of 100s
cursor = 0
loop
 cursor, hash_keys = redis.HSCAN(newkey, cursor, "COUNT", 100)
 if hash_keys count > 0
redis.HDEL(newkey, hash_keys)
 end
 if cursor == 0
break
 end
end

4. 尽可能使用不要超过1M大小的kv。

5. 减少对大数据集的高时间复杂度的操作:根据复杂度计算,如下命令可以优化:

6. 尽可能使用pipeline操作:一次性的发送命令比一个个发要减少网络延迟和单个处理开销。一个性能测试结果为(注意并不是pipeline越大效率越高,注意最后一个测试结果) :

logger@BIGD1TMP:~> redis-benchmark -q -r 100000 -n 1000000 -c 50 
PING_INLINE: 90155.07 requests per second
PING_BULK: 92302.02 requests per second
SET: 85070.18 requests per second
GET: 86184.61 requests per second

logger@BIGD1TMP:~> redis-benchmark -q -r 100000 -n 1000000 -c 50 -P 10
PING_INLINE: 558035.69 requests per second
PING_BULK: 668002.69 requests per second
SET: 275027.50 requests per second
GET: 376647.84 requests per second

logger@BIGD1TMP:~> redis-benchmark -q -r 100000 -n 1000000 -c 50 -P 20
PING_INLINE: 705716.25 requests per second
PING_BULK: 869565.25 requests per second
SET: 343406.59 requests per second
GET: 459347.72 requests per second

logger@BIGD1TMP:~> redis-benchmark -q -r 100000 -n 1000000 -c 50 -P 50
PING_INLINE: 940733.81 requests per second
PING_BULK: 1317523.00 requests per second
SET: 380807.31 requests per second
GET: 523834.47 requests per second

logger@BIGD1TMP:~> redis-benchmark -q -r 100000 -n 1000000 -c 50 -P 100
PING_INLINE: 999000.94 requests per second
PING_BULK: 1440922.12 requests per second
SET: 386996.88 requests per second
GET: 602046.94 requests per second

logger@BIGD1TMP:~> redis-benchmark -q -r 100000 -n 1000000 -c 50 -P 200
PING_INLINE: 1078748.62 requests per second
PING_BULK: 1381215.50 requests per second
SET: 379218.81 requests per second
GET: 537634.38 requests per second

一个场景是一个购物车的设计,一般的设计思路是:

在获取购物车内部货品时,不使用pipeline会很低效: 可以修改为:

7. 如果出现频繁对string进行append操作,则请使用list进行push操作,取出时使用pop。这样避免string频繁分配内存导致的延时。

8. 如果要sort的集合非常大的话排序就会消耗很长时间。由于redis单线程的,所以长时间的排序操作会阻塞其他client的 请求。解决办法是通过主从复制机制将数据复制到多个slave上。然后我们只在slave上做排序操作。把可能的对排序结果缓存。另外就是一个方案是就是采用sorted set对需要按某个顺序访问的集合建立索引。


Redis开发运维实践指南
本文为《Redis开发运维实践指南》内容,该书作者为黄鹏程,已授权云栖社区转载。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
运维 监控 大数据
高效运维管理:提升系统稳定性的策略与实践
在当今信息技术飞速发展的时代,运维管理作为保障系统稳定运行的关键环节,其重要性不言而喻。本文将深入探讨如何通过优化运维流程、引入自动化工具和建立完善的监控体系等策略,来有效提升系统的稳定性。同时,结合具体实践案例,分析这些策略在实际工作中的应用效果,为运维人员提供有益的参考和启示。
14 6
|
7天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【9月更文挑战第28天】在追求高效、稳定的IT运维时代,自动化工具Ansible凭借其简洁性、易用性和强大的功能脱颖而出。本文旨在通过实际案例引导读者理解Ansible的核心概念和操作流程,并分享如何通过Ansible简化日常运维任务,提升工作效率。从基础安装到高级应用,我们将一步步揭开Ansible的神秘面纱,让初学者也能轻松掌握自动化运维的要诀。
|
6天前
|
运维 监控 持续交付
构建高效运维体系的策略与实践xxxx xxxx-xx-xx xx:xx 发布于 xx
在当今数字化浪潮中,运维作为信息技术的重要支柱,其效率与创新能力直接关系到企业信息系统的稳定性和业务发展的可持续性。本文从提升运维效率的角度出发,探讨了如何通过策略规划、自动化工具应用、监控优化及团队建设等手段,实现运维工作的高效化和价值最大化,旨在为运维领域从业者提供一套可借鉴和实施的高效运维体系构建方案。
|
1天前
|
运维 持续交付 数据库
自动化运维工具的探索与实践
【9月更文挑战第34天】在快速发展的IT行业,高效、可靠的运维工作是保障系统稳定运行的关键。本文将介绍一些主流的自动化运维工具,并分享如何通过这些工具来提升运维效率和质量。
|
2天前
|
运维 监控 安全
构建高效运维体系:从监控到自动化的实践之路
在当今信息技术飞速发展的时代,运维作为保障企业信息系统稳定运行的关键环节,其重要性日益凸显。本文将探讨如何通过构建高效的运维体系,实现从被动响应到主动预防的转变,以及如何利用自动化工具提升运维效率和质量。我们将从运维的基本概念出发,逐步深入到监控、自动化和安全管理等方面,为企业提供一套实用的运维优化方案。
6 0
|
2天前
|
运维 监控 大数据
构建高效运维体系的策略与实践
在当今信息技术飞速发展的时代,运维作为保障系统稳定性、提升业务效率的关键环节,其重要性日益凸显。本文旨在探讨如何构建一个高效的运维体系,从自动化工具的应用到故障预防机制的建立,再到持续优化与团队协作的重要性,提出了一系列具体的策略和实践方法。通过深入分析,本文揭示了高效运维体系对于企业降低成本、提高服务质量、增强市场竞争力的重要作用,并为运维人员提供了实用的指导建议。
7 0
|
11天前
|
运维 监控 安全
构建高效运维体系的策略与实践
在当今信息技术飞速发展的时代,运维作为保障信息系统稳定运行的关键环节,其重要性日益凸显。本文将探讨如何通过优化管理策略、引入先进技术和培养专业人才,构建一个高效、智能的运维体系,以应对日益复杂的技术环境和业务需求。
10 0
|
21天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
2月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
60 0
|
22天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
下一篇
无影云桌面