• 高并发架构基石【三】——Redis


    特点

    单线程

    原因一:因为采用了非阻塞的异步事件处理机制。

    原因二:缓存数据都是内存操作IO时间不会太长,可以避免线程上下文切换的代价。

    异步IO

    多数据结构

    支持持久化

    不仅可以做缓存,还可以做NoSQL数据库。

    主从模式

    提供主从同步机制,以及cluster集群部署能力,能提供高可用服务。

    数据结构

    string

    string 类型是 Redis 中最常使用的类型,内部的实现是通过 SDS(Simple Dynamic String )来存储的。SDS 类似于 Java 中的 ArrayList,可以通过预分配冗余空间的方式来减少内存的频繁分配。

    hash

    hash 类型在 Redis 中有 ziplist 和 hashtable 两种实现。当 Hash 表中所有的 key 和 value 字符串长度都小于 64 字节且键值对数量小于 512 个时,使用压缩表来节省空间;超过时,转为使用 hashtable。

    set

    set 类型的内部实现可以是 intset 或者 hashtable,当集合中元素小于 512 且所有的数据都是数值类型时,才会使用 intset,否则会使用 hashtable。

    list

    list 类型,有 ziplist 压缩列表和 linkedlist 双链表实现。ziplist 是存储在一段连续的内存上,存储效率高,但是它不利于修改操作,适用于数据较少的情况;linkedlist 在插入节点上复杂度很低,但它的内存开销很大,每个节点的地址不连续,容易产生内存碎片。此外在 3.2 版本后增加了 quicklist,结合了两者的优点,quicklist 本身是一个双向无环链表,它的每一个节点都是一个 ziplist。

    zset

    sorted set 是有序集合,有序集合的实现可以是 ziplist 或者是 skiplist 跳表。有序集合的编码转换条件与 hash 和 list 有些不同,当有序集合中元素数量小于 128 个并且所有元素长度都小于 64 字节时会使用 ziplist,否则会转换成 skiplist。

    提示

    Redis 的内存分配是使用 jemalloc 进行分配。jemalloc 将内存空间划分为小、大、巨大三个范围,并在范围中划分了小的内存块,当存储数据时,选择大小最合适的内存块进行分配,有利于减小内存碎片。

    功能

    bitmap

    位图是支持按bit位来存储信息,可用来实现BloomFilter。

    hyperLogLog

    提供不精确的去重计数功能,适合用于做大规模数据去重统计,例如统计UV。

    geospatial

    可用于保存地理位置,并作位置距离计算或半径计算位置等。

    pub/sub

    订阅发布功能,可以做简单的消息队列。

    pipeline

    可以批量执行一组指令,一次性返回全部结果,可以减少频繁的请求应答。

    lua脚本

    Redis支持提交lua脚本来执行一系列的功能。

    事务

    Redis提供的不是严格的事务,只保证串行执行命令,并且能保证全部执行,但执行失败并不会回滚,而是继续执行下去。

    数据持久化

    RDB

    是把内存中的数据集以快照形式写入磁盘,实际操作是通过fork子进程执行,采用二进制压缩存储。

    优点:把整个Redis的数据保存在单一文件中,比较适合做灾备。

    缺点:缺点是快照保存完成之前如果宕机,这段时间的数据将会丢失,另外保存快照时可能导致服务短时间不可用。

    AOF

    是以文本日志的形式记录Redis处理的每一个写入或删除操作。

    优点:对日志文件的写入操作使用的追加模式,有灵活的同步策略,支持每秒同步、每次修改同步和不同步。

    缺点:相同规模的数据集,AOF要大于RDB,AOF在运行效率上往往低于RDB。

    Redis Cluster

    Redis Cluster 使用分片机制,在内部分为 16384 个 slot 插槽,分布在所有 master 节点上,每个 master 节点负责一部分 slot。数据操作时按 key 做 CRC16 来计算在哪个 slot,由哪个 master 进行处理。数据的冗余是通过 slave 节点来保障。

    Sentinel

    slave的priority设置的越低,优先级越高。

    主从同步

    master选举策略

    同等情况下,slave的复制数据越多,优先级越高。

    相同条件下,runid越小,越容易被选中。

    key失效机制

    Redis 的 key 可以设置过期时间,过期后 Redis 采用主动和被动结合的失效机制,一个是和 MC 一样在访问时触发被动删除,另一种是定期的主动删除。

    主动删除

    被动删除

    淘汰策略(6种)

    只针对设置了失效期的 key 做 LRU、最小生存时间和随机剔除。

    voltile-lru

    voltile-ttl

    voltile-random

    针对所有 key 做 LRU、随机剔除。

    allkeys-lru

    allkeys-random

    设置不剔除,容量满时再存储对象会返回异常,但是已存在的 key 还可以继续读取

    no-eviction

    4.0、5.0新特性

    Module

    4.0 的模块机制等。

    Stream

    5.0 的 Stream,是一个可以支持多播,也就是一写多读的消息队列。

    PSYNC2.0

    混合RDB-AOF持久化格式

  • 相关阅读:
    tomcat7简单优化
    java向上转型和向下转型
    字符串循环移位
    测试覆盖率问题
    悬挂指针
    标准库string的用法探讨
    野指针问题
    Clock函数用法
    配置信息写入到.ini文件中的方法
    数组指针和数组引用做参数的区别
  • 原文地址:https://www.cnblogs.com/yadongliang/p/12496777.html
Copyright © 2020-2023  润新知