参考博客

http://www.cnblogs.com/wupeiqi/articles/5132791.html

- 基本操作

    - 连接
        - 直接连接:
            import redis 
            r = redis.Redis(host='10.211.55.4', port=6379)
            r.set('foo', 'Bar')
            print r.get('foo')
        - 连接池:
            import redis
            pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
             
            r = redis.Redis(connection_pool=pool)
            r.set('foo', 'Bar')
            print r.get('foo')
    
    - 5大数据类型
        - 字符串 "sadf"
            - set('k1','123',ex=10)
            - get 
            - mset
            - mget
            - incr
            - 超时时间:
                import redis 
                r = redis.Redis(host='10.211.55.4', port=6379)
                r.set('foo', 'Bar',ex=10)
        - 字典 {'k1':'v1'}
            - hset(name, key, value)
            - hmset(name, mapping)
            - hget(name,key)
            - 超时时间(字典,列表、集合、有序结合相同):
                import redis 
                conn = redis.Redis(host='10.211.55.4', port=6379)
                conn.hset('n1', 'k1','123123')
                conn.expire('n1',10)
            - 如果一个字典在redis中保存了10w个值,我需要将所有值全部循环并显示,请问如何实现?
                
                for item in r.hscan_iter('k2',count=100):
                    print item
                    
        - 列表 [11,11,22,33]
            - lpush
            - rpush
            - lpop
            - blpop
            - rpop
            - brpop
            - llen
            - lrange
            - 如果一个列表在redis中保存了10w个值,我需要将所有值全部循环并显示,请问如何实现?
                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)
                
        - 集合 {'alex','oldboy','日天'}
            
        - 有序集合 {('alex',59),('oldboy',100),('日天',1)}
    
    - 公共操作:
        - delete(*names)
        - keys(pattern='*')
        expire(name ,time)
        ...

- 事务 
    import redis

    pool = redis.ConnectionPool(host='10.211.55.4', port=6379)

    conn = redis.Redis(connection_pool=pool)

    # pipe = r.pipeline(transaction=False)
    pipe = conn.pipeline(transaction=True)
    # 开始事务
    pipe.multi()

    pipe.set('name', 'alex')
    pipe.set('role', 'sb')
    pipe.lpush('roless', 'sb')

    # 提交
    pipe.execute()
    
    注意:咨询是否当前分布式redis是否支持事务

- 检测,watch
    面试题:你如何控制剩余的数量不会出问题?
        - 通过redis的watch实现
            import redis
            conn = redis.Redis(host='127.0.0.1',port=6379)

            # conn.set('count',1000)
            val = conn.get('count')
            print(val)

            with conn.pipeline(transaction=True) as pipe:

                # 先监视,自己的值没有被修改过
                conn.watch('count')

                # 事务开始
                pipe.multi()
                old_count = conn.get('count')
                count = int(old_count)
                print('现在剩余的商品有:%s',count)
                input("问媳妇让不让买?")
                pipe.set('count', count - 1)

                # 执行,把所有命令一次性推送过去
                pipe.execute()
        - 数据库的锁 
        
- 发布和订阅,只要有任务就所有订阅者每人一份。
    发布者:
        import redis

        conn = redis.Redis(host='127.0.0.1',port=6379)
        conn.publish('104.9MH', "hahahahahaha")
    订阅者:
        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)
                
- 主从复制
    优势:
        - 高可用
        - 分担主压力
    注意: 
        - slave设置只读
    
    
    从的配置文件添加以下记录,即可:
        slaveof 1.1.1.1 3306 

- 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-cluster

   redis集群、分片、分布式redis        
   redis-py-cluster

问题:
    目前你们公司项目1000用户,QPS=1000 ,如果用户猛增10000w?
    项目如何提高的并发?
    
    1. 数据库读写分离
    2. 设置缓存
    3. 负载均衡
posted on 2018-05-21 21:10  Py行僧  阅读(135)  评论(0编辑  收藏  举报