微信号:Idevops168

介绍:运维自动化开发:python、django、saltstack、tornado、bootstrap、redis等经验分享!

Redis之最佳使用

2015-08-30 09:10 野狼

REDIS简介

lRemote Dictionary Server

lKV NoSQL

lIn-memory can persistent


lOpen Source

lBorn on 2009 @antirez

l现使用版本2.8.19

l3.0 Support cluster


REDIS高可用平台演进

lV1版本:

lMaster/slave + keepalived+VIP


lV1版本缺点:

l特殊场景处理不完美

lMaster/Slave Master故障后,有可能需要人为参与Master/Slave关系指定

l单机多实例keepalived无配置动态加载

l偶而出现双Master现象

lKeepalived异常出,双边出现VIP现象


lV2版本:

lMaster/Slave+Sentinel

lRedis 2.8后支持

Redis特点

l进程特点

l单进程,只能使用到一个Core

l基于事件编程,Epoll接入,对于连接数不太care


lMaster/Slave

lSlave加入,需要从Master获取一份全量数据

lMaster需要做Bgsave,会Dobule一份内存


lStorage & Cache

lStorage 不能和Cache混用

lStorage不能使用LRU

lStorage数据超过内存后,会出现不响应的现象

lStorage 不能和Cache混用

lStorage不能使用LRU

lStorage数据超过内存后,会出现不响应的现象


lLRU算法maxmemory-policy

lVolatile-lru

lAllkeys-lru

lVolatile-random

lAllkeys-random

lVolatile-ttl

lNoeviction


l特别小心对待O(N)命令

lSMEMBERS

lLRANGE

lHMGET


l不要设计过大的{list, set,hash}

l容易造hash不均衡

l容易引起慢查询

l慢查询多则导致客户端超时


lRedis内存分布

lredis内存使用量估算方式:(key的平均长度+value的平均长度)*kv的个数*2


l所以严禁在Redis中存储大量的静态数据


如何使用REDIS服务

lMySQL VS Redis

l多线程 VS 单进程

lRedisslow query都不能容忍

l只要不使用事务,则不要需要引入并发控制,不存在多版本

l非常容易统计ResponseTime

l磁盘 VS 内存

l可提供十万的qps

l不能容忍使用到swap

l主从复制

l同步不落地,同步依赖于内存+网络

l网络瞬断可以续传,2.8以前是全量

lSlave crash后几乎都要重做

l级联复制可靠性低

l主从切换需要重做从库,1主多从不现实

l复制上没有MySQL靠谱

l变更持久性

lAlways,everysec, no

l主从一致性

l从库延时微秒级别

l可配至少m个从库延时在N秒内

l数据安全性

l可以设置密码

lRedis权限无分级,有密码后可以做所有事情MySQL VS Redis


l使用Redis约法几条

lredis使用方式:cache vsstorage

lredis是作为缓存,还是作为存储使用?作为缓存的话,业务方必须为每个key都设置过期时间;作为存储使用,业务方需要考虑数据的清洗策略,否则redis的内存量会一直增长,最终达到上限,导致服务不可用。

l对同一套redis的使用,不要出现部分key设置了过期时间,另外部分key没有设置过期时间的情况。

l内存使用量,以及未来的增长趋势如何?

l预计整个业务单份内存量,5G/10G/20G还是更多?未来2年内会增⻓到大概多少G?

lredis内存使用量估算方式:(key的平均长度+value的平均长度)*kv的个数*2

lredis内存的估算本身很复杂,与key是否设置了过期时间,key的大小,value的类型和大小,value采用的编码和存储方式,redis实例自身垃圾回收的速度,每秒写入量的大小等都相关。所以乘以2是比较保守的估算方式。

l对内存资源的评估请本着认真负责的态度,既要能满足业务扩展的需求,又要杜绝资源的浪费。

lqps量,以及未来的增长趋势如何?

l整个redis集群需要提供的qps量,1w2w还是5w,甚至更多?未来1-2年预估会达到多少?

lqps5000以下的,请优先考虑使用mysql,我们的mysql可以满足绝大部分业务需求,同时提供更好的高可用和数据安全解决方案。对于qps很小(例如只有几百甚至几十的qps),但是业务场景非常适合使用Redis的,请说明具体原因。

l业务使用的命令?

l业务要列举用到的命令,这样方便DBA对业务更深入的理解,帮助业务优化和定位问题

比如:

l读命令:get,lrange, hget等等

l写(或读写)命令:setex,set, lpush, lpop等等


lRedis危险命令

bgrewriteaof config get info

config set config resetstat

config rewrite flushall

flushdb shutdown

save bgsave

keys * client kill

client list slowlog

monitor slaveof


 
DevOps 更多文章 SaltStack 实战之pillar的py格式应用 在Django中实现一个高性能未读消息计数器 saltstack之salt-ssh的细枝末节 Ready ? "Go" !!! Go学习之数组、切片、关联数组、Range 遍历
猜您喜欢 QQ空间直播秒开优化实践 饿了么移动APP的架构演进 Sass绘制多边形 揭秘:深入解读针对苹果Mac电脑的ROM级恶意软件“雷击(Thunderstrike) 出柜