前言
-
Redis是什么?
redis是一种基于键值对(key-value)的NoSQL数据库。Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。 - Redis能做什么
在谈为什么需要redis之前,先要清楚redis可以做什么。
- 缓存。通过引入缓存加快数据的访问速度,降低后端数据源的压力。
- 排行榜。redis提供给列表和有序几何数据结构可以很方便的构建各种排行榜系统。
- 计数器。redis原生支持高性能的计数功能,可以为视频播放量、网页浏览数等提供支持。
- 消息队列。redis提供发布订阅功能。
Redis的特性
- 高效性:Redis读取的速度是110000次/S,写的速度是81000次/S。
- 原子性:对每一条数据操作要么成功,要么失败。
- 支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)。
- 稳定性:redis支持各种架构,主从复制,哨兵模式,redis集群。
- 其他特性:支持过期时间,支持事务,消息订阅。
Redis数据类型与命名
(一)Redis中的数据类型
- string 字符串,类似于Java的字符串,同时支持数值类型的操作。
- list 列表类似于 ArrayList 。
- hash 类似于HashMap 类似于hash散列表,对应key,value对的数据类型。
- set 类似于hashSet 对数据进行去重,不会对数据进行排序操作。
- zset 类似于 linkedHashSet 对数据进行排序操作。
(二)Redis 操作命令
启动并进入Redis客户端:
#启动Redis cd /export/servers/redis-3.2.8 src/redis-server redis.conf #连接并进入Redis客户端 cd /export/servers/redis-3.2.8 src/redis-cli -h node01
Redis的对Key和对几种数据类型的操作请参阅以下网址:
https://www.runoob.com/redis/redis-intro.html
Redis缓存击穿
缓存击穿,是指用户请求的Key的数据不在Redis的缓存当中,最终只能去后端的数据库中查找请求的数据。当这种请求特别多是会对后端数据库造成很大的压力。产生的原因可能是我们设置的Key不合理,没有将所有的热点Key缓存到Redis当中来。我们可以使用Redis计数器,每次查询数据的Key都可以通过计数器来记录,判断哪些数据是热点Key数据,保存到Redis里面去。
Redis缓存雪崩
缓存雪崩就是我们的缓存是在同一时间创建(如天猫双十一),然后设置的缓存时间是一置的, 这样到特定的时间就会出现缓存雪崩的情况, 此时若是有当访问量的操作就会造成数据库服务器的压力过大。
Redis的四种架构
(一)单机版本
仅使用一台服务器,直接安装一个Redis就可以了。通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。
(二)Replication架构
Replication(主从复制)架构避免了单点故障导致数据丢失的问题,通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器中的数据,我们称被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。主从复制架构的主节点(master)支持读写操作,从节点(slave)只支持读取操作,主从复制架构不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
(三)Sentinel模式
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
一台主节点,多台从节点,但是启动哨兵监控程序,可以监控主节点宕机问题,实现主节点故障自动转移。
(四)Redis集群模式
以上三种模式都没有实现Redis的横向扩展的问题。
Redis集群专门用于解决redis横向扩展的问题。数据可以在多个Redis节点间自动分配的。Redis集群并不支持同时处理多个键的 Redis 命令,因为这需要在多个节点间移动数据,会降低redis集群的性能,在高负载的情况下可能会导致不可预料的错误。Redis集群在分区期间也能提供一定程度的可用性,即当某些节点发生故障或无法通信时,集群能够继续运行。
Redis 集群的优势:
- Redis可以使用所有机器的内存,变相扩展性能;
- 缓存永不宕机:启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点发生故障或无法通信的情况下能够继续处理命令;
- 使Redis的计算能力通过简单地增加服务器得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长;
- Redis集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈;异步处理数据,实现快速读写。
- 异步处理数据,实现快速读写。