redis专题11 线程IO模型
Redis
是单进程单线程模型的KV数据库,那为什么还常应用在高并发场景中? 其中一个重要原因是Redis
是一个单进程单线程且采用多路I/O复用模型,非阻塞IO技术, 使之可以同时处理多个连接请求(减少网络IO耗时), 也不需要关心锁,线程切换等资源消耗问题;
Redis
是单进程单线程模型的KV数据库,那为什么还常应用在高并发场景中? 其中一个重要原因是Redis
是一个单进程单线程且采用多路I/O复用模型,非阻塞IO技术, 使之可以同时处理多个连接请求(减少网络IO耗时), 也不需要关心锁,线程切换等资源消耗问题;
除了常见的SQL语句优化及索引优化等数据库优化手段外, 对数据库结构进行优化也是可以考虑的一个重要方向;
用redis
模糊匹配key
时,官方建议不要使用keys
或smembers
,他们的时间复杂度都是O(N)
,使用scan
,zscan
,hscan
等。scan
系列增量式迭代命令每次执行的复杂度为O(1)
, 对数据集进行一次完整迭代的复杂度为O(N)
, 其中N
为数据集中的元素数量。相比keys
命令执行时会阻塞掉整个redis
线程而言,scan
系列则是通过游标分步进行的,不会阻塞redis
线程, 且在同一时间,可以有任意多个客户端对同一数据集进行迭代。
索引优化也是数据库优化的一个重要方向, 本文将从实践结合理论的角度回顾索引相关知识, 同时通过实例分析进一步学习索引选择及优化过程;
redis3.2
版本里面新增的一个功能就是对GEO(地理位置)
的支持。意味着可以用redis
来实现查找附件的人
的等搜索功能了;
为应用服务提供稳定的数据CURD服务,同时为了进一步提升CURD性能及潜在的问题, 就需要根据实际业务情况及数据体量进行数据库优化修订工作, 关于数据库优化的操作可以从多个方面来总结归纳, 如对SQL语句的优化, 索引的优化, 表结构的优化, 配置的优化等等; 本文从总结实践经验及归纳回顾知识要点的角度来探讨关于SQL语句优化的相关问题;
数据库需求分析及逻辑设计仅仅是将数据及数据实体之间的关系理清楚了, 最终目的是建立合适的数据库表结构; 在数据库设计环节中的物理设计的重要工作就是建立数据库表结构;
redis4.0
以后开始支持扩展模块,redis-cell
是一个用rust
语言编写的基于令牌桶算法
的的限流模块,提供原子性的限流功能,并允许突发流量,可以很方便的应用于分布式环境中。
限流算法在分布式领域是一个经常被提起的话题,当系统的处理能力有限时,如何阻止计划外的请求继续对系统施压,这是一个需要重视的问题。除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求。比如在UGC
社区, 用户的发帖
, 回复
, 点赞
等行为都要严格受控,一般要严格限定某行为在规定时间内允许的次数,超过了次数那就是非法行为。
设计出符合业务需求的数据存储模型至关重要, 合理的数据库表设计不仅能有效的应对业务数据的存储, 还能高效的对已存储的数据进行访问操作; 本文将以数据库设计范式等知识背景来进一步探讨数据库逻辑设计相关问题;