概述
为什么要用缓存
运行在内存中,加载速度非常快,缺点:不能持久化,重启就丢失了数据。
三大缓存插件:
EHcache 轻量级缓存 它是运行在单机内存里的,方便简易。 缺点:容量非常有限,应用场合主要是单机应用。
Memcache 存储类型单一 ,只能存储字符串。
redis 存储类型多样化 性能非常高 可靠性很高 使用场景非常多
redis缓存是什么东西
redis 是一种nosql数据库 无关系型数据库
redis缓存 存储方式 key-value 双列集合 类似map
redis的特性
string 操作 setnx 可以作为分布式锁 原理 通过setnx设置同一个key 如果key存在则会设置失败,只有成功者才能操作资源。
value支持多种多样 string hash(相当于存对象) list set SorttedSet 五种
key具有过期特性 具有唯一性
mysql 是一种关系型数据库 关系型数据管理系统 RDS
redis的持久化
持久化策略:
快照(RDB) redis默认配置 一般不会用 数据保存的较全 缺点:磁盘空间浪费 ,性能损耗
aof 只会将有改变的数据进行持久化,存储到磁盘中。经常使用 三种配置:
always 强制每个操作持久化 不使用
everysec 一秒钟一次 经常用
no os决定 不使用
redis如何保存内存一定空间的
redis是个内存数据库,所以内存必然有大小,那么它是如何保持平衡的呢?
redis里面有个 LRU算法 该算法也叫 最近使用算法 它是将那些很长时间不使用的数据进行淘汰,从redis里面删除,从而保证redis的内存处于一定平衡状态。
redis集群
在redis集群没出来之前,redis是如何集群的呢? redis内部有个哨兵机制,什么是哨兵机制呢?
Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解决方案,sentinel系统可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。
哨兵机制缺点:从服务器和主服务器永远一样,有点浪费空间。而且哨兵机制是一个有中心的模式,类似git,这样的模式容易出单点故障。
那么redis集群是如何做的呢?
redis集群它将key分片存储,也就是说瞎几把存,那么如何找到这个key的呢?它有个路由算法,如果它去A片区找key,没找到则会告诉redis这里没有它想要的东西,会让它去其他片区找,直至找到。这样redis就实现了去中心化的思想,就不会有哨兵模式的那些缺点。
那么redis是如何分片的呢?
redis3.0以后就有了分片的思想。 负载均衡的分片是通过hash算法来分片的,具体是:通过传过来的对象取得它的hash值,然后将这个hash值取模(hash%6)取模后的值,就是某台机器的位置。 缺点:如果其中有台机器宕机了,那么它的size就变成了5,也就是说(hash%5)取模后的值跟之前不一样,所有的key都发生了偏离,所有的缓存就失效了。就会造成整个系统瘫痪。
那么现在有个新的思想,就是一致性哈希。那什么是一致性哈希呢?
一致性哈希:相当于将所有的片区映射到一个圆环上,片区互相不影响。也就是说如果有一个片区挂了,对其他片区是毫无影响的,那挂了的这个片区上的key会怎么办呢?它会采取就近分配原则,也就是说这个片区挂了,它的key会分配到它两边的片区里面去,而不会造成key丢失。
redis集群就是类似一致性哈希一样处理的,具体概念:
Redis Cluster分区实现原理
槽(slot)概念
Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……16382、16383。这个槽是一个虚拟的槽,并不是真正存在的。正常工作的时候,Redis Cluster中的每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,这是可以由用户指定的,也可以在初始化的时候自动生成(redis-trib.rb脚本)。这里值得一提的是,在Redis Cluster中,只有Master才拥有槽的所有权,如果是某个Master的slave,这个slave只负责槽的使用,但是没有所有权。Redis Cluster怎么知道哪些槽是由哪些节点负责的呢?某个Master又怎么知道某个槽自己是不是拥有呢?
位序列结构
Master节点维护着一个16384/8字节的位序列,Master节点用bit来标识对于某个槽自己是否拥有。比如对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是不是为1即可。
如上面的序列,表示当前Master拥有编号为1,134的槽。集群同时还维护着槽到集群节点的映射,是由长度为16384类型为节点的数组实现的,槽编号为数组的下标,数组内容为集群节点,这样就可以很快地通过槽编号找到负责这个槽的节点。位序列这个结构很精巧,即不浪费存储空间,操作起来又很便捷
redis的线程模型
最后
以上就是虚心滑板为你收集整理的redis高速缓存学习的全部内容,希望文章能够帮你解决redis高速缓存学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复