redis内存模型

redis大致内存模型如下图

redis(内存模型 五种数据类型应用场景 集群方案)_redis

---

单机版的redis最多只能支持大概几万的QPS,缓存一般来说都是用来支撑读高并发的,写的请求是比较少的,要想支持更高的并发量,可将redis做成读写分离的主从架构。

如下图所示:架构做成主从架构,一主多从,主负责写,并且将数据同步复制到其他slave节点,从节点负责读。所有的读请求全部走从节点。加假如原来一台机器只能支撑5万QPS,四台机器就能支撑20万QPS了

redis(内存模型 五种数据类型应用场景 集群方案)_redis_02

redis五种数据类型应用场景

String:  KV缓存

hash: 这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在redis里,然后每次读写缓存的时候,可以就操作hash里的某个字段。   redis hash用法

key=150

value={

  “id”: 150,

  “name”: “zhangsan”,

  “age”: 20

}

hget 150:id   将返回150

list:有序集合,比如某个话题被哪些用户关注

set:无序集合,自动去重    比如两个话题的关注者的交集

sorted set:排序的set,可以用在排行榜

添加数据

zadd board 85 zhangsan

zadd board 72 wangwu

zadd board 96 lisi

zadd board 62 zhaoliu

结果

96 lisi

85 zhangsan

72 wangwu

62 zhaoliu

zrevrange board 0 3获取排名前3的用户

96 lisi

85 zhangsan

72 wangwu

zrank board zhaoliu  获取赵六的排名

4

如何防止redis缓存雪崩

1.事前,保证redis集群高可用。

2.本地ehcache。

3.hystrix限流(QPS不超过2000) 超过的走降级,返回一个默认提示。

4.事后,redis持久化机制,恢复集群,从磁盘加载数据恢复磁盘上的数据。

redis(内存模型 五种数据类型应用场景 集群方案)_redis_03

Redis集群的几种方式

1.主从模式(master/slaver)

一个master配多个slave,默认配置下,master节点可以进行读和写,slave节点只能进行读操作,写操作被禁止。

缺点:master节点挂了以后,redis就不能对外提供写服务了,因为剩下的slave不能成为master

  这个缺点影响是很大的,尤其是对生产环境来说,是一刻都不能停止服务的,所以一般的生产坏境是不会单单只有主从模式的。所以有了下面的sentinel模式。

2.sentinel模式

        sentinel的中文含义是哨兵、守卫。也就是说既然主从模式中,当master节点挂了以后,slave节点不能主动选举一个master节点出来,那么我就安排一个或多个sentinel来做这件事,当sentinel发现master节点挂了以后,sentinel就会从slave中重新选举一个master。

       当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中,就是下面要讲的。

3.cluster模式

  cluster的出现是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。对cluster的一些理解:

cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。

因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容

这种模式适合数据量巨大的缓存要求,当数据量不是很大使用sentinel即可。

 

如何防止redis缓存穿透

缓存穿透:访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

解决方案:访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。

如何防止redis缓存击穿

缓存击穿:一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决方案:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。

 

 

 

 

 

-----