这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天,今天我学习了大厂程序员是怎么用Redis的,是偏高级的知识,还需要在实践中慢慢学习
Redis - 大厂程序员是怎么用的:
为什么需要Redis:
数据从单表,演进出了分库分表
MySQL从单机演进出了集群
数据量增长
读写数据压力的不断增加
数据分冷热
热数据:经常被访问到的数据
将热数据存储到内存中
Redis基本工作原理:
Redis 是一个使用 C 语言写成的,开源的、key-value 结构的、非关系型数据库。它支持存储的 value 类型相对更多,包括 String(字符串)、List(列表)、Set(集合)、Sorted Set(有序集合) 和 Hash(哈希),而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。Redis 可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
·数据从内存中读写
·数据保存到硬盘上防止重启数据丢失
增量数据保存到AOF文件
·全量数据RDB文件
·单线程处理所有操作命令
Redis使用注意事项:
1.大Key、热Key:
大Key的危害
·读取成本高
·容易导致慢查询(过期、删除)·主从复制异常,服务阻塞
无法正常响应请求
业务侧使用大Key的表现
·请求Redis超时报错
消除大Key的方法:
集合类结构hash、list、set、set
(1)拆分:可以用hash取余、位掩码的方式决定放在哪个key中
(2)区分冷热:如榜单列表场景使用zset,只缓存前10页数据,后续数据走db
热Key的定义:
用户访问一个Key的QPS特别高,导致Server实例出现CPU负载突增或者不均的情况。热key没有明确的标准,QPS超过500就有可能被识别为热Key
解决热Key的方法
1.设置Localcache
在访问Redis前,在业务服务侧设置Localcache,降低访问Redis的QPS。LocalCache中缓存过期或未命中,则从Redis中将数据更新到LocalCache。Java的Guava、Golang的Bigcache就是这类LocalCache
⒉拆分
将keyvalue这一个热Key复制写入多份,例如key1:value,key2.value,访问的时候访问多个key,但value是同一个,以此将qps分散到不同实例上,降低负载。代价是,更新时需要更新多个key,存在数据短暂不一致的风险