redis简介

Redis是一个开源(BSD许可)的内存数据结构存储系统,它可用作数据库、缓存和消息中间件。
它支持多种类型的数据结构,如字符串(String)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。
Redis内置了复制(replication)、LUA脚本(Lua scripting)、LRU驱动事件(LRU eviction)、事务(transactions)和不同级别的磁盘持久化(persistence),并通过Redis哨兵(Sentinel)和自动分区(Cluster)和提供高可用性(high availability)。

数据类型

常使用的几种数据类型。
String类型
redis 的string比较浪费内存.
常见应用:计数操作 粉丝数 用户留存率(Bit类型操作、bloomfilter)
List类型(双向链表)
可用作消息暂存,消息队列.需要小心队列爆满。
常用应用:最新用户访问时间
Hash类型
hashmap类字典,比如要缓存用户的年龄,性别等信息
常见应用:中转对碰、内部路由案例。
Set类型
集合,存储不重复值.
常见应用:微博关注,共同粉丝、集合交并差等.
Sorted set(hash+skiplist)
有序集合,用作实时排名,topN操作等.注意:元素千万+时,非常耗费内存,需要预先评估。
常见应用:排行榜,TOP N问题.

使用

尽量选择复杂度O(1)或者o(log(N))的命令   
key命名尽量简短,节省内存开销,单次操作涉及10个key+的要避免,尽量只单值操作,比如要避免hgetall等之类操作多个值的操作.

value尽量小,尽量不要超过1K大小.
相同类型的数据查询,可以使用pipeline管道命令进行批量操作.比如查询20个好友的分数.
命令间有简单事务关系的,可以使用mutil,exec等进行简单事务操作,比如CAS等问题.
要做cache前,请判断是否是活跃数据,命中率非常低不做cache.
需要考虑内存耗完后,数据的淘汰情况,是否能淘汰,有此需求的请注意设置key的过期时间,常见的淘汰方式lru.
需要评估cache挂掉后,是否会对db造成大的冲击,不要造成雪崩问题.

容量预估

• String内存估算
存单条记录耗费的管理字节约70字节
使用string前先预估耗费的内存量
• List内存估算
存单条记录耗费的管理字节约40字节,key可以忽略.
使用list前先预估耗费的内存量
• Hash内存估算
– Zipmap: hashkey个数 * (dictEntry大小 + redisObject大小 + 包含key的sds大小 + subkey的总大小
使用hash前先预估耗费的内存量
• Set内存估算
存单条记录耗费的管理字节约40字节,key可以忽略
使用set前先预估耗费的内存量
• Sorted set内存估算
存单条记录耗费的管理字节约90字节, key可以忽略
使用sorted set前先预估耗费的内存量
可以通过单机部署多redis进程,提前做容量规划,以后可以通过迁移进程到新服务器解决容量问题。

性能

php短链接操作redis, get、set等单个value操作,性能在3.5W左右每秒。注意估算操作次数,不要超过瓶颈。
请求次数超过3.5W的,部署前需要分实例或者客户端管理redis分片。(分片组件、算法(hash,一致性hash,虚拟槽slot,范围分片等))

持久化

redis有持久化需要的话搭从机,在从机进行落地数据(rdb+aof),不要在主机落地.

部署

Redis是单线程单进程,为了充分利用CPU多核,可以在每台机器部署多个redis实例,redis所有组件耗费内存之和<机器总内存

容灾

数据比较重要,需要自动容灾的,请联系运维部署,做到master挂掉后,自动切换到slave.
常见的高可用方案:
vip+keepalived redis cluster redis sentinel

负载均衡、分片

twemproxy

监控

运维部署相关的redis连接数、使用内存数、cpu等监控图,可以对比当前、往期等数据.出问题后,可以查看相关监控图,方便定位解决问题。