• redis


    命令

    select 

    flushdb

    flushall

    dbsize

    keys *

    exists key

    expire key 10

    ttl key

    type key

    redis是c语言写的。

    1、redis在执行命令的时候都是单线程。官方表示 redis是基于内存操作,CPU不是redis的性能瓶颈,redis的瓶颈时根据机器的内存和网络带宽,所以使用单线程。

    why 快?

    核心:redis将所有数据放在内存中,因为多线程会有CPU上下文的切换(导致耗时),对于内存系统来说,如果没有上下文切换那么效率就是最高的。多次读写都是在同一个CPU上的,在内存情况下效果最佳。

    常见误区:

    (1)高性能无服务器一定是多线程。

    (2)多线程(CPU上下文切换)一定比单线程效率高。

    一、主从复制

    默认情况下,每台redis服务器都是主节点;一般情况下只用配置从节点。

    命令:slaveof

    也可以通过配置文件配置。

    主机负责写,从机只负责读。

    1、主机挂掉后,但是从机还是从机并不会变为主机,需要手动配置。

    主机重新恢复后,从机还会链接主机。

    2、从机挂掉,重启后会自动连接,会自动同步主机的数据。

    复制的原理:

    1、slave启动成功连接到master后会发送一个sync同步命令

    2、master接到命令后,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。

    3、全量复制:slave服务器在接收到数据库文件数据后,将其存盘并加载到内存中。

    4、增量复制:master服务器继续将所有收集的修改命令一次传给slave服务器,完成同步。

    但是只要重新连接master,一次完全同步(全量复制)将被自动执行。

    命令:slaveof no one 

    如果主机断开连接,可以使用上述命令,使自己成为主机,其他节点就可以手动连接到最新的这个主节点【手动】。此时主机恢复后,需要重新配置从节点。

    缺点:

    主从复制在当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服务不可用。

    哨兵模式:

    redis 2.8后提供sentinel(哨兵)架构来解决这个问题。监控后台主机是否有故障,如果故障了根据投票数自动将从服务器转换为主服务器。

    哨兵模式是一种特殊的模式,首先redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程会独立运行。原理是哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例。

    使用一个哨兵进程对redis服务器进行监控,可能会出现问题,为此我们可以使用多个哨兵进行监控,各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

    假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover操作,仅仅是哨兵1主观认为主服务器不可用,这个现象称为主观下线。当其他的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵就会进行一次投票,投票的结果由一个哨兵发起,进行failover【故障转移】操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器切换为主服务器,这个过程称为客观下线。

    sentinel.conf

    sentinel monitor myredis 127.0.0.1 6379 1

    优点:

    1、哨兵集群,基于主从复制,所有主从配置配置的优点都有

    2、主从可以切换,故障转移,系统的可用性就会更好

    3、哨兵 模式就是主从模式的升级,手动到自动

    缺点:

    1、redis不好扩容,集群容量达到上限,在线扩容就十分麻烦

    2、实现哨兵模式很复杂,配置项过多且是写死的

    redis缓存穿透和雪崩:

    缓存穿透:用户想查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求持久层数据库,这会给持久层数据库造成很大的压力,此时相当于缓存穿透。

    方案一:布隆过滤器

    布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力。

    方案二、缓存空对象

    使用这种方法存在两个问题:

    (1)如果空值能够缓存起来,意味着缓存需要更多的空间存储更多的键,因为这当中可能会有更多的空值的键;

    (2)即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保存一致性的业务会有影响。

    缓存击穿:

    比如:微博热搜

     缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。

     当某个key在过期的瞬间,有大量的请求并发访问。这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导致数据库瞬间压力过大。

    解决方案:

    (1)设置热点数据永不过期。

    从缓存层面来看,没有设置足够长的过期时间,所以不会出现热点key过期后产生的问题。

    (2)加互斥锁

    分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后段服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到分布式锁,因此分布式锁的考验很大。

    缓存雪崩:  

    是指某一个时间段,缓存集中过期失效。或者redis宕机。

     

  • 相关阅读:
    GCD
    vue中前进刷新、后退缓存方案收集
    vue cli3 项目配置
    CSS 多行省略失效 (-webkit-box-orient 失效) Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.
    vue 设置当前页背景色
    vue history模式下的微信支付,及微信支付授权目录的填写,处理URL未注册
    h5 audio播放问题,audio获取缓存进度条
    h5页面ios键盘弹出收起后页面底部留白问题
    vue项目中引入vant 使用rem布局问题
    vue history模式下的微信分享
  • 原文地址:https://www.cnblogs.com/xiaohaigegede/p/15690696.html
Copyright © 2020-2023  润新知