用缓存,主要是俩用途,高性能和高并发
-
假设这么个场景,你有个操作,一个请求过来操作mysql,半天查出来一个结果,耗时600ms。
缓存啊,折腾600ms查出来的结果,扔缓存里,一个key对应一个value,下次再有人查,别走mysql折腾600ms了。直接从缓存里,通过一个key查出来一个value,2ms搞定。性能提升300倍。
这就是所谓的高性能。 -
高并发
所以要是你有个系统,高峰期一秒钟过来的请求有1万,那一个mysql单机绝对会死掉。你这个时候就只能上缓存,把很多数据放缓存,别放mysql。缓存功能简单,说白了就是key-value式操作,单机支撑的并发量轻松一秒几万十几万,支撑高并发so
easy。单机承载并发量是mysql单机的几十倍
在项目里用缓存支持高性能,有些复杂的查询,复杂的查询很耗时,所以把结果放在缓存,用到就可以直接在缓存里查,增强用户体验。 -
常见的缓存问题:
1)缓存与数据库双写不一致 2)缓存雪崩 3)缓存穿透 4)缓存并发竞争
redis都有哪些数据类型? -
(1)string
这是最基本的类型了,没啥可说的,就是普通的set和get,做简单的kv缓存 -
(2)hash
这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在redis里,然后每次读写缓存的时候,可以就操作hash里的某个字段。
-
(3)list
有序列表 -
(4)set
无序集合,自动去重 -
(5)sorted set
排序的set,去重但是可以排序 -
redis的过期策略都有哪些?内存淘汰机制都有哪些?
-
(1)设置过期时间
定期删除+惰性删除 -
(2)内存淘汰
allkeys-lru 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key -
如果redis要支撑超过10万+的并发,那应该怎么做?
主从架构 -> 读写分离