redis

1.redis是什么

redis是一个由c语言开发的、高性能的、非关系型的键值对数据库,可用于缓存、计数器、消息中间件、分布式锁

2.为什么使用redis(优点)

  1. redis支持多种数据类型,list set hash zset string
  2. redis性能高,由于纯内存操作,读写速度都非常快,可以达到10w/s的频率
  3. 在高并发的情况下,如果所有请求都连接数据库,数据库可能出现连接异常,这时使用redis做缓存,可以减小数据库压力。
  4. 支持数据持久化,RDB和AOF

3.redis有什么缺点

  1. redis不具备自动容错和恢复的功能,如果主机从机都宕机,会导致前端部分读写请求失败,需要等待机器重启或者手动在前端更改主机ip地址
  2. 主机发生宕机,宕机前可能有部分数据未能同步到从机,切换ip后还会引起数据不一致问题,降低了系统可用性。
  3. redis很难支持在线扩容,在集群容量达到上限后在线扩容会变得很复杂,这就需要运维人员在系统上线的时候准备足够的空间,这对资源造成了很大浪费
  4. redis是单线程的,单台服务器无法充分利用多核服务器的CPU

4.redis为什么这么快

  1. 纯内存操作
  2. 单线程操作,避免了频繁的上下文切换
  3. 采用非阻塞I/O多路复用机制

5.redis过期策略

定时删除:每个key都需要创建一个定时器,过期了就会清理key,对内存很友好,但是会占用cpu资源去处理过期的key
惰性删除:用到key的时候再去看是否过期,过期就清除,可以节省cpu资源,但是对内存不友好,可能存在大量过期的key没清理
定期删除:redis每秒会进行10次过期扫描,过期扫描不会遍历过期字典中的所有key,而是采用了贪心算法:从过期字典中随机取20个key删除,如果过期的key比率超过1/4就重复前面操作,同时为了防止扫描过度循环导致线程卡死,算法还增加了扫描时间上线,默认是25ms

6.如何配置定期删除执行时间间隔

redis的定时任务默认是10次/s,即每隔100ms执行一次,可以在redis.conf中修改该值(hz)
[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.khuydnimg.cn/c582d19749ddb71198de04bd58c7f529.png)https:/d/img-blog.csdnimg.cn/c582d19db71749d198de04bd58c7f529.png)]redis.conf中hz的值默认为10,提高它的值会更快地处理同时到期的key,更精确地处理过期,但是也会占用更多cpu。hz范围是1~500,通常不建议超过100,只有当请求延时非常低的情况下,才可以设置为100

7.redis内存淘汰机制

redis默认使用惰性删除+定期删除,如果我们一直没有使用该key,惰性删除也没有抽取到这些值,这些key在内存中堆积的越来越多,导致redis内存块耗尽。那么就可以采用内存淘汰机制。
redis内存淘汰机制有8中:
默认:
       1.noeviction:不进行淘汰数据,如果缓存被写满,再有请求进来,直接返回错误
在设置了过期的数据中淘汰:
      2.volatile-random:当内容不足以容纳新写入数据时,在设置了过期的键值对中,随机移除某个键值对
      3.volatile-ttl:当内容不足以容纳新写入数据时,在设置了过期的键值对中,移除即将过期的键值对
      4.volatile-lru:当内容不足以容纳新写入数据时,在设置了过期的键值对中,移除最近最少使用的键值对
      5.volatile-lfu:当内容不足以容纳新写入数据时,在设置了过期的键值对中,移除最不经常使用的键值对(历史访问评率)
在所有数据中淘汰:
      6.allkeys-random:当内容不足以容纳新写入数据时,在所有键值对中,随机移除某个键值对
      7.allkeys-lru:当内容不足以容纳新写入数据时,在所有键值对中,移除最近最少使用的键值对(这个是最常用的)
      8.allkeys-lfu:当内容不足以容纳新写入数据时,在所有键值对中,移除最不经常使用的键值对。

※ 什么时候会执行内存淘汰策略,内存占用率过高的标准是什么?

redis.conf配置文件中的 maxmemory 属性限定了 Redis 最大内存使用量,当占用内存大于maxmemory的配置值时会执行内存淘汰策略。

※ 内存淘汰策略的配置

内存淘汰机制由redis.conf配置文件中的maxmemory-policy属性设置,没有配置时默认为no-eviction模式。

※ 淘汰策略的执行过程

> 客户端执行一条命令,导致Redis需要增加数据(比如set key value);

> Redis会检查内存使用情况,如果内存使用超过 maxmemory,就会按照配置的置换策略maxmemory-policy删除一些key;

> 再执行新的数据的set操作;

8.RDB持久化机制的优缺点

优点:

  1. 冷备份,RDB会生成多个数据文件,每个文件代表某个时刻的redis数据,这种多个数据文件的方式非常适合做冷备。可以将文件存储到云端、本地磁盘等。
  2. 读写性能高,RDB机制对redis对外提供读写服务时的影响很小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行IO操作来进行RDB的持久化即可
  3. 数据恢复快,相对于AOF来说,可以直接基于RDB数据文件来重启和恢复redis线程,更加快速

缺点:

  1. 丢失数据,如果redis故障时想要尽可能少的丢失数据,那RDB没有AOF好,一般来说,RDB每隔五分钟甚至更久生成一次快照,如果在这段时间内主机宕机,那么会丢失最近五分钟的数据。
  2. RDB影响性能,RDB每次在fork子进程执行快照文件生成的时候,如果数据文件特别大,可能会导致客户端提供的服务暂停数毫秒甚至数秒。

9.AOF持久化机制的优缺点

优点:

  1. 保护数据,AOF可以更好的保护数据不丢失,一般AOF隔1秒执行一次fsync操作,最多丢失1秒的数据。
  2. 写入性能高,AOF日志文件以append-only模式写入,所有没有任何磁盘寻址的开销
  3. 灾难性误删除紧急恢复,AOF日志文件通过非常可读的方式记录,这个特性非常适合做灾难性误删除的紧急恢复。如果不小心使用flushall命令删除了数据,只要后台rewrite还没发生,就可以拷贝AOF日志文件,将flushall命令删除,再将AOF日志文件放回去,就可以通过恢复机制,自动恢复所有数据。

缺点:

  1. 数据快照文件大,对于同一份数据数据来说,AOF日志文件通常比RDB快照文件大
  2. 写QPS低,AOF开启后,支持的写QPS会比RDB支持的写QPS低
  3. 数据恢复时比较慢,不方便冷备,AOF唯一比较大的缺点就是数据恢复时慢,还有需要手写脚本去做冷备,不方便

10.AOF和RDB该怎么选择

不要只使用RDB,会导致很多数据丢失
不要只是用AOF,恢复数据的时候比较慢,还有就是使用RDB简单粗暴生成快照更加健壮,避免AOF复杂的备份和恢复机制的bug
AOF和RDB结合使用,既保证数据不丢失,还可以使用RDB做不同程度的冷备,在AOF文件丢失或损坏的时候也可以使用RDB来进行快速的数据恢复

11.AOF rewrite

redis中的数据是有限的,很多数据可能自动过期,可能被用户清理,可能被redis的内存淘汰机制清理,但这些数据对应的写日志还保存在AOF日志文件中,日积月累,AOF日志文件会很大。所以AOF每隔一段时间会在后台做rewrite操作,根据当前redis内存中的数据构建AOF日志文件,覆盖原来的文件,这样可以确保AOF日志文件不会过大,保存和redis内存数据量一致

12.redis相比memcached有哪些优势

  1. memcached所有值都是简单的字符串,redis作为其替代者,支持的数据类型更多
  2. redis速度比memcached快很多
  3. redis支持数据持久化

13.redis适用场景

  1. 会话缓存:redis最常用的场景是会话缓存(session cached)
  2. 全页缓存
  3. 队列
  4. 排行榜/计数器
  5. 发布/订阅

14.redis5种数据类型的应用场景

  1. String:缓存、计数器、对象存储缓存、限速
  2. List:消息队列、文章列表
  3. Hash:用户信息缓存
  4. Set:标签
  5. Zset:排行榜、工资单
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值