什么是redis?
edis简介(Remote dictionary Server 远程字典服务器):
Redis是开源免费的,由C语言编写的,数据存放在内存,并支持持久化的Nosql数据库,是一种内存数据库,所以它读写速度非常快,主要应用在数据缓存方向。Redis 也经常用来做分布式锁,甚至是消息队列。
Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案
缓存数据处理流程
大致流程:
命中缓存就返回
缓存没命中,去数据库检查数据是否存在
数据库存在的话,更新缓存,返回数据
数据库不存在,返回空数据
redis具备的基本特征:
支持多数据类型
持久化机制
主从同步
redis关于key-value的三大特点:
redis是支持持久化的!我们可以控制数据何时、用何种方式保存到磁盘中,每次重启再次加载该文件,可以完成数据恢复。
redis不单单支持简单的key-value数据类型,同时还可以提供list、set、hash、zset等数据类型的存储
支持数据的备份。mater-slave模式,即,当下时髦的主从复制读写分离。
应用场景:
内存存储的持久化: 虽然redis是单线程实现的,但是支持异步将数据持久化到硬盘上,同时不影响继续服务。
发布订阅:Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。
定时器、计时器: 我们可以把这个特性用到发短信的服务中,每次发送完短信后,就进入倒计时。在指定的时间内拒绝发送第二次,可以有效的缓解短信服务的压力,节流。
取出最新的N个数据的操作: 比如新浪微博的评论系统,他要展示最新的10条评论,就是把最新的10条评论的id放到redis的list里面。
redis为什么这么快?
完全基于内存,绝大部分请求是纯粹的内存操作,非常快速;
数据结构简单,对数据操作也简单,比如SDS;
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
使用多路 I/O 复用模型,非阻塞 IO。
分布式缓存常见的技术选型? Memcache 与 Redis区别
分布式缓存的话,使用的比较多的主要是 Memcached 和 Redis。不过,现在基本没有看过还有项目使用 Memcached 来做缓存,都是直接用 Redis。
Memcached 是分布式缓存最开始兴起的那会,比较常用的。后来,随着 Redis 的发展,大家慢慢都转而使用更加强大的 Redis 了。
redis和Memcached 的区别
分布式缓存主要解决的是单机缓存的容量受服务器限制并且无法保存通用的信息。因为,本地缓存只在当前服务里有效,比如如果你部署了两个相同的服务,他们两者之间的缓存数据是无法共同的。
共同点:
都是基于内存的数据库,一般都用来当做缓存使用。
都有过期策略。
两者的性能都非常高。
区别:
存储方式不同(持久化): Memcache 把数据全部存在内存之中,断电后会丢失,满了会报异常。Redis 所有数据加载在内存,但也会持久化到磁盘,保证数据的持久性(优势),满了会将不用的数据存放在磁盘上。
支持数据类型不同: Memcache 对数据类型支持相对简单,只支持 key-value 结构。Redis 有复杂的数据类型(功能更强)。
Memcached 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型。 (Redis 6.0 引入了多线程 IO )
过期数据删除策略不同:Memcached 过期数据的删除策略只用了惰性删除,而 Redis 同时使用了惰性删除与定期删除。
Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持。并且,Redis 支持更多的编程语言。
redis和mongodb区别
MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。
MongoDB 更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。
MySQL 在大数据量时效率显著下降,MongoDB 更多时候作为关系数据库的一种替代。
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构。
主要区别:
内存的管理机制:Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据;MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
持久化方式:mongodb的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。然后,mongodb就在这块区域里面进行数据修改,避免了零碎的硬盘操作。至于mmap上的内容flush到硬盘就是操作系统的事情了,所以,如果,mongodb在内存中修改了数据后,mmap数据flush到硬盘之前,系统宕机了,数据就会丢失。
mmap详解链接:http://www.cnblogs.com/techdoc/archive/2010/12/22/1913521.html
(mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件进行操作。
mmap 系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用。 read(),write()等操作。mmap并不分配空间, 只是将文件映射到调用进程的地址空间里, 然后你就可以用memcpy等操作写文件, 而不用write()了.写完后用msync()同步一下, 你所写的内容就保存到文件里了. 不过这种方式没办法增加文件的长度, 因为要映射的长度在调用mmap()的时候就决定了。)
redis所有数据都是放在内存中的,持久化是使用RDB方式或者aof方式。
mysql:无论数据还是索引都存放在硬盘中。到要使用的时候才交换到内存中。能够处理远超过内存总量的数据。
支持的数据结构不同:Redis 支持的数据结构丰富,包括hash、set、list等。MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
数据量和性能:当物理内存够用的时候,性能:redis>mongodb>mysql。当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。mongodb还是能够保证性能。
事务支持:Redis 事务支持比较弱,只能保证事务中的每个操作连续执行,mongodb不支持事务