• redis介绍及常见问题总结


    1.redis

      c语言编写的一个开源软件,使用字典结构存储数据,支持多种类型数据类型

      数据类型:字符串,字典,列表,集合,有序集合

    2.redis特点

      速度快:c语言实现的,所有数据都存储在计算机内存中

      持久化:他会将数据定期保存到文件系统中,但redis节点故障时,数据文件可以从redis数据文件恢复

      支持多种数据结构:字典,集合,列表,有序集合,字符串

      支持多种语言的API:JAVA,C,php,python,Ruby,node.js,C++等

      功能齐全:支持事物,发布/订阅,LUA脚本等功能

      主从复制:主服务器(master)执行添加、修改、删除,从服务器执行查询

      高可用及分布式:2.8版本支持高可用,3.0支持分布式

    3.Memcached和Redis对比

      1.性能上:Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis。

      2.内存空间和数据量大小:Memcached可以修改最大内存,采用LRU算法。Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB

      3.操作便利上:Memcached数据结构单一,而Redis支持更加丰富的数据类型

      4.可靠性:MemCached不支持数据持久化,断电或重启后数据消失。Redis支持数据持久化和数据恢复和集群,允许单点故障

      5.应用场景:

        Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)      

        Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)

     4.redis的持久化策略

    RDB:每隔一段时间对redis进行一次持久化。

      - 缺点:数据不完整 - 优点:速度快

    AOF:把所有命令保存起来,如果想到重新生成到redis,那么就要把命令重新执行一次。

      - 缺点:速度慢,文件比较大 - 优点:数据完整

    5.其他常见问题

    如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?

    - 如果一个列表在redis中保存了10w个值,我需要将所有值全部循环并显示,请问如何实现?
           一个一个取值,列表没有iter方法,但能自定义
         def list_scan_iter(name,count=3):
                start = 0
                while True:
                    result = conn.lrange(name, start, start+count-1)
                    start += count
                    if not result:
                        break
                    for item in result:
                        yield item
    
            for val in list_scan_iter('num_list'):
                print(val)
      场景:投票系统,script-redis

    redis如何实现主从复制以及数据同步?

    # 实现主从复制
        '创建6379和6380配置文件'
        redis.conf:6379为默认配置文件,作为Master服务配置;
        redis_6380.conf:6380为同步配置,作为Slave服务配置;
        '配置slaveof同步指令'
        在Slave对应的conf配置文件中,添加以下内容:
        slaveof 127.0.0.1 6379
    # 数据同步步骤:
        (1)Slave服务器连接到Master服务器.
        (2)Slave服务器发送同步(SYCN)命令.
        (3)Master服务器备份数据库到文件.
        (4)Master服务器把备份文件传输给Slave服务器.
        (5)Slave服务器把备份文件数据导入到数据库中.
    
    优势:
        - 高可用
        - 分担主压力
    注意: 
        - slave设置只读

    redis中sentinel的作用?

    帮助我们自动在主从之间进行切换(哨兵)
    检测主从中 主是否挂掉,且超过一半的sentinel检测到挂了之后才进行进行切换。
    如果主修复好了,再次启动时候,会变成从。
    
    启动主redis:
        redis-server /etc/redis-6379.conf  启动主redis
        redis-server /etc/redis-6380.conf  启动从redis
            
    在linux中:
            找到 /etc/redis-sentinel-8001.conf  配置文件,在内部:
                - 哨兵的端口 port = 8001
                - 主redis的IP,哨兵个数的一半/1
            
            找到 /etc/redis-sentinel-8002.conf  配置文件,在内部:
                - 哨兵的端口 port = 8002
                - 主redis的IP, 1 
        
            启动两个哨兵 

    实现redis集群

    #基于【分片】来完成。
        - 集群是将你的数据拆分到多个Redis实例的过程
        - 可以使用很多电脑的内存总和来支持更大的数据库。
        - 没有分片,你就被局限于单机能支持的内存容量。
    #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的算法转换成一个数字,然后再将该数字和16384求余,
        - 如果得到的余数 3000,那么就将该值写入到 192.168.1.20 实例中。
    #集群方案:
        - redis cluster:官方提供的集群方案。
        - codis:豌豆荚技术团队。
        - tweproxy:Twiter技术团队。

    redis中默认的哈希槽

    #redis中默认有 16384 个哈希槽。

    redis支持的过期策略(6个)

    # 数据集(server.db[i].expires)
    a、voltile-lru:    #从已设置过期时间的数据集中,挑选最近频率最少数据淘汰
    b、volatile-ttl:   #从已设置过期时间的数据集中,挑选将要过期的数据淘汰
    c、volatile-random:#从已设置过期时间的数据集中,任意选择数据淘汰
    d、allkeys-lru:       #从数据集中,挑选最近最少使用的数据淘汰
    e、allkeys-random:    #从数据集中,任意选择数据淘汰
    f、no-enviction(驱逐):#禁止驱逐数据

    MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?

    # 限定Redis占用的内存,根据自身数据淘汰策略,淘汰冷数据,把热数据加载到内存。
    # 计算一下 20W 数据大约占用的内存,然后设置一下Redis内存限制即可。

    什么是codis及其作用?

    Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说,
    连接到 Codis-Proxy(redis代理服务)和连接原生的 Redis-Server 没有明显的区别, 
    上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 
    所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.

    什么是twemproxy机器及其作用?

    # 什么是Twemproxy 
    是Twtter开源的一个 Redis 和 Memcache 代理服务器,
    主要用于管理 Redis 和 Memcached 集群,减少与Cache服务器直接连接的数量。
    他的后端是多台REDIS或memcached所以也可以被称为分布式中间件# 作用
        通过代理的方式减少缓存服务器的连接数。
        自动在多台缓存服务器间共享数据。
        通过配置的方式禁用失败的结点。
        运行在多个实例上,客户端可以连接到首个可用的代理服务器。
        支持请求的流式与批处理,因而能够降低来回的消耗。

    redis中的watch命令的作用?

      用于监视一个或多个key, 如果在事务执行之前这个/些key被其他命令改动,那么事务将被打断

    基于redis商城商品数量计数器(使用watch命令)

    import redis
    
    conn = redis.Redis(host='192.168.1.41',port=6379)
    
    conn.set('count',1000)
    
    with conn.pipeline() as pipe:
    
        # 先监视,自己的值没有被修改过
        conn.watch('count')
    
        # 事务开始
        pipe.multi()
        old_count = conn.get('count')
        count = int(old_count)
        if count > 0:  # 有库存
            pipe.set('count', count - 1)
    
        # 执行,把所有命令一次性推送过去
        pipe.execute()

    redis分布式锁heredlock实现机制

    实现
    - 写值并设置超时时间
    - 超过一半的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:
        # 进行操作
        # 解锁,release
        dlm.unlock(my_lock)
    else:
        print('获取锁失败')

    一致性哈希概念

    # 一致性哈希
    一致性hash算法(DHT)可以通过减少影响范围的方式,解决增减服务器导致的数据散列问题,从而解决了分布式环境下负载均衡问题;
    如果存在热点数据,可以通过增添节点的方式,对热点区间进行划分,将压力分配至其他服务器,重新达到负载均衡的状态。
    # 模块:hash_ring

    如何高效的找到redis中所有以zhugc开头的key?

      可以使用keys命令来加速查找

    # 语法:KEYS pattern
    # 说明:返回与指定模式相匹配的所用的keys。
    该命令所支持的匹配模式如下:
    1、?:用于匹配单个字符。例如,h?llo可以匹配hello、hallo和hxllo等;
    2、*:用于匹配零个或者多个字符。例如,h*llo可以匹配hllo和heeeello等;
    2、[]:可以用来指定模式的选择区间。例如h[ae]llo可以匹配hello和hallo,但是不能匹配hillo。同时,可以使用“/”符号来转义特殊的字符
    # 注意
    KEYS 的速度非常快,但如果数据太大,内存可能会崩掉,
    如果需要从一个数据集中查找特定的key,最好还是用Redis的集合结构(set)来代替。

     如何基于redis实现发布和订阅?

    # 发布和订阅,只要有任务就所有订阅者每人一份。
    发布者: #发布一次
        import redis
        conn = redis.Redis(host='127.0.0.1',port=6379)
        conn.publish('104.9MH', "hahahahahaha")
    订阅者: #'while True'一直在接收
        import redis
        conn = redis.Redis(host='127.0.0.1',port=6379)
        pub = conn.pubsub()
        pub.subscribe('104.9MH')
        while True:
            msg= pub.parse_response()
            print(msg)

     详细介绍链接:redis为什么这么快

  • 相关阅读:
    三个问题
    2014-7
    2014-5
    2014-2
    2014-1
    2013-11
    mysql中对表操作----为所有列插入数据
    Redis做消息队列
    收集Nginx-access,Nginx-error日志
    .Nginx安装filebeat收集日志:
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9531296.html
Copyright © 2020-2023  润新知