redis内存模型
redis大致内存模型如下图
---
单机版的redis最多只能支持大概几万的QPS,缓存一般来说都是用来支撑读高并发的,写的请求是比较少的,要想支持更高的并发量,可将redis做成读写分离的主从架构。
如下图所示:架构做成主从架构,一主多从,主负责写,并且将数据同步复制到其他slave节点,从节点负责读。所有的读请求全部走从节点。加假如原来一台机器只能支撑5万QPS,四台机器就能支撑20万QPS了
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集群的几种方式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。
-----