• redis整理


    Redis

    Redis是一个key-value存储系统。

    Redis支持五种数据类型:
    • string(字符串)
    • list(列表)
    • hash(hash表)
    • set(集合)
    • zset(有序集合)

    memcached类似,redis支持的数据类型更丰富、数据能持久化。
    memcached把数据全部存储在内存中,断电后会挂掉,数据不能超过内存大小。
    而redis`数据会定期备份到硬盘上。

    落地策略

    • RDB持久化(snapshotting):快照,整体备份。在指定的时间间隔内将内存中的数据集快照写入磁盘,实际上是fork一个子线程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
    • AOF持久化(append-only-file):以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

    过期策略

    • 定期删除:redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key
      • 每100ms从过期字典中随机挑选20个,把其中过期的key删除
      • 如果过期的key占比超过1/4,重复步骤1
    • 惰性删除
      • 过期的key并不一定会马上删除,还会占用着内存。当你真正查询这个key时,redis会检查一下,这个设置了过期时间的key是否过期了,如果过期了就会删除,返回空。
    • 内存淘汰机制
      redis内存超出物理内存限制时,会和磁盘产生swap,这种情况性能极差,一般是不允许的。
      (1)noeviction:拒绝写操作,读、删除可以正常使用。默认策略
      (2)allkeys-lru:移除最近最少使用的key,最常用的策略
      (3)allkeys-random:随机删除某个key
      (4)volatile-lru:在设置了过期时间的key中,移除最近最少使用的key
      (5)volatile-random:在设置了过期时间的key中,随机删除某个key
      (6)volatile-ttl:在设置了过期时间的key中,把最早要过期的key优先删除

    Redis缓存和MySQL数据一致性方案

    在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL数据库
    请求先访问redis缓存,如果缓存中有数据,直接加载数据,如果缓存中没有数据,再访问数据库,数据库会将数据放入redis中,然后加载数据。
    读取缓存一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存redis和数据库MySQL间的数据一致性问题。

    • 如果先删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中没脏数据。
    • 如果先写了库,在删除缓存之前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

    因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。

    解决方案:异步更新缓存(基于订阅binlog的同步机制)
    MySQLbinlog增量订阅消费+消息队列+增量数据 更新到redis
    (1)读redis:热数据基本都在redis
    (2)写MySQL:增删改都是操作MySQL
    (3)更新redis数据:MySQL的数据操作binlog,来更新到redis

    注意:MySQL实现主从一致性,也是基于订阅binlog来实现增量操作。
    binlog:是MySQL的二进制文件,用于记录MySQL的数据更新(insertupdatedelete操作)。

  • 相关阅读:
    jQuery validate 的valid()方法一直返回true
    Webstrom 使用过程中遇到的问题以及解决方案
    CSS选择符 新的认识
    前端常用正则匹配
    魔术师
    node 安装express
    为什么报错说req未定义,createServer只接受匿名函数吗?
    nodejs报错 events.js:72 throw er; // Unhandled 'error' event
    我对 javascript 闭包的理解
    ORM框架,sqlsugar学习一
  • 原文地址:https://www.cnblogs.com/jackw1/p/12581127.html
Copyright © 2020-2023  润新知