什么是Redis?简述它的优缺点?
Redis(Remote Dictionary Server)本质上是一个Key-Value类型的基于内存的一种非关系型数据库。整个数据库都是加载到内存中进行操作的。定期通过异步操作把数据库flush到硬盘上进行保存。
- 高性能:由于redis是基于内存的,所以对数据的处理非常快。
- 丰富的数据类型:redis支持String、List、Set、Hash、Zset数据类型。
- redis支持持久化。
正因为redis是基于内存的,所以它会受到物理内存的限制,不能用作海量数据的高性能读写。
Redis和Memcached相比有哪些优势?
- Memcached所有的值均是字符串,redis支持更为丰富的数据类型。
- redis的速度比Memcached快。
- redis可以支持持久化。
- redis是单线程,并发时串行执行。
- redis在3.0后提供集群环境。
Redis支持哪几种数据类型?
String、List、Set、Zset、Hash。
Redis有哪几种数据淘汰策略?
当redis内存不足时,会选择数据淘汰策略,分为以下几种:
- volatile-lru: 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
- volatile-ttl: 从已设置过期时间的数据集中挑选将要过期的数据。
- volatile-random: 从已设置的过期时间的数据集中随机挑选数据淘汰。
- volatile-lfu: 从已设置的过期时间的数据集中挑选使用频率最低的数据淘汰。
- allkeys-lru: 从数据集中挑选最近最少使用的数据淘汰。
- allkeys-random: 从数据集中随机挑选数据淘汰。
- allkeys-lfu: 从数据集中挑选使用频率最低的数据淘汰。
- no-enviction: 禁止淘汰数据。默认策略。当内存不足时,新写入数据时会报错。
一个字符串类型的值最大存储容量是多少?
512M
为什么redis需要把所有数据放到内存中?
首先,redis为了将读写速度最大化,将数据读取到内存中,之后通过异步的方式将数据写入磁盘。正因为这样,redis才会具有快速和持久化的特征。
Redis集群的几种实现方案?
客户端分片
- 由客户端决定key写入或者读取的节点。
- 包括jedis在内的一些客户端,实现了客户端分片机制。
优点
- 简单,性能高
缺点
- 业务逻辑与数据存储逻辑耦合。
- 可运维性差。
- 多业务各自使用redis,集群资源难以管理。
- 不支持动态增删改查。
基于代理的分片
- 客户端发送请求到一个代理,代理解析客户端的数据,将请求转发至正确的节点,然后将结果回复给客户端。
- 开源方案:Twemproxy、codis
特点
- 透明,接入Proxy的逻辑和存储的逻辑是隔离的。
- 代理层多了一次转发,性能有所损耗。
路由查询
- 将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行。
- 开源方案:Redis-cluster。
Redis有哪些适合的场景?
-
会话缓存(Session Cache)
Redis提供持久化。 -
全页缓存(FPC)
Magento提供一个插件来使用Redis作为全页缓存后端。 -
队列
Redis有提供多种数据结构,其中List可以作为队列。 -
排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。
Redis支持的Java客户端有哪些?
Redisson、Jedis、lettuce等,推荐Redission。
说说Redis哈希槽的概念?
Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。使用哈希槽的好处是可以方便的增加和删除节点。
Redis事物相关命令?
MULTI、EXEC、DISCARD、WATCH
Redis的过期时间和永久有效怎么设置?
EXPIRE和PERSIST命令。
什么是缓存穿透?如何避免?什么是缓存雪崩?如何避免?
缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,导致数据库的压力增大。
解决
1.增加接口层校验,id做基础校验,id<=0的数据拦截掉。
2.对于缓存和数据库都没有的数据,可以将key-value设置为key-null,并且有效时间设置短一些。
缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据,高并发情况,读缓存数据没读到,从而不断读取数据库,导致数据库的压力增大。
解决
1.设置热点数据永远不过期。
2.加互斥锁。
缓存雪崩
缓存雪崩是指缓存中大量数据过期,给后端系统带来很大的压力,导致系统崩溃。
解决
1.缓存数据的过期时间设置为随机,防止同一时间大量数据过期。
2.在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
3.做二级缓存。
redis主从复制如何实现的?
主从复制实现:主节点将自己内存中的数据做一份快照。将快照发送给从节点,从节点数据恢复到内存中。之后在每次增加新数据的时候,主节点以类似于mysql的二进制日志方式将语句发送给从节点,从节点拿到主节点发送过来的语句进行更新。
redis持久化,优缺点?
RDB:在不同的时间点将数据生产的快照同步到磁盘上,内存到硬盘的快照,定期更新。 缺点:耗时,耗性能,易丢失。
AOF:将redis所执行过的指令记录下来,在下次redis重启时,只需要执行指令就可以。 缺点:体积大,恢复速度慢。
redis过期策略都有哪些?
定时删除
- 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。
- 优点:保证内存被尽快释放。
- 缺点:
1.若过期key很多,删除这些key会占用很对的cpu时间,在cpu时间紧张的情况下,cpu不能把所有的时间用来其他的事情。
2.定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器,影响性能。
惰性删除
- 含义:key过期的时候不删除,每次数据库获取key的时候去检查是否过期,若过期,则删除。
- 优点:删除操作只发生在从数据库取出key的时候,而且只删除当前key,所以对cpu时间的占用比较少。
- 缺点:若大量的key在超出时间后,很久一段时间内,都没有获取过,可能发生内存泄漏。
定期删除
- 含义:每隔一段时间执行一次删除。
- 优点:
1.通过限制删除操作的时长和频率,来减少删除操作对cpu时间的占用,解决了定时删除的缺点。
2.定期删除过期key,解决了惰性删除的缺点。