1.什么是Redis
Redis是一种基于键值对(key-value)的NoSQL数据库。与很多键值对数据库不同的是,Redis中的value可以由String(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)等多种数据类型组成,同时同一种的数据类型可能有不同种编码形式,因此Redis可以满足很多的应用场景。
虽然Redis可以作为数据库,但是Redis相比于MySQL来说,Redis存储的能力很小。
Redis主要作为缓存而被程序员广泛使用和称赞。
2.Redis的特性
Redis受到程序员们的青睐,是因为Redis具有以下特性:
2.1速度快
Redis执行命令的速度非常快,造成Redis速度快可以归结于以下几点:
1.Redis所有的数据都是存放在内存中的,而从内存中读取数据的熟读是很快的(相比于读硬盘来说,从MySQL获取信息就是读硬盘的操作)
2.Redis的核心功能都是比较简单的操作内存中的数据结构
3.从网络上讲,Redis采用了IO多路复用的方式(后续我们详细讲)
4.Redis使用单线程模型,避免了多线程之间的冲突和竞争问题(虽然Redis在6.0版本引入了多线程机制,但主要用于处理网络和IO,不涉及到数据命令,即命令的执行任然采用单线程的模式)
2.2基于键值对的数据结构的服务器
Redis是一个客户端-服务器结构的程序!Redis主要提供了5种数据结构:字符串(String),哈希(hash),列表(list),集合(set),有序集合(zset)方便存储不同类型的数据。
2.3丰富的功能
Redis提供了许多额外的功能:
1.提供了键过期功能,可以用来实现缓存
2.提供了发布订阅功能,可以用来实现消息系统
3.支持Lua脚本,可以利用Lua创造出新的Redis命令
4.提供了简单的事务功能,能在一定程度上保证事务特性
5.提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销
2.4简单稳定
Redis的简单主要体现在三个方面:
1.Redis的源码相对于很多NoSQL数据库的源码要少很多
2.Redis采用单线程模型,不需要考虑多线程之间的竞争问题
3.Redis自己实现了事务处理的相关功能
2.5客户端语言多
Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入Redis,例如C,C++,Java,PHP,Python,NodeJS等
2.6持久化
通常来看,将数据存放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化的方式:RDB和AOF,即可以使用两种策略将内存中的数据保存到硬盘中,这样就保证了数据的可持久化
2.7主从复制(Replication)
Redis提供了复制功能,实现了多个相同数据的Redis副本(Replica),复制功能是分布式Redis基础,主节点挂,从节点将会变为主节点
2.8高可用和分布式
Redis提供了高可用实现的Redis哨兵(Redis Sentinel),能够保证Redis节点的故障发现和故障的自动转移。也提供了Redis集群(Redis Cluster),是真正的分布式实现,提供高可用,读写和容量的扩展性
3.Redis的使用场景
3.1Redis可以做什么
1.Redis可以作为数据库
2.Redis可以作为缓存,存取部分数据(热点数据),全量数据在MySQL中
3.Redis可以进行会话存储
4.Redis可以作为消息队列
3.2Redis不可以做什么
1.Redis不可以存储大规模的数据
Redis是存放在内存中的,虽然内存已经足够便宜,但是如果数据量足够大,使用Redis来存储,是一个无底洞,经济成本非常高
2.Redis不可以存冷数据
数据分为冷热数据,热数据通常指需要频繁操作的数据,反之为冷数据。如果将冷数据存放在Redis上,基本是对内存的一种浪费,但是对于热数据存放在Redis中加速读写,也可以减轻后端存储的负载
3.3Redis的使用场景
1.缓存
合理使用缓存不仅可以加速数据的访问速度,而且能够有效地降低后端数据源的压力
2.排行榜系统
Redis提供了列表和有序集合的数据结构,合理使用这些数据结构可以很方便地构建各种排行榜系统
3.计数器应用
Redis天然支持计数功能而且技术的性能非常好,可以说是计数器系统的重要选择
4.社交网络
由于社交网站的访问量比较大,而传统关系类型的数据库不太适合存储一些类型的数据,Redis提供的数据结构可以相对比较简单容易实现赞/踩,粉丝,共同好友等功能
5.消息队列
Redis提供发布订阅功能和阻塞队列功能,虽然和专业的消息队列相比还不够强大,但是对于一般的消息队列的功能基本可以满足