1、redis的优势?

  • 性能很好
  • 支持事务
  • 支持丰富的数据类型
  • 支持数据持久化

2、redis为什么这么快?

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

图1 redis线程模型

3、 redis 的持久化机制?

Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。
 实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。

  • RDB(快照,snapshotting): 全量持久化,是对 Redis 中的数据执行周期性的持久化。
  • AOF(只追加文件,append-only file,AOF):增量持久化,将每一个收到的写命令都通过Write函数追加到文件最后,类似于MySQL的binlog。

两种方式都可以把Redis内存中的数据持久化到磁盘上,然后再将这些数据备份到别的地方去,RDB更适合做冷备AOF更适合做热备,其中两种机制全部开启的时候,Redis在重启的时候会默认使用AOF去重新构建数据,因为AOF的数据是比RDB更完整的。

RDB:

  • RDB原理:当redis需要做持久化时,redis会fork一个子进程,子进程将数据写到磁盘上一个临时RDB文件中,当子进程完成写临时文件后,将原来的RDB替换掉(默认文件名为dump.rdb)
  • RDB优缺点:定时备份,Redis效率高,但是容易造成数据丢失,丢失的多少和备份策略有关,例如:5分钟备份一次,但是第8分时宕机了,那么就丢失了后面的3分钟数据

AOF:

  • AOF原理:AOF就可以做到全程持久化,Redis每执行一个修改数据的命令,都会把这个命令添加到AOF文件中,当Redis重启时,将会读取AOF文件进行“重放”以恢复到 Redis关闭前的最后时刻。
  • AOF优缺点:AOF基本可以保证数据不丢失,但是AOF持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。

RDB持久化方式:

save 900 1              #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。save 300 10             #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。save 60 10000          #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

AOF持久化三种方式:

appendfsync always     #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec   #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no         #让操作系统决定何时进行同步

4、redis的事务功能?

Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。

5、edis的过期策略以及内存淘汰机制?

(1)过期策略

  • 定期删除:redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载!
  • 惰性删除 :定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。这就是所谓的惰性删除,也是够懒的哈!

(2)redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?)

redis 提供 6种数据淘汰策略:

  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  4. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的).
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。

7、多机redis 的部署,如何保证数据一致的?

主从复制,读写分离
       一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。

8、哨兵(sentinel)模式的一些说明

(1) 注意事项

  • Sentinel会自动发现从节点,也就是我们只需要配置好监控的主节点,Sentinel会自己找到主节点的从节点,已经同样在监控主节点的其他Sentinel
  • 配置Sentinel节点个数一般大于3 且是奇数,如果只有2个,那么发生网络分区的时候只需要1票就可以认为节点down了,这个就很不合理了。

(2)配置

logfile "/var/log/sentinel.log"  #日志文件
bind 192.168.253.128   #监听的ip地址,根据节点不同进行调整
sentinel monitor mymaster 192.168.253.128 6379 2
#配置监控的主节点
#这个配置项格式为sentinel monitor <master-group-name> <ip> <port> <quorum>
#意义为监视一个名为mymaster的主节点(这里的mymaster可以自定义,主要是为了标识这个集群)
#主节点ip地址是192.168.253.128,端口为6379
#法定票数为2票。表示至少需要2个哨兵认为节点down了,才算down了。

(3)  运行

  • 第一种: redis-sentinel /path/to/sentinel.conf

  • 第二种: redis-server /path/to/sentinel.conf --sentinel

以上两种方式,都必须指定一个sentinel的配置文件sentinel.conf,如果不指定,将无法启动sentinel。sentinel默认监听26379端口,所以运行前必须确定该端口没有被别的进程占用。

9、redis缓存三大问题

(1)缓存穿透

,    由于缓存中不存在,然后再前往数据库中查询。由于该数据压根就不存在,因此数据库也返回空。数据库压力剧增,可能会导致系统崩溃。

下面来介绍两种防止缓存穿透的手段。

  • 方案一:将数据库查询结果为空的key也存储在缓存中。当后续又出现该key的查询请求时,缓存直接返回null,而无需查询数据库。
  • 方案二:在缓存之前再加一道BloomFilter,用来过滤该key值。

方案选择:对于空数据的key各不相同、key重复请求概率低的场景而言,应该选择第二种方案。而对于空数据的key数量有限、key重复请求概率较高的场景而言,应该选择第一种方案。

(2)缓存雪崩

缓存因某种原因发生了宕机,那么原本被缓存抵挡的海量查询请求就会像疯狗一样涌向数据库。此时数据库如果抵挡不了这巨大的压力,它就会崩溃。

解决方案:  Redis Sentinel 和 Redis Cluster 都可实现服务的高可用。

(3)缓存击穿

对于一些请求量极高的热点数据而言,一旦过了有效时间,此刻将会有大量请求落在数据库上,从而可能会导致数据库崩溃。

下面来介绍两种防止缓存击穿的方法。

  • 互斥锁 (mutex key):这种方案思路比较简单,但是存在一定的隐患,如果构建缓存过程出现问题或者时间较长,可能会存在死锁和线程池阻塞的风险,但是这种方法能够较好的降低后端存储负载并在一致性上做的比较好。
  • ” 永远不过期 “:这种方案由于没有设置真正的过期时间,实际上已经不存在热点 key 产生的一系列危害,但是会存在数据不一致的情况,同时代码复杂度会增大。

10、redis应用场景?

(1)缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

(2)排行榜
      很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。

(3)计数器
      什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

(4)分布式会话
      集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

(5)分布式锁
       在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

(6) 社交网络
       点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。

(7)最新列表
       Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。

(8)消息系统
       消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。

Redis教程:常见问题分析相关推荐

  1. Redis教程:NoSQL键值存储

    课程大纲 Redis是使用ANSI C编写的具有可选持久性的开源,网络化,内存中键值数据存储.根据DB-Engines.com的月度排名,Redis是最受欢迎的键值存储. 它的名字意思是远程字典服务器 ...

  2. 【LiteOS】LiteOS移植常见问题分析

    LiteOS移植常见问题分析 1.CMSIS版本导致的问题 2.无法下载和调试代码 3.没有重定向printf导致程序死掉 4.关于OS是否托管中断 5.关于时间片轮转 6.其他问题 发现很多人在Li ...

  3. 【linux系列】内核编译最新教程+常见问题总结

    [linux系列]内核编译最新教程+常见问题总结 编译环境 环境准备 编译准备 修改配置 linux 提供的三种配置命令 使用 gconfig 配置 编译内核 安装内核 载入新内核 检查内核 常见问题 ...

  4. mysql cluster 缩容_分布式常见问题分析及解决方案

    1.分布式和集群概念 分布式:可以简单理解成将一个独立的系统拆分成很多个子系统,每个子系统可以单独的运行(比如用户登录.订单支付),这个称之为分布式系统. 集群:可以简单理解就是对于任何一个系统至少部 ...

  5. 【JY】YJK前处理参数详解及常见问题分析(五):风荷载信息

    点击蓝字  求求关注 [风荷载信息详解] 一.基本参数 A区参数详解 1.执行规范 选择所执行的规范. 2.地面粗糙度类别 分为A.B.C.D四类. 3.修正后的基本风压 这里所说的修正后的基本风压, ...

  6. Unity_IL2CPP常见问题分析

    Unity 打包il2cpp模式时的常见问题分析 Unity 编辑器模式下是采用.net 虚拟机解释执行.net 代码,发布的时候有两种模式,一种是mono虚拟机模式,一种是il2cpp模式.由于iO ...

  7. pda找不到服务器,PDA连不上服务器常见问题分析.doc

    PDA连不上服务器常见问题分析.doc PDA连不上服务器常见问题分析 请查看PDA的网络通不通,可以先检查WIFI/3G是否连接上网络,如果连接不上,点击PingToots工具,用"pin ...

  8. Redis源码分析:基础概念介绍与启动概述

    Redis源码分析 基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容.仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是<Redis设计与 ...

  9. redis源码分析(beta版本)-redis实现的概述逻辑

    redis概述 redis作为一个高性能的kv数据库,基于c语言实现,数据主要基于内存存放,所以查询效率较高,并且支持较多的数据类型有字符串.字典.列表与集合等数据结构.另外redis叶支持持久化的日 ...

  10. Web开发常规调试方法与常见问题分析

    一.Web项目基本原理 现在的web项目大都已经前后端独立开发与部署. 前后端独立开发,一般是前端与后端通过web接口(常见的有RESTful与websocket)文档进行交流.前端开发人员先更具业务 ...

最新文章

  1. 前端新手学习记录2 -使用vscode编写个人网站首页
  2. ubuntu下scp批量拷贝文件不需要输入密码
  3. android自定义弹框效果合集,android 自定义弹出框AlertDialog ,很炫的哦
  4. 使用 SAP BTP 创建一个 Spring Boot Java 应用
  5. 程序自删除方法大总结
  6. RCON 服务器命令协议
  7. 用户启动计算机并登录win7,win7电脑设置开机登录界面的方法?
  8. Coin3D三维可视化教程1
  9. 软件需求说明书/ 概要设计说明书/项目开发计划/详细设计说明书模版(说明要点及要点解释)
  10. Faster RCNN详解
  11. docker CEEE版本centos安装
  12. html5禁用浏览器下拉,禁止ios浏览器页面上下滚动 (橡皮筋效果)
  13. 风变python多少钱_请问风变编程Python值得购买吗?
  14. 互联网大数据时代下亚马逊是如何解决数据存储的
  15. eth入门之web2 与 web3 的对比
  16. oracle容灾是什么意思,谈谈容灾
  17. 深度学习 基础硬件CPU GPU知识笔记
  18. 浩辰3D制图软件中用零件族实现多配置!
  19. mysql server 卸载不了_Mysql卸载问题Start Server卡住报错解决方法
  20. 光猫修改配置同步到服务器,光猫—防火墙—3台服务器防火墙需要怎么配置,防火墙做二层?...

热门文章

  1. html 音频格式,html5中audio支持音频格式
  2. Finding all unique triplets that sums to zero[部分转载]
  3. 分数等级_山东新高考:quot;6选3quot;等级考分数是怎么换算出来的
  4. 卡巴2009与word冲突完美解决方案,经测试几十台计算机全部通过
  5. RHEL5 下构建PPTP ***服务器
  6. Biztalk 调用带Soap Head WebService的方法
  7. 2021-05-06 git 设置XX门8580端口代理访问github
  8. 我想批量删除专题内最古老的100篇文章
  9. SURF算法学习心得
  10. 使用python制作ArcGIS插件(5)其他技巧