关于Redis的一些小结
属于小白的一些对redis的理解
1、Redis是什么?
以我的理解:redis就是用C语言写的一种高速的缓存数据库,能够存储多种数据类型的数据库。
2、Redis 的特点:
使用C/S模型,
单进程单进程模型,
存储多种数据类型(String,list,hash,set,zset(有序集合))
支持数据持久化
支持高并发读写
3、Rredis的使用场景
记录帖子的点赞数,点击数,评论数,
消息队列,实时排行榜等等。
4、Redis的数据类型及主要特性
Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:String类型、哈希类型、列表类型、集合类型和顺序集合类型。
- String类型: 它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。
- 列表类型(List): List列表类型,是最简单的列表类型,你可以把这个列表看作是一个队列,可以从左边插入元素,也可以从右边插入元素。
- Hash类型: 该类型是filed和value关联组成的map,其中file和value都是字符串类型,每个hash可以存储四十多亿个键值对。
- 集合类型(set): 该集合是装有String类型的无序集合,该集合是通过哈希表实现的,所以添加,删除,查询的复杂度都是0(1)。
//注意:sadd key member
//添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。
127.0.0.1:6379> sadd name zhangsan
(integer) 1
127.0.0.1:6379> sadd name lisi
(integer) 1
127.0.0.1:6379> sadd name wangwu
(integer) 1z
127.0.0.1:6379> sadd name wangwu
(integer) 0
127.0.0.1:6379> smembers name
1) "zhangsan"
2) "lisi"
3) "wangwu"
- 顺序集合类型(zset): 该集合是装有String类型的有序集合,且不允许有重复的元素出现,但是该集合中的每一个元素都会关联一个double类型的分数,redis中通过该分数来为集合中的元素进行从小到大的排序,zset中的元素是唯一的,但是分数是可以重复的,如果该元素在集合中存在,则会进行覆盖,并更新分数。
5、Redis 为什么是单线程的?
因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。
关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。
而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。
6、Redis的缓存雪崩
假设有一台服务器,每天高峰处理请求每秒一万个,但是缓存服务突然发生意外宕机了,缓存服务直接挂了,此时这每秒一万个请求全部打在了数据库上,数据库必然扛不住,它会报一下警,然后直接挂掉,如果没有什么方案进行解决,数据库就会很着急,不断重启数据库,重启之后又被新的数据打死。这就是缓存雪崩。
缓存雪崩的前中后的解决方案:
使用redis之前:实现redis 高可用,使用主从 + 哨兵模式, redis cluster,避免雪崩。
使用redis之中:使用本地缓存ehcache 和 hystrix(熔断) 限流&降级,避免mysql被打死。也就是说他会先查找本地缓存,再去查redis的缓存,如果都没有查到,就回去查询数据库,再将结果写入到两个缓存中,限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,就走降级处理,可以返回一些 默认的值,友情提示等等。
使用redis之后:redis持久化,一旦服务器重启,立马从磁盘中加载数据,快速恢复数据。
7、Redis的缓存穿透
假设有一台服务器,现在有一万个请求访问,其中九千个请求是黑客发起的请求,这些请求在缓存查不到,去数据库中查,也查不到,这样就会不经过缓存直接访问数据库,这种恶意的访问就会把数据库打死。
缓存穿透的解决方案:
只要服务器每次从数据库没查到数据库,就写一个空值到缓存中去,并设置过期时间,这样每次有相同的key过来访问的时候,在缓存失效之前,就可以从缓存中获取数据。
8、Redis的缓存击穿
缓存击穿也就说,很多用户访问热点数据的时候,访问的非常频繁,这样在集中式高并发的情况下,当访问的Key处于某个点失效了,大量的请求就击穿了缓存,直接访问到了数据库。
缓存击穿的解决方案:
将某一些热点数据设置会永不过期,或者是基于redis实现分布式锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
9、关于Redis的模式
redis共有三种模式:
-
主从模式(redis2.8版本之前的模式)
-
哨兵sentinel模式(redis2.8及之后的模式)
-
redis cluster模式(redis3.0版本之后)
- 主从模式:
redis通过是持久化功能,redis保证了在服务器重启的时候能也不会损失数据(或少量损失数据),因为持久化会把数据保存到硬盘上,从硬盘上加载数据,但是数据是保存在一个硬盘上的,也就说在一台服务器上,如果这台服务器造成故障,也会导致数据丢失,为了避免这种单点故障,通常会把数据库的数据复制多个副本,保存到不同的服务器上,因此,redis提供了复制的功能,可以实现当一台服务器更新数据后,会同步更新到其他服务器上。
这种复制的功能,会将服务器分为两类,一类是主服务器(master),一类是从服务器(slave)。主服务器可以进行读写操作,当写的操作进行数据操作时,会同步给从服务器,而从服务器一般都是只读的,接受从主服务器同步过来的数据。一个主服务器可以拥有多个从服务器,但从服务器只能有一个主服务器。
- 主从服务器的配置:
主服务器不用配置,从redis的conf文件中可以加载从服务器的信息,也可以在启动时,使用 redis-server --port 6380 --slaveof 127.0.0.1 6379
从服务器一般是只读,可以改为可写,但写入的数据很容易被主同步没,所以还是只读就可以。
也可以在运行时使用slaveof ip port命令,停止原来的主,切换成刚刚设置的主 slaveof no one会把自己变成主。 - 复制原理:
当从服务器启动时,会向主服务器发送sync命令,主服务器接收到sync后开始在后台保存快照rdb,在保存快照期间收到的命令缓存起来,当快照完成时,主服务器会将快照和缓存的命令一块发送给从服务器。复制初始化结束。之后,主每收到1个命令就同步发送给从服务器。
当出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库。增量复制
主从复制是乐观复制,当客服端发送写给主,主执行完成之后返回给客户端,并异步的把命令发送给从,这个过程是不影响效率的,你也可以设置要同步给多少从主才可以写。
无硬盘复制:如果硬盘效率低将会影响复制性能,2.8之后的版本可以设置无硬盘复制,将repl-diskless-sync yes。
- 哨兵sentinel模式:
由一个sentinel或者是多个sentinel组成的系统可以监视多个主服务器,以及监视主服务器下的从服务器,当被监视的主服务器进入宕机状态,或者是下线状态时,会自动从从服务器中选择一台升级为新的服务器,当进入宕机状态中的服务器重启后,会变成从服务器。 - redis cluster模式(集群):
cluster模式只需要打开cluster-enable打开即可,集群的搭建最少需要三主三从,三主提供服务,三从提供备份功能。
每台服务器都可以看做是一个节点,每个节点之间是相互连通的,所以每一个节点都存有这个集群的所有主节点和从节点信息。节点之间通过相互ping来判断节点是否连接上,如果有一半以上的节点去ping一个节点的时候,没有响应,集群就认为这个节点挂掉了,就会连接从节点。如果某一个节点和所有的从节点全部挂掉,集群就进入filed状态。还有就是有一半以上的从节点挂掉,集群同样进入filed状态。
客户端可以和任何一个节点进行连接,来访问集群中的任意一个节点,对其进行读写操作。