Redis简介
Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统。可以把它作为数据库,缓存和消息中间件来使用,支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglogs和geospatial indexes等数据类型。内建了复制,lua脚本,LRU,事务等功能,通过redis sentinel实现高可用,通过redis cluster实现了自动分片。以及事务,发布/订阅,自动故障转移。
Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存服务和消息中间件。
Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。目前由VMware主持开发工作。
Redis采用Key-Value型的基本数据结构,任何二进制序列都可以作为Redis的Key使用
Redis只有一个线程,所以Redis线程很安全;使用非阻塞式IO,使Redis的速度非常快 , Redis运行在内存中但是可以持久化到磁盘
Redis运行容量只能受限于内存的大小,rds和aof持久化与内存有关,只和磁盘空间有关
Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与储存需求。同时Redis的诸多高层级功能使其可以胜任消息队列、任务队列等不同的角色。
缓存中常见的问题:二八定律、热数据和冷数据、缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
一般常用的缓存服务器有Redis、Memcached等,
Redis作为NoSQL数据库的一种应用,响应速度和命中率上还是比较高效的。项目中需要用集中式可横向扩展的缓存框架,做了一点调研,即便redis、memcached存在效率上的差异(具体比较参考http://timyang.net/data/mcdb-tt-redis/),但其实都能满足目前项目的需求;但是redis还是比较风骚的,支持链表和集合操作,支持正则表达式查找key,目前项目缓存的结果大多是链表,如果链表新增或者修改数据的话,redis就体现出了极大的优势(memcached只能重新加载链表,redis可以对链表新增或者修改)
Redis是使用C/C++语言开发的,Redi数据库中的所有的数据都存放在内存中。由于内存的读写速度远快于硬盘。在普通笔记本电脑上可以一秒读写超过10万个键值。
Redis 具备 LRU 淘汰、事务实现、以及不同级别的硬盘持久化等能力,并且支持副本集和通过 Redis Sentinel 实现的高可用方案,同时还支持通过 Redis Cluster 实现的数据自动分片能力。
注意 : Redis提供数据定期自动持久化有两个方案 : RDB、AOF
Redis Java客户端 : Jedis、Redisson和lettuce
Redis 的主要功能都基于单线程模型实现,也就是说 Redis 使用一个线程来服务所有的客户端请求,同时 Redis 采用了非阻塞式 IO,并精细地优化各种命令的算法时间复杂度,这些信息意味着:
Redis 是线程安全的(因为只有一个线程),其所有操作都是原子的,不会因并发产生数据异常
Redis 的速度非常快(因为使用非阻塞式 IO,且大部分命令的算法时间复杂度都是 O(1))
使用高耗时的 Redis 命令是很危险的,会占用唯一的一个线程的大量处理时间,导致所有的请求都被拖慢。(例如时间复杂度为 O(N) 的 KEYS 命令,严格禁止在生产环境中使用)
Redis可以为每个键设置生存时间(Time To Live, TTL),生存时间到期后键会自动被删除。 Redis可以作为缓存系统来使用, Redis服务器默认是会使用6379端口。
Redis 的 5 种(存储节构)对象类型(字符串、哈希、列表、集合、有序集合)string、hash、lists(链表)、sets(集合)、sorted sets或者是ZSet(有序集合)
其中常见的数据结构类型有:String、List、Set、Hash、ZSet这5种。
-
有硬盘存储支持的内存数据库;
-
但自2.0版本以后可以将数据交换到硬盘(注意, 2.4以后版本不支持该特性!)
-
支持 sets(同时也支持 union/diff/inter)
-
支持将数据设置成过期数据(类似快速缓冲区设计)
-
Pub/Sub允许用户实现消息机制
Redis 内置了复制(Replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(Transactions) 和不同级别的磁盘持久化(Persistence),并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(High Availability)。
Redis 非常适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。
例如:股票价格、数据分析、实时数据搜集、实时通讯。
Redis 是单线程结构模型
Redis不使用表,他的数据库不会预定义或者强制去要求用户对Redis存储的不同数据进行关联。
Redis提供持久化的选项,这些选项可以让用户将自己的数据保存到磁盘上面进行存储。根据实际情况,可以每隔一定时间将数据集导出到磁盘(快照),或者追加到命令日志中(AOF只追加文件),他会在执行写命令时,将被执行的写命令复制到硬盘里面。您
redis-stat、RedisLive、redmon都是现成的redis监控工具,只能可视化指标不能监控,而基于redis_exporter以及grafana可以做到指标可视化以及监控报警,可以考虑集成到生产应用上。
数据库的工作模式按存储方式可分为:硬盘数据库和内存数据库。Redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度极快。
Redis常见命令 :
1、Flushdb命令 :用于清空当前数据库中的所有key
2、Flushall命令 :用于清空整个Redis服务器的数据(删除所有的key)
3、CONFIG :客户端连接后可配置服务器
4、flush all : 清空Redis里面 所有的缓存
Redis 缺点
1) Redis3.0后才出来官方的集群方案,但仍存在一些架构上的问题;
2.)持久化功能体验不佳——通过快照方法实现的话,需要每隔一段时间将整个数据库的数据写到磁盘上,代价非常高;而aof方法只追踪变化的数据,类似于mysql的binlog方法,但追加log可能过大,同时所有操作均要重新执行一遍,恢复速度慢;
3)由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
Redis 主要功能包括
-
交易
-
发布/订阅
-
Lua脚本
-
钥匙的生存时间有限
-
LRU驱逐钥匙
-
自动故障转移
Redis与其他key-value存储有什么不同?
1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3)Redis支持数据的备份,即master-slave模式的数据备份。
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
首先我们要定义一下对于Redis服务来说怎样才算是高可用,即在各种出现异常的情况下,依然可以正常提供服务。或者宽松一些,出现异常的情况下,只经过很短暂的时间即可恢复正常服务。所谓异常,应该至少包含了以下几种可能性:
【异常1】某个节点服务器的某个进程突然down掉(例如某开发手残,把一台服务器的redis-server进程kill了)
【异常2】某台节点服务器down掉,相当于这个节点上所有进程都停了(例如某运维手残,把一个服务器的电源拔了;例如一些老旧机器出现硬件故障)
【异常3】任意两个节点服务器之间的通信中断了(例如某临时工手残,把用于两个机房通信的光缆挖断了)
其实以上任意一种异常都是小概率事件,而做到高可用性的基本指导思想就是:多个小概率事件同时发生的概率可以忽略不计。只要我们设计的系统可以容忍短时间内的单点故障,即可实现高可用性。
搭建高可用Redis服务方案 :Keepalived,Codis,Twemproxy,Redis Sentinel。
其中Codis和Twemproxy主要是用于大规模的Redis集群中,也是在Redis官方发布Redis Sentinel之前twitter和豌豆荚提供的开源解决方案。我的业务中数据量并不大,所以搞集群服务反而是浪费机器了。最终在Keepalived和Redis Sentinel之间做了个选择,选择了官方的解决方案Redis Sentinel。
Redis Sentinel可以理解为一个监控Redis Server服务是否正常的进程,并且一旦检测到不正常,可以自动地将备份(slave)Redis Server启用,使得外部用户对Redis服务内部出现的异常无感知。我们按照由简至繁的步骤,搭建一个最小型的高可用的Redis服务。
Redis的优势
1)性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
2)丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3)原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
4)丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
5)因为使用非阻塞式IO,所以Redis的速度非常快
Redis 与其他 key - value 缓存产品的特点
1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3)Redis支持数据的备份,即master-slave模式的数据备份。
基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量级的提升),做简单的消息队列(LPUSH和BRPOP)、订阅发布(PUB/SUB)系统等等。规模比较大的互联网公司,一般都会有专门的团队,将Redis存储以基础服务的形式提供给各个业务调用。
不过任何一个基础服务的提供方,都会被调用方问起的一个问题是:你的服务是否具有高可用性?最好不要因为你的服务经常出问题,导致我这边的业务跟着遭殃。
对于搭建高可用Redis服务,网上已有了很多方案,例如Keepalived,Codis,Twemproxy,Redis Sentinel。其中Codis和Twemproxy主要是用于大规模的Redis集群中,也是在Redis官方发布Redis Sentinel之前twitter和豌豆荚提供的开源解决方案。我的业务中数据量并不大,所以搞集群服务反而是浪费机器了。最终在Keepalived和Redis Sentinel之间做了个选择,选择了官方的解决方案Redis Sentinel。
Redis Sentinel可以理解为一个监控Redis Server服务是否正常的进程,并且一旦检测到不正常,可以自动地将备份(slave)Redis Server启用,使得外部用户对Redis服务内部出现的异常无感知。我们按照由简至繁的步骤,搭建一个最小型的高可用的Redis服务。
搭建一个最小型的高可用的Redis服务方案
方案1:单机版Redis Server,无Sentinel
方案2:主从同步Redis Server,单实例Sentinel
方案3:主从同步Redis Server,双实例Sentinel
方案4:主从同步Redis Server,三实例Sentinel
更多介绍 :https://mp.weixin.qq.com/s/1UcZYc_yUJmA4exdMYB3uQ
Redis 应用场景:
最佳应用场景:适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。
例如:微博、数据分析、实时数据搜集、实时通讯等。
1、硬盘数据库的工作模式:
2、内存数据库的工作模式:
注意:Redis面试题 :什么是Redis、Redis常见的数据结构类型有哪些、Redis是如何进行持久化的等。
Redis内存统计
在客户端通过 redis-cli 连接服务器后(后面如无特殊说明,客户端一律使用redis-cli),通过 info 命令可以查看内存使用情况:info memory。
info 命令可以显示 Redis 服务器的许多信息,包括服务器基本信息、CPU、内存、持久化、客户端连接信息等等;