redis深入学习随记(2)

redis基本数据类型

  • string
普通的set和get,做简单的kv缓存。
  • hash
是一个类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他对象)给缓存在redis里,然后每次读写缓存时候,可以就操作hash里的某个字段。
  • list
比如可以通过list存储一些列表类型的数据结构,类似粉丝列表,文章评论列表。
可以通过lrange命令,可以从某个元素开始读多少个元素,可以基于list实现分页查询。
  • set
无序集合,自动去重。
直接基于set将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,当然也可以基于jvm内存里的hashset进行去重,但是如果某个系统部署在多个机器上呢?就需要基于redis进行全局去重。同时可以进行交集。
  • sorted set
排序set,去重但是可以排序,写进去的时候给一个分数,自动根据分数排序,这个可以玩很多花样,最大特点是有个分数可以自定义排序规则。
redis过期策略
  • 定期删除
所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除,假如reids里存了10万个key,都设置了过期时间,每隔几百毫秒,就检查10万个key,那么redis基本就挂了,cpu负载很高,消耗在检查过期key上了。实际上redis是每隔100毫秒抽取一些key来检查和删除的。
  • 惰性删除
定期删除可能会导致很多过期key到了时间并没有被删除掉,所以就需要惰性删除,在获取某个key时候,redis就会检查一下,这个key如果设置了过期并是否过期,如果过期了就删除。
但是实际上还有问题,定期删除漏掉了很多过期的key,然后你也没有及时去查,也就没有走惰性删除,此时会大量过期key堆积在内存里,导致redis内存块耗尽。
  • 内存淘汰机制
如果redis内存占用过多时,此时会进行内存淘汰,有以下策略。
1.noeviction:当内存不足以容纳新写入的数据时,新写入操作会报错,一般不用。
2.allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(最常用的)
3.allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
4.volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最少使用的key
  1. volatile-random:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,随机移除某个key。
6.volatile-ttl:当内存不足以容纳新写入数据时候,在设置了过期时间的键空间中,有更早过期时间的优先移除。
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。
  • 主从复制的断点续传
从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。
master node慧在内存中创建一个backlog,master和slave都会保存一个,id,offset就是保存在backlog中,如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制。
  • 无磁盘化复制
【redis深入学习随记(2)】master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了。
repl-diskless-sync
repl-diskless-sync-delay等待一定时长再开始复制,因为要等更多slave重新连接过来。
  • 过期key处理
slave不会过期key,只会等待master过期key,如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给salve。

    推荐阅读