redis那点事1: 概述篇

redis大纲: 

    传送

 

什么是redis?

    redis本质上是一个key-value的内存数据库, 整个数据库都是在内存中操作的,redis会定时将数据刷到磁盘中

    进行持久化保存,  因为是内存操作, redis的性能非常强

 

说说redis的基本类型:

  1.  string  最基本的数据结构 二进制的安全字符串  最大为512MB
  2.  list    按照添加顺序保持顺序的字符串列表    最大为2 ^ 32 -1  1GB
  3.  hash   key-value的一种数据结构   最大为2 ^ 32 -1  1GB
  4.  set     无需字符串的集合, 不存在重复数据   最大为2 ^ 32 -1  1GB
  5.  zset    在set类型上多一个score字段用于排序   最大为2 ^ 32 -1  1GB

 

 说说redis的优势: 

  1.  速度快: 因为在内存中查找 时间复杂度为O(1) 
  2.  数据类型丰富: string list hash set zset
  3.  支持事务: 开启事务后操作都是原子性的
  4.  特性丰富: 可以给key设置过期时间, 到期自动失效

 

 说说redis的劣势:

    redis的主要缺点是数据库容量受内存的限制, 不能用于海量数据的高性能读写

    因此redis的使用场景在小数据量的高性能操作上

 

redis是单线程的吗?

    答案是肯定的,  redis用队列技术将传统的并发访问变为穿行访问, 消除了传统的串行化的开销

 

redis为什么是单线程的?

    这里肯定有人说, 又不是我写的, 我哪知道!       咳咳! 那我们分析一波:   

        redis是用来干嘛的? 当然是作缓存的呀!

        为什么不用数据库缓存呢? 当然是因为数据库慢!

        如果是多线程的需要注意什么? 锁! CPU的上下文切换!

        所以说redis设计为单线程是有原因的:  因为多线程涉及到了锁以及线程的切换从而浪费CPU降低性能

        redis的瓶颈不是CPU而是机器的内存和网络带宽, 所以将redis的模型设计为单线程的

 

redis的数据为什么放到内存中呢?

    这个我们也来分析一波: 

        硬盘快还是内存快? 肯定是内存快呀 硬盘大多数都是7200转的!

        既然想快那就要用最快的资源! 放在内存中可以达到最快的读写性能  如果放到磁盘中 I/O会严重影响redis的性能

 

说说redis的吞吐量吧: 

    单点TPS:  8w/s     单点QPS:  10w/s      emmm~ 特别的快!

    这里补充一下 TPS 和 QPS 的区别

        TPS:

                应用系统每秒最大的处理请求数量

                每秒钟可以处理的事务次数, 应用系统一秒钟能完成多少个事务的处理

        QPS:

                应用系统每秒最大能接受的访问量

                每秒钟处理完的请求次数, 具体指发出请求到响应的返回结果, 可以理解为有一个变量 count

                每次请求都会 count++,  QPS是指秒钟后count的值

   

类似于redis的缓存有哪些?            

  1.  memcached:单进程多线程模型
  2.  mongodb: 支持丰富的数据表达和索引的非关系型数据库

 

redis相对于memcached的优势有哪些? 

    memcached的类型单一 只有string, 而redis的数据类型有很多

    redis的速度要比memcached快

    redis支持持久化

    redis支持数据的备份, 及master-slave模式

 

redis中value的限制是多少?      

     String最大512MB 其他类型最大1GB (2 ^ 32 -1)

     但是string最好不要超过10KB, 其他的最好不要超过5000个元素, 不然会很影响速度的,  比如说网络很慢

     数据备份和传输就会很慢

 

redis 的主要功能有哪些?

     1. 哨兵机制(Sentinel) 与主从复制(Replication) 

          Sentinel 可以管理多个redis服务器, 提供了监控, 提醒, 故障自动转移等功能

          Replication 负责一台服务器进行配备多个备份服务器

          Redis也是通过这两个功能保证高可用的

     2. 支持事务

          redis事务支持一次性执行多条命令, 并保证其原子性

     3. 支持 LUA 脚本

          在事务的基础上, 如果想对命令做出更复杂的判断就可与用到LUA脚本

     4. 支持持久化

          redis的持久化是将内存中的数据持久化到本地硬盘中, 当下次启动的时候就会重新加载数

          从而降低缓存丢失带来的影响

     5. 支持集群

          单台服务器的资源是有限的, 可以通过主从复制进行读写分离, 将一部分压力转到其他服务器上

          集群可以做到 读写分离 及 数据容灾

 

说说redis的持久化策略有哪些:

    redis提供了两种持久化策略: AOF RDB

 

    RDB: 默认开启, 会按照指定时间将内存中的数据快照备份到本地磁盘中

             当Redis再次启动的 时候会将数据再次恢复到内存中, 可以理解为快照持久化

    

    AOF: 默认关闭, 以日志的形式记录所有的写操作, 只需要追加文件, 但不需要修改文件

             redis 启动时, 会将日志文件从头到尾执行一遍以完成恢复操作 (包括flush也会执行)

 

    当两种持久化方式都开启后, redis会优先使用AOF进行数据的恢复, 一般情况下使用默认的 RDB 已经足够了

    相比与AOF, RDB更适合数据的备份, 并且恢复数据也比较快

    

    开启持久化缓存会对性能有一定的影响, 特别是当内存满的时候, TPS会下降不止一点

    因此:  如果是做缓存可以不用开启持久化

 

说说rdb持久化的工作流程:

    RBD工作流程: redis会单独创建一个子进程 fork, 将当前父进程的数据复制到子进程中

        子进程会将数据写到一个临时文件中, 当持久化过程完毕后, 子进程会将临时文件覆盖掉之前的持久化文件

        最后退出子进程并释放内存, 这就是 rdb 的工作流程

 

    值得注意的是:  每次持久化都会将主程序的数据复制一遍, 导致内存与CPU的开销过大, 如果此时内存 不足,

        服务器会阻塞, 等待持久化执行完毕后才回释放内存, 每次持久化都会将内存的数据全部写入磁盘一次,

        如果数据量大, 并且频繁地进行写操作, 必然会引起大量I/O操作, 严重影响性能,

        最后一次持久化还有可能导致数据的丢失 (可能覆盖时宕机, 数据覆盖未执行完毕, 引起数据的不完整)

    

说说aof持久化的工作流程:

    AOF工作流程: 因为AOF默认是拼接的方式, 所以文件会越来越大, 针对这个问题, 增加了 重写机制,

        当日志大到一定程度时, 会fork出一个新的进程, 用来遍历内存中的数据, 每条数据 对应一条set语句,

        写到临时文件中, 再替换到旧的日志文件中, 类似于RDB持久化, 触发重写 机制的条件是:

        当 AOF文件大小是上次重写后大小的1倍且大于64MB时才会触发

 

    AOF如何开启:  将appendonly 改成 yes

                

 

    AOF触发方式: 有写操作就添加  每秒定时写(也可能丢失数据) 

        

 

说说redis的缓存淘汰策略:

    在redis的配置文件中, 允许我们自定义最大占用内存的大小 server.maxmemory

    当内存达到一定的阀值的时候, redis会启用 maxmemory-policy 配置的的缓存淘汰策略, 默认noeviction

    1. volatile-lru            从设置过期时间的数据集中淘汰最近最少使用的key

    2. volatile-ttl             从设置过期时间的数据集中淘汰即将过期的数据

    3. volatile-random    从设置过期时间的数据集中淘汰任意数据

    4. allkeys-lru             从数据集中淘汰最近最少使用的key

    5. allkeys-random     从数据集中淘汰任意数据

    6. noeviction             禁止淘汰数据, 可能会出现 OOM, 可读不可写

 

 redis过期时间和永久有效怎么设置?

    EXPIRE key 10          设置key的过期时间为10秒

    PERSIST key             将key设为永久有效

 

说说你知道的redis调优方式?

    尽可能使用散列表 (hash), 因为hash在内存中占用的资源非常的少, 可以将实体对象抽象到 hash中 

    hash的底层可以是 zipList 也可以是 hashTable 由于这个原因, 推荐使用hash

 

说说你知道的redis性能问题和解决方案:

  1. Master最好不要做任何持久化工作 AOF 和 RDB
  2. 如果数据重要, 让从机开启AOF持久化, 设定每秒同步一次
  3. 为了保证主从复制的稳定性与速度, Master 和 Slave最好在同一个局域网
  4. 尽量避免在压力很大的Master 添加Slave
  5. 主从复制不要用数结构, 最好用单向链表, 这样的好处是解决了单点故障, master挂了slave直接顶上来, 其他不变

 

redis的内存回收进程是怎么工作的?

     当客户端执行了写操作, redis会检查内存信息, 如果超过了maxmemory会执行对应的回收策略

 

redis的内存回收算法是什么?

    LRU策略, 回收最近最少使用的数据 

 

说说redis的管道吧:

     管道(pipelining) 一次请求/响应能实现处理新的请求, 即使原来的请求还未被响应, 这样就可以 将多个命令发送到

     服务器而不用等待回复, 在最后一个步骤中取得该回复

 

如何保证redis的数据都是热点key?

    如果mysql有2000w数据, redis中有20w数据, 可以设置数据淘汰策略为 allkeys-lru

    当redis内存数据集大小上升到一定大小的时候, 就会施行数据淘汰策略, 淘汰最少使用的key

 

说说redis的应用场景有哪些?

    Session共享(单点登录)   这个最常用了吧!         

    简单队列(list)

    排行榜(zset)     

    计数器(incr)

    订阅发布模式(redis有自己的订阅发布模式)

    分布式锁(setnx)

 

结束

  这就是我对redis概述篇的总结   感觉有用就点个赞吧 如果有错误或更好的方法评论区请多多指出  相互学习共同进步   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值