zoukankan      html  css  js  c++  java
  • redis常用功能和概念的使用笔记及与memcache对比分析

    redis常用功能和概念的使用笔记及与memcache对比分析

    当下redis和memcache是最常用的缓存使用系统,项目中如何选择redis和memcache?redis和memcache各有什么特点和不同?

    一、redis为什么快?

    1. redis采用了多路复用io阻塞机制(linux内核的epoll机制,主分支是不支持windows的)
    2. 数据结构化繁为简,操作节省时间
    3. 运行在内存中
    4. 参考文档

    二、 redis与memcache的对比

    1. 定位不同
      • redis的定位是内存数据库,数据更安全,它有数据的持久化,可恢复数据,内存不足时会使用虚拟内存,
      • memcache的定位是内存缓存系统,只能使用内存,无持久化,数据不可恢复
    2. 数据结构不同
      • redis支持stringhashlistsetzset等多种数据类型
      • memcache仅支持简单key-value,数据类型单一
    3. 数据大小
      • redis存储小数据(<100k)时效率高于memcache, 但最大可支持450M的数据
      • memcache存储(>100k)的数据时比redis效率更高,可存储图片、视频,但最大数据1M,
    4. 并发处理不同
      • redis存取内存是单线程的,保证数据一致性。多核系统可以起多个redis的进程来利用
      • memcache是多线程,可以充分利用多cup的性能
    5. 分布式方式不同
      • redis是服务器端做分片的,把数据分片到16348个槽点上,最多可以设置16348个节点
      • memcache的分布式是由客户端来做的,在客户端来处理,把数据存储到不同的节点上
    6. 高可用性不同
      • redis是可以做主从复制的,主服务器挂了,快速切换到从服务器,可以确保数据的安全和高可用性
      • memcache没有自带的主从复制功能,需要第三方工具实现主从,效率相对较低
    7. 复杂数据处理能力
      • redis自带数据处理功能,内部函数丰富,可以有效减少数据存取的次数
      • memcache无数据处理能力
    8. 过期策略不同
      • redis可以通过expire来调整过期时间
      • memcache只能在set的时候设置过期时间
    9. 总结
      • 单纯的使用k-v做缓存,建议使用memcache,效率更高,估计只有大公司才有这种需求和条件
      • 缓存的同时,还需要更多数据类型、数据处理、高可用方面,当然是redis
      • 对于中小公司来讲当然首先redis,功能全,安全,效率也不低
    10. 参考文档

    三 redis的持久化方式

    1. RDB持久化(Redis DataBase 快照式)
      • RDB其实就是把数据以快照的形式保存在磁盘上,是redis默认的持久化方式
      • 提供了三种持久化触发机制:save、bgsave、自动化。
        • save命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止
        • bgsave命令执行时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。是主要的内部触发机制
        • 自动触发是配置文件来设置的,redis.conf 中 “save m n” 就触发bgsave.不需要持久化,那么你可以注释掉所有的 save
          • stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。
          • rdbcompression ;默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。
          • rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,
            但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
          • dbfilename :设置快照的文件名,默认是 dump.rdb
          • dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。
      • RDB的优势
        • RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
        • 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
        • DB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
      • RDB的劣势
        • 存在部分数据丢失可能。持久化时,是由子进程来操作的,父进程如果数据变化了,数据可能丢失
    2. AOF持久化(Append Only File日志式)
      • redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。
      • 持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。
        将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。
      • AOF也有三种触发机制:alwayseverysec o
        • always:同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差当数据完整性比较好(慢,安全)
        • everysec:出厂默认推荐,每秒异步记录一次(默认值)
        • no:不同步
        • 配置重写触发机制,当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。一般都设置为3G,64M太小了。
            auto-aof-rewrite-percentage 100
            auto-aof-rewrite-min-size 64mb
          
      • AOF的优势
        • 数据的完整性和一致性更高
      • AOF的劣势
        • 因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
        • 开启AOF后消耗系统资源,损耗一部分效率
    3. redis持久化的流程
      1. 客户端向服务端发送写操作(数据在客户端的内存中)。
      2. 数据库服务端接收到写请求的数据(数据在服务端的内存中)。
      3. 服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。
      4. 操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。
      5. 磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。
    4. redis故障情况分析
      1. Redis数据库发生故障,只要在上面的第三步执行完毕,那么就可以持久化保存,剩下的两步由操作系统替我们完成。
      2. 操作系统发生故障,必须上面5步都完成才可以。才需要RDB或AOF的来恢复数据
    5. 总结
      • 若只打算用Redis 做缓存,可以关闭持久化。
      • 若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。
      • 一般使用默认的RDB做持久化就好了
    6. 参考文档

    四、缓存穿透,缓存雪崩以及缓存击穿

    1. 缓存穿透:
      • 就是客户持续向服务器发起对不存在服务器中数据的请求。客户先在Redis中查询,查询不到后去数据库中查询。
      • 解决办法:
        • 接口层增加校验,对传参进行个校验,比如说我们的id是从1开始的,那么id<=0的直接拦截;
        • 缓存中取不到的数据,在数据库中也没有取到,这时可以将key-value对写为key-null,这样可以防止攻击用户反复用同一个id暴力攻击
    2. 缓存击穿:
      • 就是一个很热门的数据,突然失效,大量请求到服务器数据库中
      • 解决办法:
        • 重要的热点数据不设置过期时间,
        • 定时执行相关任务更新数据及过期时间
    3. 缓存雪崩:
      • 就是大量数据同一时间失效。
      • 解决办法
        • 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
        • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中
  • 相关阅读:
    一个体验好的Windows 任务栏缩略图开发心得
    扫脸动画
    ShimmerTextView
    201512-2 消除类游戏 (水题,暴力)
    CCF 201512-1 数位之和 (水题)
    UVa 557 Burger (概率+递推)
    CCF 201604-2 俄罗斯方块 (模拟)
    CCF 201604-1 折点计数 (水题,暴力)
    UVa 10213 How Many Pieces of Land ? (计算几何+大数)
    UVa 1641 ASCII Area (计算几何,水题)
  • 原文地址:https://www.cnblogs.com/qumogu/p/13132196.html
Copyright © 2011-2022 走看看