- redis有哪些优缺点? 优点:
- 读写性能优异,redis读的速度可达11万次/s,写的速度是8万1千次/s
- 支持数据持久化,有AOF和RDB以及两种混合等三种持久化方式。
- 支持事务,redis所有的操作都是原子性的,同时redis还支持对几个操作后的原子性执行。
- 数据结构丰富,redis提供了五种基本数据结构以及三种特殊结构。
- 支持主从复制,主机会自动将数据同步到从机,实现读写分离。 缺点:
- 数据库容量受物理内存限制,不能作海量数据的高性能读写,因此redis的场景适用于较小的数据量和高性能操作的运算上。
- redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败。需要等待机器重启或者手动切换IP才能恢复
- 主机宕机,宕机前如果有数据未同步到从机,切换IP后还会引入数据不一致的问题,导致系统的可用性降低。
- redis比较难支持在线扩容,在集群容量达到上限时扩容会变得非常复杂,为避免这种问题,运维人员在上线时必须保证有足够的内存空间 2、redis的数据结构
- string 对整个字符串执行操作,对整数或者浮点数进行自增或者自减的操作。
- list 从两端压入或者弹出元素,对单个或者多个元素进行修剪,只保留一个范围内的元素
- set 添加、获取、移除单个元素,检查一个元素是否存在于集合中,计算交集、并集、差集,从集合里面随机获取元素
- zset 根据分值范围或者成员来获取元素,计算一个键的排名
- hash 添加、获取、移除单个键值对,获取所有键值对检查某个键是否存在
- hyperloglog 用来做基数统计(在线IP、UV)的算法,在输入元素的数量或者体积非常大时,计算基数所需的空间非常小。
- bitmap 通过一个bit位来表示某个元素对应的值或者状态,其中key就是对应元素本身。实际上底层也是操作字符串来实现。
- geo 可以将用户给定的地理位置信息存储起来,并对这些位置信息进行操作
3、什么是redis的缓存击穿、缓存穿透和缓存雪崩?
- 缓存击穿:redis存在一个key一直在扛着高并发,在这个key的失效的瞬间,持续的高并发就穿过缓存直接请求数据库,给数据库造成很大的压力 解决方案:1-让热点数据永不过期或者设定比较久的过期时间。2-加互斥锁
- 缓存穿透:redis的缓存没有被命中,于是像数据库查询,当访问量很大的时候就会给数据库造成很大的压力 解决方案:1-如果缓存没有命中,则在redis里面放置一个空缓存。2-使用布隆过滤器。
- 缓存雪崩:同时有大批量的redis数据过期,导致数据库压力突然变大 解决方案:1-异地多活。2-限流降级。3-数据预热,让数据失效的时间尽可能的均匀。
4、redis的内存淘汰策略 全局键空间选择性移除
- noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。
- allkeys-lru:当内存不足以容纳写入新数据时,在键空间中,移除最近最少使用的key(常用)
- allkeys-random: 当内存不足以容纳写入新数据时,在键空间中,随机移除某个key 设置过期时间的键空间过期性移除
- volatile-lru: 当内存不足以容纳写入新数据时,在设置了过期时间的键空间中,移除最近最少使用的key
- volatile-random: 当内存不足以容纳写入新数据时,在设置了过期时间的键空间中,随机移除某个key。
- volatile-ttl: 当内存不足以容纳写入新数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。