首页 > 数据库 >Redis知识点

Redis知识点

时间:2022-11-10 12:44:06浏览次数:36  
标签:知识点 缓存 AOF Redis 内存 key 数据

Redis 是一个基于内存的高性能key-value数据库
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘,
所以Redis具有快速和数据持久化的特征,如果数据放在内存中 磁盘I/O速度为严重影响redis的性能
Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销
Redis的持久化有2种方式 1快照 2日志
RDB是快照方式是在一定间隔时间做一次的产生快照
AOF的默认持久化策略是每秒钟fsync一次,fsync是指把缓存中的写指令记录到磁盘中

一、Redis的好处
      (1) 速度快,因为数据存在内存中
      (2) 支持丰富数据类型,支持string,list,set,sorted set,hash
      (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
      (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

二、redis相比memcached的优势
     (1) memcached的值均是简单的字符串,redis支持更为丰富的数据类型
     (2) redis的速度比memcached快 (单Memcache使用的libevent库,而Redis则原生使用epoll异步通信模型)
          2.1、Redis 单线程模型也能效率比Memcached这么高
                  Redis则原生使用epoll异步通信模型 (核心是基于非阻塞的 IO 多路复用机制)
                  Redis单线程避免了多线程的频繁上下文切换问题
     (3) 可以持久化其数据,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
     (4) Redis支持数据的备份,即master-slave模式的数据备份

三、常见性能问题和解决方案
     (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
           Master RDB写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照
     (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
          Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度
     (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
          Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象
          将no-appendfsync-on-rewrite的配置设为yes可以缓解这个问题,设置为yes表示rewrite期间对新写操作不fsync同步,等rewrite完成后再写入。最好是不  开启Master的AOF备份功能
     (4) 单点故障问题,Redis的主从复制还不够成熟,所以存在明显的单点故障问题
          为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定

 

四、最适合的场景
     (1) 会话缓存
          Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失 也不会带来大的影响
     (2) 全页缓存 FPC
          除基本的会话token之外,Redis还提供很简便的FPC平台
          Magento提供一个插件来使用Redis作为全页缓存后端,此外Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面
     (3) 队列
           Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用
     (4) 排行榜/计数器
          集合(Set)和有序集合(Sorted Set)使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构
          例:排序ZRANGE, 防止刷单/秒杀活动 INCR

 

五、Redis的并发竞争问题解决方式
       Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争
       但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成
       2种解决方法:·····························································
       (1) 客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,
             同时对客户端读写Redis操作采用内部锁synchronized
       (2) 服务器角度,利用setnx实现锁
       第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;

 

六、持久化的几种方式
      (1) RDB快照
           Redis把数据快照存放在磁盘上的二进制文件中,文件名为dump.rdb
           可以配置Redis的持久化策略,例如数据集中每N秒钟有超过M次更新,就将数据写入磁盘;或者可以手工调用命令SAVE或BGSAVE
      (2) AOF写日志
           默认持久化策略是每秒钟fsync一次, 修改配置文件reds.conf: appendonly yes 开启
           可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;
           如果日志写入不完整支持redis-check-aof来进行日志修复
           AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)
           快照模式并不十分健壮,当系统停止,或者无意中Redis被kill掉,最后写入Redis的数据就会丢失
           对于要求高可靠性的应用,不是一个合适的选择。AOF文件比RDB文件大,且恢复速度慢
     (3) 虚拟内存方式

七、缓存失效策略和主键失效机制
       作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略.
       有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除
       (1) 影响生存时间的一些操作
            修改key对应的value或使用相同k v 覆盖旧的数据 则生存时间刷新
            对一个 key 执行INCR命令,对一个列表进行LPUSH命令,或者对一个哈希表执行HSET命令,这类操作都不会修改 key 本身的生存时间
            使用RENAME对一个 key 进行改名,那么改名后的 key的生存时间和改名前一样。
       (2) 如何更新生存时间
             对一个已经带有生存时间的 key 执行EXPIRE命令,新指定的生存时间会取代旧的生存时间.主键失效的时间复杂度是O(1)
             EXPIRE和TTL命令搭配使用,TTL可以查看key的当前生存时间。设置成功返回 1;当 key 不存在或者不能为 key 设置生存时间时,返回 0

       最大缓存配置:
             Redis 中,允许用户设置最大使用内存大小,server.maxmemory默认为0,没有指定最大缓存
             如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置
             配置最大缓存后,redis 内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略
       6种数据淘汰策略:
             volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
             volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
             volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
             allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
             allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
             no-enviction(驱逐):禁止驱逐数据
       三种数据淘汰策略:
             TTL (将要过期)
             Random (随机)
             Lru最近最少使用淘汰策略,设计上会对key 按失效时间排序,然后取最先失效的key进行淘汰

八、主要功能
       (1) 哨兵(Sentinel)和复制(Replication)
            哨兵Sentinel可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能,复制Replication则是负责让一个Redis服务器可以配备多个备份的服务器
       (2) 事务
             多情况下需要一次执行不止一个命令,而且需要其同时成功或者失败。即支持一次性按顺序执行多个命令的能力,并保证其原子性
       (3) LUA脚本
            执行更复杂的操作(包含一些逻辑判断)脚本
      (4) 持久化
           把内存的中的数据写入到硬盘中,在redis重新启动的时候加载这些数据
      (5) 集群(Cluster)
           通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上
           有twemproxy和codis两种方案,这两个方案总体上都是依赖proxy来进行分布式的

标签:知识点,缓存,AOF,Redis,内存,key,数据
From: https://www.cnblogs.com/mihutao/p/16876696.html

相关文章

  • JS知识点梳理之作用域、作用域链、柯里化、闭包
    一、作用域与作用域链作用域是指js变量使用时所存在的一个区域,分为全局作用域(window)和局部作用域(function、setTimeout...等都会产生局部作用域)。当局部作用域变量名与......
  • 大数据如果你只会离线计算,这个项目可以帮你完善一部分知识点
    在大数据开发从业人员中相信很多涉及的工作内容以离线计算居多,对数据是怎么采集的,如何采集,数据结构该设计没有清晰的了解在查阅相关数据产品后发现了某开源的SDK,数据模型设......
  • 一天梳理完react面试高频知识点
    描述事件在React中的处理方式。为了解决跨浏览器兼容性问题,React中的事件处理程序将传递SyntheticEvent的实例,它是跨浏览器事件的包装器。这些SyntheticEvent与你习惯......
  • Spring Security 知识点总结
    Security部分WebSecurityConfigurerAdaptersecurity配置的核心类在这里配置权限等信息authenticationauthentication是认证(登陆)authorizationauthorizati......
  • Spring Security 知识点总结
    Security部分WebSecurityConfigurerAdaptersecurity配置的核心类在这里配置权限等信息authenticationauthentication是认证(登陆)authorizationauthorizati......
  • 从0到1搭建redis6.0.7续更~
    “心有所向,日复一日,必有精进”前言:想必大家看完我之前写的搭建redis服务器,大家都已经把redis搭建起来了吧如果没有搭建起来的小可爱请移步这里哦从0到1搭建redis6是不是......
  • 肖sir__redis__讲解
    一、介绍数据库什么是数据库?是存放数据的电子仓库。以某种方式存储百万条,上亿条数据,供多个用户访问共享。数据库分为关系型数据库和非关系型数据库两种1,关系型数据库?......
  • Redis缓存
    认识缓存缓存更新策略缓存穿透缓存击穿缓存雪崩  认识缓存缓存的作用1,降低后端负载2,提高服务于相应速度缓存的成本1.开发成本 2,运维成本3,一致性成本......
  • Redis:哈希表HLEN、HSTRLEN、HINCRBY、HINCRBYFLOAT、HSCAN命令介绍
    HLENHLENkey时间复杂度:O(1)返回哈希表​​key​​中域的数量。演示当哈希表​​key​​不存在时,返回0。HSTRLENHSTRLENkeyfield可用版本:>=3.2.0时间复杂度:O(1)返回哈希......
  • Redis Stream
    RedisStream是Redis5.0版本新增加的数据结构。RedisStream主要用于消息队列(MQ,MessageQueue),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但......