数据存储遇到坑的总结
mysql
innodb的表要定期进行data_free的清理 优化表空间碎片
关闭query_cache 相关sql的数据缓存通过redis或者mc进行存储 减少mysql的压力
杜绝使用外键,一致性放到逻辑层
最好不使用触发器,存储过程
单表的索引最好在5个及以下
适当使用mysql的缓冲区 如写入数据 优化写入时间
杜绝出现null值
select 不使用 *
count 统计 * 是表的行数 统计制定字段是非空的行数 myisam count(*)速度快是因为有单独存储行数
innodb_flush_log_at_trx_commit 和 sync_binlog 优化磁盘写入
推荐做法是innodb_flush_log_at_trx_commit=2,sync_binlog=500 或1000
redis是单线程的 杜绝大value,大数据用mongo;想利用多核要起多个实例,做好主从,做好哨兵
redis的过期策略是定时清理和惰性过期
定时清理:
有一个dict存放带过期时间的key 定期随机清理部分过期的key
惰性过期:
get时如果key没有被清理,判断是否过期,过期清理返回空
redis 的内存不能超过主机内存的40% save单起线程要使用同样大小的内存 不save的可以放大
一定要设置最大内存,否则物理内存用爆了就会大量使用Swap
redis只做缓存或者计数使用 不能作为DB使用
redis的主从备份第一次是全量复制,后期是增量复制,当从服务器断开的时间过长,偏移量不在主机缓存队列里时是全部复制.
避免一次性删除大量的key 防止堵塞
做redis cluser 后事物有问题 在一个分片上的可以控制 ,否者不可以;数据库只能用0库
没有持久化,需借助第三方插件
防止单点雪崩
memcache是多进程模型,可以高并发处理数据,本身使用CAS 放心使用
memcached的过期策略LRU是针对slab的,不是全部的数据
memcache适合小数据, mc key限制。 长度限制250;不能有空格,中文。 value最大的存储对象为1M
memcache 是预申请,内存会有些许浪费,但是不会出现内存碎片
设置好内存增长比例
mc超时时间设置。过大,会表现为set进去成功, 但get不出来。
原因:
原来,mc范围类型的时间,最大是设置为30天了(设置的时候要改为秒,也就是60*60*24*30秒)。超过这个值,就当做是unix 时间戳类型的时间。