Redis使用规范1、 目的redis
为了不出现因redis使用不当而出现异常影响业务,以及方便后面的运维,故出具redis使用规范,经过规范使用能够更好、更高效发挥redis缓存优点。数据库
2、 使用规范1. Redis有数据丢失风险,程序须要处理数据丢失时从新加载过程【强制】数组
使用redis有丢失数据的风险,项目架构时须要考虑到相应解决方案,程序须要处理若是redis数据丢失时从新加载过程。缓存
2. 冷热数据分离【强制】服务器
冷热数据分离,不要将全部数据所有都放到Redis中, 虽然Redis支持持久化,可是Redis的数据存储所有都是在内存中的,成本昂贵。建议根据业务只将高频热数据存储到Redis中,对于低频冷数据可使用基于磁盘(Oracle、MySQL、MongoDB等)存储方式,不只节省内存成本,并且数据量小在操做时速度更快、效率更高!网络
3. 不一样业务数据要分开存储【强制】数据结构
不要将不相关的业务数据都放到一个Redis实例中,新业务申请新的单独实例。由于Redis为单线程处理,独立存储会减小不一样业务相互操做的影响,提升请求响应速度;同时也避免单个实例内存数据量过大,在出现异常状况时能够更快恢复服务。架构
4. 规范Key格式【强制】并发
合适的Key,便于查看,统计,排错。不推荐含义不清的Key和特别长的Key。例如:系统名+应用名+业务数据 。运维
5. 选择合适的数据类型【建议】
在不能肯定其它复杂数据结构必定优于String类型时,避免使用Redis的复杂数据结构。每种数据结构都有相应的使用场景,String类型是Redis中最简单的数据类型,推荐使用String类型。可是考虑到具体的业务场景,综合评估性能、存储、网络等方面以后使用适当的数据结构。Redis支持的数据库结构类型较多:字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(Sorted Set), Bitmap, HyperLogLog和地理空间索引(geospatial)等,须要根据业务场景选择合适的类型,常见的如:String能够用做普通的K-V、计数类;Hash能够用做对象如商品、经纪人等,包含较多属性的信息;List能够用做消息队列、粉丝/关注列表等;Set能够用于推荐;SortedSet能够用于排行榜等。
6. 谨慎全量操做Hash、Set等集合结构【建议】
在使用HASH结构存储对象属性时,开始只有有限的十几个field,每每使用HGETALL获取全部成员,效率也很高,可是随着业务发展,会将field扩张到上百个甚至几百个,此时还使用HGETALL会出现效率急剧降低、网卡频繁打满等问题,此时建议根据业务拆分为多个Hash结构;或者若是大部分都是获取全部属性的操做,能够将全部属性序列化为一个STRING类型存储!一样在使用SMEMBERS操做SET结构类型时也是相同的状况。
7. 对于必需要存储的大文本数据压缩后存储【建议】
对于大文本写入到Redis时,要压缩后存储。大文本数据存入Redis,除了带来极大的内存占用外,在访问量高时,很容易就会将网卡流量占满,进而形成整个服务器上的全部服务不可用,并引起雪崩效应,形成各个系统瘫痪。
8. 禁止大String【强制】
核心集群禁用大于1MB的String大Key(虽然Redis支持512MB大小的String),若是1MB的key每秒重复写入10次,就会致使写入网络IO达10MB。
9. 线上Redis禁止使用Keys正则匹配操做【强制】
Redis是单线程处理,在线上KEY数量较多时,操做效率极低,该命令一旦执行会严重阻塞线上其它命令的正常请求,并且在高QPS状况下会直接形成Redis服务崩溃。若是有相似需求,用Scan命令代替。
10. 存储的Key要尽量设置超时时间【建议】
若是应用将Redis定位为缓存Cache使用,对于存放的Key要设置超时时间!由于若不设置,这些Key会一直占用内存不释放,形成极大的浪费,并且随着时间的推移会致使内存占用愈来愈大,直到达到服务器内存上限。另外Key的超时长短要根据业务综合评估,而不是越长越好。
11. 频繁对String进行Append操做,则使用List【建议】
若是出现频繁对String进行Append操做,则请使用List进行Push操做,取出时使用Pop。这样避免String频繁分配内存致使的延时。
12. 线上禁止长时间打开Monitor命令【强制】
禁止生产环境长时间打开Monitor命令,Monitor命令在高并发条件下,会存在内存暴增和影响Redis性能的隐患。
13. 位级别和字级别的操做【建议】
Redis 引入了位级别和字级别的操做:GETRANGE, SETRANGE, GETBIT 和 SETBIT.使用这些命令,能够把Redis的字符串当作一个随机读取的(字节)数组。例如你有一个应用,用来标志用户的ID是连续的整数,你可使用一个位图标记用户的性别,使用1表示男性,0表示女性,或者其余的方式。这样的话,1亿个用户将仅使用12 M的内存。你可使用一样的方法,使用 GETRANGE 和 SETRANGE 命令为每一个用户存储一个字节的信息。
14. 设置最大内存及最大内存淘汰策略参数【强制】
设置最大内存能够限制redis内存使用,避免出现耗尽全部物理内存OOM问题出现故障。同时设置maxmemory-policy(最大内存淘汰策略),根据自身业务类型,选好maxmemory-policy(最大内存淘汰策略),设置好过时时间。
15. 预留足够空闲物理内存【强制】Redis在作持久化时会fork出一个一样资源大小的进程来进行bgsave操做,预留足够物理内存(通常须要预留总物理内存的40%左右)能够保证fork进程正常,避免持久化失败。