redis深入学习随记(2)
redis基本数据类型
- string
- hash
- list
可以通过lrange命令,可以从某个元素开始读多少个元素,可以基于list实现分页查询。
- set
直接基于set将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,当然也可以基于jvm内存里的hashset进行去重,但是如果某个系统部署在多个机器上呢?就需要基于redis进行全局去重。同时可以进行交集。
- sorted set
redis过期策略
- 定期删除
- 惰性删除
但是实际上还有问题,定期删除漏掉了很多过期的key,然后你也没有及时去查,也就没有走惰性删除,此时会大量过期key堆积在内存里,导致redis内存块耗尽。
- 内存淘汰机制
1.noeviction:当内存不足以容纳新写入的数据时,新写入操作会报错,一般不用。
2.allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(最常用的)
3.allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
4.volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最少使用的key
- volatile-random:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,随机移除某个key。
redis高并发跟整个系统的高并发之间的关系 redis,你要搞高并发的话,不可避免,要把底层的缓存搞得很好,mysql,高并发做到了,那么也是通过一系列复杂的分库分表,订单系统,事务要求的,QPS到几万,也是比较高了。
redis是整个大型的缓存架构中,支撑高并发的架构里,非常重要的一个环节,首先,底层的缓存中间件,缓存系统,必须能够支撑的起我们说的那种高并发,其次,再经过良好的整体的缓存架构的设计(多级缓存架构,热点缓存),支撑真正上十万,甚至上百万的高并发。
redis不能支撑高并发的瓶颈 单机redis承载QPS大概就是上万到几万不等。(业务复杂性)
如果redis要支撑超过10万+ 单机redis几乎不可能QPS超过10万+。
- 读写分离,一般来说,对缓存,一般都是用来支撑读高并发的,写的请求是比较少的。
架构做成主从架构,一主多从,主负责写,并且将数据同步复制到其他的slave节点,从节点负责读。所有的读请求全部走从节点。
- 主从架构的核心原理
当启动一个slave node的时候,会发送一个PSYNC命令给master node
如果这是slave node重新连接master node,那么master node仅仅会复制给slave部分缺少的数据。否则如果是slave node第一次连接master node,那么会触发一次full resynchronization,开始full resynchronization的时候,master会启动一个后台进程,开始生成一份RDB快照文件,同时还会从客户端收到的所有命令缓存到内存中,RDB生成完毕后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
slave node如果跟master node有网络故障,断开连接,会自动重连,master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。
- 主从复制的断点续传
master node慧在内存中创建一个backlog,master和slave都会保存一个,id,offset就是保存在backlog中,如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制。
- 无磁盘化复制
repl-diskless-sync
repl-diskless-sync-delay等待一定时长再开始复制,因为要等更多slave重新连接过来。
- 过期key处理
推荐阅读
- 深入理解Go之generate
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 【1057快报】深入机关,走下田间,交通普法,共创文明
- 如何更好的去学习