从以下几个方面考虑
- 1.scenario 场景:
- 用户规模
- 功能的需求量
- DUA(日用户活跃数量)
- QPS (每秒查询率)衡量标准:规定时间内所处理流量多少
100M*0.1/84600(1天86400秒)~100
0.1–平均每天每个用户操作次数 QPS为100
peak(系统操作高峰期值) average
- 2.Service
- 3.Storage
- mysql 等SQL数据库
- MongoDB/Cassandra等硬盘型NOSQL数据库
- memcached/Redis等内存型NOSQL数据库
memcached 一款负责帮你cache在内存的软件数据存储系统
小结
用户系统特点:
- 读多写少 :一定要用cache做优化
- 写少:从qps角度来说,一台mysql就可以
- 读多:用memcached来优化进行读优化
- 读多写多
- 1.用分布式DB服务器分摊流量
- 2.Redis 这样读写都很快的。
Memcached和Redis
1.Mescached 只支持简单的key,valued存储,不支持枚举,不支持持久化,服务器down机,启动时缓存的数据就会清空。
memcached+mysql会遇到的问题:
- MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
- Memcached与MySQL数据库数据一致性问题
- Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。
- 跨机房cache同步问题。
2.Redis 除了支持k/v形式的存储之外,还支持list,set,hash,等多种数据结构。Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
缓存
cache是什么?
缓存,以key-value的形式缓存了信息,需要的时候先去cache中拿,无需重新计算
cache一定要存在内存中?
cache是一个概念,并没有指定存在什么样的存储介质当中。
cpu,File System,browser 都有cache
一致性:数据存储和缓存的一致性。
更新数据,要先delete cache当中的数据,再去update db的数据。顺序不能改变。此时如果db down掉了,cache成功删除,重启时会从DB取数据,数据虽没成功但没问题。但是先 up db 再delete cache 有可能发生 db的update 成功,此时 cache down掉了,那么重新启动的时候,会从cache中拿到原来的假数据,就违背了db cache的一致性。
缓存数据的生命周期:
许多的缓存实现过期策略导致数据失效并从缓存中移除如果不在指定时间内访问。为了缓存到缓存中的有效性,确保过期策略匹配使用数据的应用程序的访问模式。不要使过期时间太短,因为这可能导致应用程序不断地从数据存储中检索数据,并将其添加到缓存中。同样,不要使过期时间过长,缓存的数据可能会变得不新鲜。请记住,缓存是最有效的相对静态的数据,或是经常读的数据。
清除策略:
大多数缓存具有一个规模有限的数据存储区,并且是认为是必要的数据。大多数缓存采用最近最少使用策略来清除项,但这是可以定制的。配置缓存的全局过期属性和其他属性,以及每个缓存项目的过期属性,以帮助确保缓存的成本有效。它可能并不总是适合于全球驱逐政策的每一项在缓存。例如,如果一个缓存的项目是非常昂贵的,从数据存储检索,它可能是有益的保留此项目在高速缓存中的费用更频繁访问,但成本较低的项目。