Skip to content

redis

为什么快?
    内存计算
    单线程模型
    io多路复用机制

哪些地方使用了多线程?
    网络io v6.0
        *v6.0之前是单Reactor单线程模型
        //Redis.conf,默认只开启写响应多线程,可通过下面配置开启读请求多线程处理.
        io-threads-do-reads yes
        io-threads 4 # 推荐n-1

    执行命令
    关闭文件 v2.6 bio_close_file
    aof刷盘 v2.6 bio_aof_fsync
    释放内存 v4.0 bio_lazy_free
        lazyfree线程: 处理 unlink key / flushdb async / flushall async 等命令任务
    
redis事务
    单行命令执行是原子性的
    多行命令可通过lua脚本
    MULTI - 命令a - 命令b... - EXEC
        Redis 事务正常执行,可以保证原子性;
        Redis 事务执行中某一个操作执行失败,不保证原子性;

持久化
    AOF日志
        appendfsync 配置项
            *可用redis-check-aof工具来修复损坏的文件
            Always
            Everysec
            No
    RDB快照
        *二进制,体积小,易恢复,但可能缺数据.
        save
            # 表示在 900 秒内如果至少有 1 个 key 发生变化,就触发一次 RDB 快照
            save 900 1
            # 表示在 300 秒内如果至少有 10 个 key 发生变化,就触发一次 RDB 快照
            save 300 10
            # 表示在 60 秒内如果至少有 10000 个 key 发生变化,就触发一次 RDB 快照
            save 60 10000
        bgsave

过期键删除策略
    惰性删除
        访问和修改之前,expireIfNeeded函数检查是否过期
    定期删除
        每隔一段时间随机抽取key检查
            从过期字典中随机抽取20个key,删除已过期.
            若已过期占比超25%(5个)且执行时间不超过25ms,就继续抽取20个,继续上述步骤.
        //默认10次过期检查一次数据库
        hz 10

内存淘汰策略
    不数据淘汰
        noeviction v3.0默认 禁止写入
    数据淘汰
        * volatile表示筛选设置了过期时间的键
        volatile-random
        volatile-ttl
        volatile-lru v3.0之前默认
        volatile-lfu v4.0
        allkeys-random
        allkeys-lru
        allkeys-lfu v4.0

估算
    * 4c8g,qps
    redis 10w
    mysql 5000∂