redis


概念:开源的,高性能key-value非关系型数据库。

优点:读写性能优异,读写速度快。

            支持数据持久化。

            支持事务,所有操作都是原子性的。

            支持的数据类型丰富,string,list,hash,set,zset

缺点:受到物理内存限制,不能支持海量数据的高性能读写。

为什要用redis?

           高性能:将用户常访问的数据存在缓存中,因此用户可以减少对数据库的访问,直接访问缓存,访问缓存就是访问内存,因此性能高。

           高并发:访问缓存的请求相比访问数据库的请求承受更高。

redis为什么快?

          redis大部分操作基于内存,内存中的数据类似于hashmap,查询的时间复杂度为O(1),因此响应快速。

          采用单线程+io多路复用技术,因此避免了多余的上下文切换和竞争。

redis有哪些数据类型?

         string,list,hash,set,zset

redis的应用场景?

       string:使用incr自增,可以做计时器。

       set:本身自动去重的特性可以做商品展示等

       zset:有序集合可以做排行榜等

       分布式锁:redis自带的命令setnx可以实现分布式锁。

redis持久化方式?

      RDB:每隔一段时间,使用快照的方式将缓存中的数据同步到磁盘中。

          工作原理:fork一个子进程,将缓存中数据同步到一个临时文件中,当持久化结束后在替换原来的rdb文件。

           优点:性能高;子进程完成操作,主进程继续护理命令。

                      数据量多时,相比AOF启动箱率高。

          缺点:间隔一段时间进程持久化,持久化期间数据可能发生丢失。安全箱不高。

      AOF:将redis的写指令记录到日志文件中,重启redis时会将日志文件中恢复数据。

          优点:数据安全性高,AOF可以使appendsync属性always,即每次写操作都会记录到aof文件中。

                    保证数据一致性,当服务器中途出现宕机情况,也可以通过redis-check-aof工具解决有问题的aof文件,保证数据的一致性。

          缺点:文件占用空间较大,应为处理同步数据,还有写操作指令集。

                     数据集大的话,redis启动效率相比RDB低。

         默认是RDB形式,当开启AOF形式后,会优先选择AOF形式。

redis缓存和持久化怎么做扩容?

        缓存:使用一致哈希原则实现动态扩容。

redis的过期键的删除策略?

     1.立即过期:每个key设置一个过期时间,当过期时间到了,立即删除对内存友好,但是会占用大量的cpu资源去处理这些过期key

     2.惰性过期:当访问一个key时,采取查看其过期时间,如果过期则删除,节省cpu资源,但是会造成内存资源浪费,存在过期key没有清理,占用内存的情况。

     3.定期过期:每个一段时间,会扫描expire字典中一定数量的key,发现过期key,则删除。

redis中key过期时间和永久时间设置?

     过期时间:expire

     永久时间:persist

什么是redis事务?

    redis中的事务是一个单独的隔离操作,这个事务中的所有命令都会序列化,有序的执行,不会被其他命令所打断。

    事务中的三个命令:multi:将命令序顺序的放进事务队列中。

                                     exec:顺序的执行队列中的命令。

                                     discard:取消队列。

 redis不支持回滚,错误的命令不执行,绕过执行正常的命令。

redis实现分布式锁?

,redis采用单进程单线程模式,使用队列模式将并发访问变成串行访问。

   redis自带的命令setnx可以实现分布式锁,当锁的时间过长,可以使用expire设置锁的过期时间。

redis并发竞争key问题?

此问题即多个系统对同一个key进行访问,但是执行顺序与理想顺序不符,可以使用基于redis分布式锁的方式解决。

缓存问题?

     缓存穿透:对不存在的key进行高并发访问,缓存中不存在,则访问数据库,造成数据库负载过高。

                解决:对空结果进行缓存,并设置较短的过期时间。

                           使用bitmap做一个白名单,将id作为偏移量,每次请求的id与bitmap中的id进行对比,如果没有则拒绝请求。

                           使用布隆过滤器;将所有可能缓存的数据哈希到一个足够大的bitmap中,不存在的数据会被拦截掉。

     缓存击穿:大量访问某一个过期的key,导致redis的命中率降低,对于数据库的访问量增大,造成负载过高。

               解决:对于热数据进行预先缓存,并且将其过期时间设置长些。

                         实时监控:对于某一key的访问过高的key实时增加其过期时间。

     缓存雪崩:某一段时间内,大量的key存在过期,导致访问服务器负载崩溃。

             解决:将key的过期时间分散开,尽量使得每个key的过期时间重复率低。

                        使用多级缓存机制,但是实现比较复杂。

    缓存预热:系统上线后,将相关的缓存数据直接加载到缓存中,尽量避免用户请求时直接访问数据库。