Redis入门

介绍:

        Redis是一个机遇内存的高性能Key-Value数据库,整个数据库系统加载在内存上进行操作,每秒可以处理超过10万次的读写操作,是目前性能最快的Ke-value数据库。

优点:

       1.速度快。

       2.支持丰富的数据类型。例如String,list,set,sorted set,HashSet

 缺点:

        数据库容量容易受到物理内存的限制

适用场景:

        由于数据库容量受到物理内存的限制,不能用作海量数据的存储,适用的场景主要是较小数据量的高性能操作和运算

       1.会话缓存。

          最常用的一种使用场景是会话缓存。提供持久化

        2.全页缓存(FPC)

          因为有磁盘的持久化,用户不会看到页面加载速度的下降,类似于PHP本地的FPC

        3.队列

            Redis在内存存储引擎领域的一大优点是提供list和set操作,这使得Redis能作为一个很好的消息队列平台使用

            Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

        4.排行榜/计数器

           Redis在内存中对数字进行递增或递减的操作实现的非常好。Redis提供了集合(Set)和有序集合(Sorted Set),使得我们在执行这些操作时变得非常简单。

        5.发布/订阅

        

 Redis常见问题

        1.Redis的缓存失效策略和主键失效机制

          在创建缓存的时候,要为给定的Key设置生存期,当key过期的时候,它可能会被删除,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(驱逐):禁止驱逐数据

      使用策略规则:

  • 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
  • 如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

     2.为什么Redis需要把所有的数据放到内存中

        为了达到最快的读写速度。

     3.redis的并发竞争问题如何解决

         redis为单进程单线程模式,采用队列将并发访问改为串行访问。Redis没有锁的概念们对于多个客户端连接并不存在竞争。但是在jedis客户端对Redisj进行并发访问时会发生连接超时,数据转化错误、阻塞、客户端关闭连接等问题,这些问题均是由与客户端连接混乱造成 的。

      解决办法主要从两个方面:

          1.客户端角度

              为保证每个客户端正常有序与Redis进行通信,对连接进行吃化,同时对客户端读写Redis操作采用内部锁

          2.服务器角度,利用setnx实现锁

             注:对于第一种,需要应用程序自己处理资源的同步,可以使用synchronized也可以使用lock;第二种需要用到 

                    Redis的setnx的setnx命令,但是需要注意一些问题。

    4.Redis常见性能问题和解决方案

       1.Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

       2.Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

       3.Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

       4.Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。

       5.redis事务的了解CAS(check-and-set操作实现乐观锁)?

          和在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石。Redis中事务的实现特征

        1). 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行。

         2). 和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行。           3). 我们可以通过MULTI命令开启一个事务,有关系型数据库开发经验的人可以将其理解为"BEGIN TRANSACTION"语句。在该语句之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行EXEC/DISCARD命令来提交/回滚该事务内的所有操作。这两个Redis命令可被视为等同于关系型数据库中的COMMIT/ROLLBACK语句。   

        4). 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务器执行。

        5). 当使用Append-Only模式时,Redis会通过调用系统函数write将该事务内的所有写操作在本次调用中全部写入磁盘。然而如果在写入的过程中出现系统崩溃,如电源故障导致的宕机,那么此时也许只有部分数据被写入到磁盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似问题,就会立即退出并给出相应的错误提示。此时,我们就要充分利用Redis工具包中提供的redis-check-aof工具,该工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启动Redis服务器了。

        6.Redis分布式锁

            setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。在setnx之后执行expire之前进程意外crash或者要重启维护了,那个锁就永远得不到释放了。但是设置set指令的参数,可以将setnx和expire合成一条指令用。

       7.假如Redis里面有1亿个key,其中10w个key是以某个固定的已知的前缀开头,如何将它们全部都找出来?

          使用key指令可以扫出指令模式的key列表

       8.如何使用Redis做异步队列

         一般使用lit结构作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当sleep一会儿再重试。list还有个指令交blpop,在没有消息的时候,它会阻塞知道消息到来,

       生产一次,多次消费  -----》 使用 pub/sub主题订阅者模式,可以实现1:N的消息队列

       注:pub/sub模式,消费者下线的qingku6angxia,生产的消息会丢失,得使用专业的消息队列如rabbitmq等

     9.如何使用redis实现延时队列

        使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用 zrangebyscore指令获取N秒之前的数据看、轮询进行处理

    10.大量的key需要设置同一时间过期,一般需要注意什么

        如果大量的key过期时间设置过于集中,到过期的时间点,redis可能会出现短暂的卡顿现象,一般需要在时间上加上一个随机值,使得过期时间分散一点

    11.redis如何做持久化的

         bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。在redis实例重启时,会使用bgsave持久化文件重新构建内存,再使用aof重放近期的操作指令来实现完整恢复重启之前的状态。

       机器断电:取决于aof日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。

       bgsave的原理:fork和cow。fork是指redis通过创建子进程来进行bgsave操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

     12.pipeline有什么好处,为什么用pipline?

可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。

     13.Redis同步机制

         Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

    14.Redis集群,集群的原理是什么?

          Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储

     

      待补充...

 

 

    参考博客: cnblogs.com/Young111/p/11518346.html

posted @ 2019-10-05 14:02  pamne  阅读(161)  评论(0)    收藏  举报