面试题(redis)

 
复制代码
你了解的redis?

你用redis做过什么?
    - 配合django做缓存,常用且不易修改的数据放进来(博客)
    - 购物车信息
    - Session 
        - 缓存配置文件
        - session配置文件中指定使用缓存
    - rest api中访问频率控制
    - 基于flask、websocket实现的投票系统(redis做消息队列)
    - scrapy中
        - 去重规则
        - 调度器:先进先出、后进先出、优先级队列
        - pipelines 
        - 起始URL
    - 商品热点信息
    - 计数器
    - 排行

为什么redis要做主从复制?
    目的是对redis做高可用,为每一个redis实例创建一个备份称为slave,让主和备之间进行数据同步,save/bsave。
        主:写
        从:读
    优点:
        - 性能提高,从分担读的压力。
        - 高可用,一旦主redis挂了,从可以直接代替。
    
    存在问题:当主挂了之后,需要人为手工将从变成主。
    
redis的sentinel是什么?
    帮助我们自动在主从之间进行切换
    检测主从中 主是否挂掉,且超过一半的sentinel检测到挂了之后才进行进行切换。
    如果主修复好了,再次启动时候,会变成从。
    
redis的cluster是什么?
    集群方案:
        - redis cluster 官方提供的集群方案。
        - codis,豌豆荚技术团队。
        - tweproxy,Twiter技术团队。
    redis cluster的原理?
        - 基于分片来完成。
        - redis将所有能放置数据的地方创建了 16384 个哈希槽。
        - 如果设置集群的话,就可以为每个实例分配哈希槽:
            - 192.168.1.20【0-5000】
            - 192.168.1.21【5001-10000】
            - 192.168.1.22【10001-16384】
        - 以后想要在redis中写值时,
            set k1 123 
          将k1通过crc16的算法,将k1转换成一个数字。然后再将该数字和16384求余,如果得到的余数 3000,那么就将该值写入到 192.168.1.20 实例中。
            
redis是否可以做持久化?
    RDB:每隔一段时间对redis进行一次持久化。
         - 缺点:数据不完整
         - 优点:速度快
    AOF:把所有命令保存起来,如果想到重新生成到redis,那么就要把命令重新执行一次。
         - 缺点:速度慢,文件比较大
         - 优点:数据完整
        
redis的过期策略。
    voltile-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(驱逐):禁止驱逐数据
                
redis的分布式锁实现。
    - 写值并设置超时时间
    - 超过一半的redis实例设置成功,就表示加锁完成。
    - 使用:安装redlock-py 
        from redlock import Redlock

        dlm = Redlock(
            [
                {"host": "localhost", "port": 6379, "db": 0},
                {"host": "localhost", "port": 6379, "db": 0},
                {"host": "localhost", "port": 6379, "db": 0},
            ]
        )

        # 加锁,acquire
        my_lock = dlm.lock("my_resource_name",10000)
        if  my_lock:
            # J进行操作
            # 解锁,release
            dlm.unlock(my_lock)
        else:
            print('获取锁失败')
复制代码
posted on 2019-05-14 10:59  斜阳红红  阅读(193)  评论(0编辑  收藏  举报