1、Redis为什么快

        每秒10万+的QPS。

        完全基于内存,绝大部分请求是纯粹的内存操作。

        数据结构简单,对数据操作也简单。

        采用单线程,避免不必要的上下文切换和竞争。

        使用多路I/O复用模型。

        底层实现方式以及与客户端之间通信的应用协议不一样,Redistribution自己构建了VM机制

2、Redis常用结构及其应用场景。

        String:计数器、缓存、验证码、登录信息

        list:关注列表、粉丝列表

        hash:存储多个用户信息、队列秒杀。

        set:排重、关注列表。

        sorted Set(Zset):排序、排行。

3、Redis常用命令

        String:set key value:将单个字符值关联到key,存储value。

                     get key         : 返回key对应的value。

                     mset key value key value:设置多个键值对。

                     incr key         :将key中存储的数字加一。

                     decr key        :key值减一。

                     incrby key number:key值+number。

                     decrby key number:key值-number。

                     setex key seconds value:给key-value设置过期时间。

                     getset key value:给key设置值,返回key以前的值。

         set    :sadd key value value:将多个元素加入到集合key中,值不重复。

                      smembers key:返回集合key中所有元素。

                      srem key member:移除集合key中多个member元素。

                      scard key:返回key的基数。

                      sdiff key[key。。]:返回集合与给定集合的差集。

                      sismember key member:判断key集合中是否包含member元素。

        list      :lpush key value value:将多个值从表右边添加到集合key中。

                      rpush key value value:将多个值从表左边添加到集合key中。

                      lrange key start  stop:查询start到stop之间的数据。stop为-1查询所有。

                      lpop key:移除最左边元素

                      rpop key:移除最右边元素

                      lrem key count value:移除列表key中第count个value。

                                                             count:正数:左边开始;0:所有;负数:右边开始

        zset    :zadd key zs 150 ls 160:有序集合key中,zs为150,ls为160的。

                      zcard key:返回key中元素的个数。        

                      zcount key min max:返回集合key中在max到min之间的元素。

                      zpopmax key [count] :删除key中最高分数前count个元素。默认1可不写。

                      zpopmin key [count]:同上,删除的是最低分数。

                      zrank key member:返回member在集合key中从小到大的排名。        

                      zrevrank key member:同上,从大到小。

        hash   :hset key field value:给key设置field、value键值对

                      hget key field:获取key中建为name的值。

                      hmset key field value field value:给集合key设置两个键值对

                      hmget key field filed:获取集合key中两个field建的值。

                      hkeys key:返回key所有值中的key

                      hvals key:返回key所有值中的值

                      hgetall key:返回key中所有键值对。     

4、如何Redis数据防止丢失

        通过Redis持久化,把内存中的数据和命令保存到磁盘中做备份。当Redis宕机,重启服务后可以从磁盘中的备份恢复数据。

5、持久化是什么。有几种方式

        持久化:将内存中的数据备份到磁盘的过程。

        方式:AOF、RDB。通过配置redis.conf进行配置。

6、AOF、RDB。

        AOF:记录写命令。格式清晰、容易理解、数据更安全,采用append模式,即使持久化过程中宕机,也不会引起数据丢失。文件体积大,恢复慢。

        RDB:记录数据快照。文件体积小,恢复速度快。因为他每隔一段时间保存一次,所以可能会丢失数据。

7、Redis淘汰策略

        volatile-lru:从已设置过期时间的数据里面挑选使用最少的数据

        volatile-ttl:从已设置过期时间的数据里面挑选将要过期的数据

        volatile-random:从已设置过期时间的数据里面随机挑选

        allkeys-lru:从数据中挑选最少使用的数据

        allkeys-random:随机挑选

        no-enviction:不使用淘汰。

8、Redis事务

        基于commands队列,没开启事务command直接执行提交、开启事务后command则进入排队状态,依次执行。不满足原子性,成功操作不会回滚,失败不影响后续执行。

9、Redis如何实现一对多发消息

        发布订阅实现:订阅者通过SUBSCRIBE channel命令订阅某个频道,发布者通过publish channel message向该频道发送消息,则该频道所有订阅者都可以收到消息。

10、数据库和Redis的数据一致性怎么做的

        在修改数据库后,直接删除Redis中的数据,重新从数据库获取最新的数据

        阿里的canal:canal模拟MySQL Slave的交互协议向MySQL master发送dump请求。master接收到请求后返回binLog日志给slave(这里的slave只canal)canal解析接收到的binlog对象。

11、缓存击穿,穿透,雪崩

       击穿:缓存中没有但是数据库有的数据(一般只缓存到期)

解决:1、设置热点数据不过期

                            2、互斥锁。在缓存失效时,就对当前key进行枷锁,去数据库查,并赋值给这个key,操作成功后释放锁。

                           3、接口限流熔断、降级

穿透:用户不断请求缓存和数据库都没有数据。

解决:1、对用户权限进行校验、对id进行基础校验

                         2、对没有值的key做空处理。缓存有效期设短。

雪崩:缓存中数据大量过期,而数据查询量大。引起数据库压力大甚至宕机

解决:1、数据过期时间不要设在一起   

                         2、可以的话把缓存搞到不同数据库

                         3、设置热点数据吧过期