- 浏览: 23981 次
- 性别:
- 来自: 北京
最新评论
文章列表
在WEB开发中经常会遇到接口被刷的情况,如CC攻击,通过有限的ip对服务器发来大量请求,使服务器资源耗尽。使用nginx的ngx_http_limit_req_module 模块和ngx_http_limit_conn_module模块可以对统一ip的请求和连接数进行限制。
1,ngx_http_limit_req_module模块,用来限制连单位时间内连接数的模块,是对一段时间内的连接数限制。设置一块共享内存限制域用来保存键值的状态参数
语法:
limit_req_zone $variable zone=name:size rate=rate; 其中$ ...
线上业务Redis数据迁移至SSDB
- 博客分类:
- redis学习笔记
1,背景
Redis的持久化只是用于备份数据,而如果作为持久化存储会有一些问题(具体?),因此将Redis数据迁移至SSDB,命令列表见http://ssdb.io/docs/zh_cn/redis-to-ssdb.html
2,策略
由于Redis存储的数据很重要,因此为了保证数据迁移的可靠性同时不对线上业务造成影响,采取分步过渡并验证的方式:
3,关键点
a,修改代码,加入开关切换redis和ssdb的读写使上述几种情况都可以通过配置开关来控制。
b,加入读取SSDB数据的lua接口,并发访问量很大,采取nginx+lua解决。
...
Redis Proxy
- 博客分类:
- redis学习笔记
在Redis访问量比较大的情况,如果将请求都压在单实例上,将会造成Redis负载过高,连接数超限。因此为了平衡请求可将请求分散在通过Redis多个从库上,从库负责读,而主库负责写,redis proxy就是如何选择服务器并将请求分配的机制。
redis服务器的配置分三个维度:环境、主从、num确定一个服务器,num根据uid和app等来确定。每个app对应确定的库。在进行实例化的时候根据uid和app进行实例化,通过uid,环境和主从来选择主从服务器,这样选择出master和slave各一个,同时对master和slave对应的命令进行解析,根据命令是读或者写来选择mast ...
1,协程、select、channel
协程间的通信
同一级的多个节点是可以并发执行的。
当有节点交汇时,后续节点需要等待前面节点的信号,出现等待阻塞的情况。使用select和有缓冲的channel等待信号发生。select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。同时为了避免协程永久阻塞,加入超时机制。
当关联节点是同步处理时,需要等待该节点处理完成并返回执行结果,用法与第二步相似
在worker消费时,消息到达开新协程去消费,加入协程池
无缓冲channel和有缓冲channel
对 ...
Nginx请求执行阶段
- 博客分类:
- Nginx学习笔记
Nginx在处理请求时,按照不同的阶段依次处理,常见的阶段如rewrite、access和content依次执行。Nginx中的指令一般只注册在某一个阶段,如echo注册在content阶段,set注册在rewrite阶段,因此set总是在echo之前执行,与书写顺序无关。特殊的,geo和map指令与处理阶段无关,它们是声明性的。
1,rewrite阶段
rewrite中的指令可以混合执行,如set、set_by_lua等,set_by_lua将计算结果赋予变量,如set_by_lua $c "return ngx.var.a + ngx.var.b&q ...
Nginx变量只有一种字符串类型,变量名前使用$符号来引用变量。但不支持通过转衣服来便是$符号,可使用ngx_geo模块来表示,如:
geo $dollar {
default "$";
},可使用$dollar来表示$。
Nginx的set指令首先在nginx启动加载配置时创建变量,而变量的赋值发生在请求处理的时候。其可见范围为整个Nginx配配置。但注意,Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰。
内部跳转指的 ...
Redis事务和脚本功能
- 博客分类:
- redis学习笔记
Redis事务是指将一些命令打包,一次性按顺序执行多个命令的机制,不会出现并发的情况,将命令都执行完以后才会执行其他命令。在一定程度上满足ACID特性。
1、Redis事务原理
事务由命令MULTI开始,使执行命 ...
哨兵(sentinel)是Redis高可用的解决方案,用来管理Redis实例,主要是监控、自动故障转移、通知、配置提供者。
1、sentinel的初始化
当一个 Sentinel 启动时, 它需要执行以下步骤:
a) 初始化服务器。sentinel本质上是一个运行在特殊模式下的Redis实例。该模式下redis实例主要使用发布订阅、文件事件处理器、和时间事件处理器的的功能。
b) Redis 服务器使用的代码替换成 Sentinel 专用代码。如服务的端口号,支持不同的命令列表等。
c) 初始化 Sentinel 状态。保存所有和 ...
主服务器可以有多个从服务器。同时从服务器可以与其他的从服务器的连接,形成图状结构。Redis的复制在主服务器上是非阻塞的。这意味着从服务器执行同步时主服务器能继续处理请求。Redis的复制在从服务器上也是非 ...
后台导出码问题记录及解决
- 博客分类:
- PHP
系统后台提供激活卡的导出功能,之前单次的导出量的需求最多在几万,最近尝试30W次的导出各种出现问题。下面是问题记录和解决。
问题一:后台点击导出后无反应,经查看日志出现错误Fatal error: Allowed memory size of ...
之前做了一个抢红包的活动,由于用户量级不大因此实现的版本不难,但开发人员设计系统的目标不该只是满足当前需求。如淘宝、京东,随着用户量级的逐渐增大,技术含量完全不是一个等级。因此打算从这个角度去深入研究学习。 本文主要介绍已经实现的满足用户量级较小的系统设计,后续会补充优化的方案。
1 需求
满足一定条件的用户可以在活动期间每天的固定时间点抢红包,每人最多只能领取一个。 2 内部逻辑图 3 步骤
a,用户点击抢红包发出抢红包的请求。 b,系统收到请求后做一些列的校验,包括时间,用户是否满足条件等。
c,验证是否已抢过,如抢过则返回。 ...
memcache使用多线程模型程序,使用libevent事件模型,与nginx类似,由一个主线程和多个worker线程组成。
1,主线程初始化。
memcache的主线程主要进行在监听套接字上注册事件监听网络中客户端的连接及处理和worker的初始化的 ...
redis 事件驱动机制
- 博客分类:
- redis学习笔记
redis基于事件驱动构建服务,有两种事件类型,文件事件FileEvent,和时间事件TimeEvent。
1,文件事件
以多路IO复用程序来同事监听多个套接字,处理网络连接的应答,读取,写入和关闭操作,并根据执行任务的不同分配 ...
1,Redis rehash
Redis的核心数据结构就是字典(dict),dict在数据量不断增大的过程中,会遇到HASH(key)碰撞的问题,如果DICT不够大,碰撞的概率增大,这样单个hash 桶存储的元素会越来愈多,查询效率就会变慢。如果数据量从几千万变成几万,不断减小的过程,DICT内存却会造成不必要的浪费。Redis的dict在设计的过程中充分考虑了dict自动扩容和收缩。
a, rehash的流程
首先为ht[1]分配空间,当负载因子大于3/2时进行扩容操作,扩容大小为第一个大于ht[0].used*2的2^n,当负载因子小于0.1 ...
1,redis对象的结构
type记录了对象的类型,可以使字符串,列表,哈希,集合和有序集合对象。
encoding记录的是type对象对应的底层实现,在redis中每种类型只有少两种底层实现的数据结构。通过不同的编码方式 ...