redis 和 memcache
redis:支持持久化 |
mc:不支持 |
单线程 |
多线程 |
内存分配采用临时申请 |
内存预分配 |
内存 VM,数据量超量时,会引发 swap |
存储在物理内存 |
支持 KV,V 可以是 string,map,list,set,SortSet |
只支持 KV |
天然高可用,支持集群 |
要二次开发,做集群 |
value 无限制 |
value 最大 1M |
redis: 集群高可用
考虑雪崩,提前评估db能力,做防护
微服务,数据、缓存独立,多服务之间不要共用缓存,导致耦合度高,A服务的热数据把B服务的热数据挤出去
缓存修改:失效还是删除
读: 可以缓存失效或者修改,cache hit直接返回,cache miss ,get db ,set cache,返回
对于简单型数据,比如int,string,直接set可以,成本低
对于User,html,json,修改时要先get,在反序列化或者解析,
在修改,然后序列化,在set,成本高,一般选择直接失效
具体看情况,一般直接失效,问题也不大
写: 先操作数据库,直接del缓存,如果先操作cache,
在数据库主从同步未完成之前,可能导致数据库和缓存数据不一致
缓存脏数据原因:
1、先操作缓存,后数据库
可能主从同步没有完成,写后立马读,导致读到从库脏数据,set回缓存,
这是主从同步完成,导致缓存和数据库数据不一致。可以在从库binlog完成后
主动删除缓存,保持数据一致(可以用cannal?)
2、先操作数据库,后缓存
写线程主库更新数据,删除缓存,读线程读到从库,set回缓存脏数据。
解决可以在binlog后注定删除缓存,保持一致。
主从本质解决问题:
读写分离,提升读的性能
主库写,从库读,主从 数据同步,同步有延迟,可能读取的数据不一致。
redis 是否需要高可用:
假如redis挂了,流量全部压倒数据库,不会导致雪崩,没必要高可用
redis 是否要用要固化
如果redis是指做缓存,允许cache miss,没必要固话。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于