redis原理

1.什么是redis?

   Redis 是一个基于内存的高性能key-value数据库。

2.Reids的特点  

   Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性

     能最快的Key-Value DB。

   Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。

   Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

 3.使用redis有哪些好处?   

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 
   (2) 支持丰富数据类型,支持string,list,set,sorted set,hash 
   (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 
   (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

4.redis相比memcached有哪些优势?   

   (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 
   (2) redis的速度比memcached快很多

(3) redis可以持久化其数据

5.Memcache与Redis的区别都有哪些?    

   1)、存储方式 Memecache把数据全部存在内存之中断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。 
   2)、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。 
   3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

6.redis常见性能问题和解决方案:   

   1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

   2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久

    化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次

   3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

   4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

 7. mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

    相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6种数据淘汰策略:

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据

数据一致性保证 Redis集群尽可能保证数据的强一致性,但在特定条件下会丢失数据,原因有两点:异步replication机制以及network partition。

Master以及对应的Slaves之间使用异步的机制,在节点failover后,新的Master将会最终替代其他的replicas:

write命令提交到Master,Master执行完毕后向Client返回“OK”,但由于一部分replication,此时数据还没传播给Slave;如果此时Master不可达的时间超过阀值,此时集群将触发对应的slave选举为新的Master,此时没有replication同步到slave的数据将丢失。 

在network partition时,总有一个窗口期(node timeout)可能会导致数据丢失:

由于网络分区,此时master不可达,且Client与Master处于一个分区,且此时集群处于“OK”。此时Failover机制,将其中一个Slave提升为新的Master,等待网络分区消除后,老的Master再次可达,此时节点被切换为Slave,而在这段期间,处于网络分区期间,Client仍然将write提交到老的Master,因为该Master被认为是仍然有效的。当老的Master再次加入集群,被切换成Slave后,这些数据将永远丢失。

原文地址:https://www.cnblogs.com/UncleWang001/p/9727933.html

时间: 2024-08-12 11:38:19

redis原理的相关文章

Redis原理与实践总结

Redis原理与实践总结 本文主要对Redis的设计和实现原理做了一个介绍很总结,有些东西我也介绍的不是很详细准确,尽量在自己的理解范围内把一些知识点和关键性技术做一个描述.如有错误,还望见谅,欢迎指出. 这篇文章主要还是参考我之前的技术专栏总结而来的.欢迎查看: 重新学习Redis https://blog.csdn.net/column/details/21877.html 使用和基础数据结构(外观) redis的基本使用方式是建立在redis提供的数据结构上的. 字符串 REDIS_STR

Redis原理篇

Redis原理篇 1.发布 订阅模式 1.1列表 的局限 ? 前面我们说通过队列的 rpush 和 lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用 lpop 查看 List 中是否有等待处理的消息(比如写一个 while 循环).为了减少通信的消耗,可以 sleep()一段时间再消费,但是会有两个问题: 1.如果生产者生产消息的速度远大于消费者消费消息的速度,List 会占用大量的内存. 2.消息的实时性降低. list 还提供了一个阻塞的命令:blpop,没有任何元素可以

Redis 系列(04-2)Redis原理 - 内存回收

目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2.1 最大内存设置 2.2 淘汰策略 2.4 LFU Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 相关文档推荐: Redis - LRU Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收.内存回收主要分为两类,一类是 key 过期,

Redis原理详解

Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的: 首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type 代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:typ

Redis原理及基本应用

CAP定理: C:Consistency 一致性,分布式系统中数据备份节点都需要实时保持数据一致性: A:Availability 可用性,集群中有节点发生故障,并不影响整个集群对外提供服务: P:Partition tolerance 分区容错性,系统数据部分丢失后,仍能提供服务. 在一个分布式系统中,CAP三者不能兼得:高可用.数据一致是很多系统设计的目标,但是分区的现象是不可避免的事情: CA:分区的现象是始终存在的,一般得CA系统指的是在各分区后的子分区内保持CA: CP:系统保持强一致

memcache、redis原理对比

一.问题: 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 (这里仅从数据缓存方面考虑,当然,后期可以采用Hadoop+HBase+Hive等分布式存储分析平台) 三.主流解Cache和数据库对比: 上述技术基本上代表了当今在数据存储方面所有的实现方案,其中主要涉及到了普通关系型数据库(MySQL/PostgreSQL),NoSQL数据库(MongoDB),内存数据库(Redis),内存Cache(

Redis 原理

线程IO模型 Redis 是个单线程程序!(对外网络请求服务) 对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿. 使用缓冲区,事件轮询 API(Linux操作系统提供的select,poll,epoll),非阻塞 IO(能读多少读多少,能写多少写多少,读方法和写方法都会通过返回值来告知程序实际读写了多少字节). 注:epoll无须遍历整个被侦听的描述符集(fd),只要遍历那些被内核IO事件异步唤醒的描述符集合,select与poll是全轮询.

redis分布式锁原理

举例子:秒杀方式看医生,一个人看5min 1.第一次只允许一个人直接进行来,X10:00:00进去了,setNX(roomid,now+5min),出来时间假如是10:05:00 2.时间到了10:05:00,3个人同时进来,需要去看墙上的钟表,一个人一个的看 A进入病房看到,看到钟表时间10:05:00,得到时间10:05:00,看完时候的时间是10:05:01 B进入病房看到,看到钟表时间10:05:01,得到时间10:05:01,看完时候的时间是10:05:02 C进入病房看到,看到钟表时

redis入门

redis是什么 对于redis是什么的问题,比较好回答,它就是一个非关系型数据库,一个NoSql数据库.但是架构着对于redis的定位不同,决定了它在系统中会担任不同的角色.因为它的存储数据模型是Key-Value的模式,所以有的系统就作为一个存储的系统来使用.另外redis的数据存在内存中,有的项目就将redis作为一个高速缓存来使用.因为放在内存中的数据的读取肯定是要比硬盘上(其他关系型数据库都是写在磁盘上的)读写速度快. redis的适用场合 1.redis服务器直接作为数据库使用,应用