zoukankan      html  css  js  c++  java
  • python-部分redis

    数据量非常大时想向数据库中保存的时候,可以在中间加一个队列(队列的长度可以控制),可能数据库一个个取会效率慢一些,但是不会服务端不会蹦
    
    
    redis: 端口6379
            
        1.本质:向内存中存数据
        
        2.对内存的整理策略:  存贮:会把内存分成很多块,大的数据存一块,一些小的数据存一块
                            删除:过期的数据就删除掉
                            
        3.特性之一:可以做持久化(配置文件设置)
        
        4.允许存储的数据格式多:有五种
                {
                    "k1": "oldboyedu" # "666"
                    "k2": [11,22,33,44,11],
                    "k3": {11,22,33,44},
                    "k4": {
                        "n1":'xxx',
                        "n2":"iii",
                        'k1':'v1',
                        'k2': 'v2',
                        'num': 1,
                    }, # 可以迭代取值
                    "k5": {(11,1),("alex",5)}   #有序集合,根据后面数值是有序的
                }
                在redis中不区分字符串和数字,统一都叫字符串,因为正在存储的时候都是""方式存
                列表
                集合
                字典/哈希散列表
                有序集合
            
        5.数据格式字典/哈希散列表的操作:
            hset(name, key, value)
    
                # name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
                 
                # 参数:
                    # name,redis的name
                    # key,name对应的hash中的key
                    # value,name对应的hash中的value
                 
                # 注:
                    # hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建(相当于添加)
    
                    
            hmset(name, mapping)
    
                # 在name对应的hash中批量设置键值对
                 
                # 参数:
                    # name,redis的name
                    # mapping,字典,如:{'k1':'v1', 'k2': 'v2'}
                 
                # 如:
                    # r.hmset('xx', {'k1':'v1', 'k2': 'v2'})
    
                    
            hget(name,key)
    
                # 在name对应的hash中获取根据key获取value
    
                
            hmget(name, keys, *args)
    
                # 在name对应的hash中获取多个key的值
                 
                # 参数:
                    # name,reids对应的name
                    # keys,要获取key集合,如:['k1', 'k2', 'k3']
                    # *args,要获取的key,如:k1,k2,k3
                 
                # 如:
                    # r.mget('xx', ['k1', 'k2'])
                    #
                    # print r.hmget('xx', 'k1', 'k2')
    
                    
            hgetall(name)
        
                获取name对应hash的所有键值
    
                
            hlen(name)
    
                # 获取name对应的hash中键值对的个数
    
                
            hkeys(name)
    
                # 获取name对应的hash中所有的key的值
    
                
            hvals(name)
    
                # 获取name对应的hash中所有的value的值
    
                
            hexists(name, key)
    
                # 检查name对应的hash是否存在当前传入的key
    
                
            hdel(name,*keys)
    
                # 将name对应的hash中指定key的键值对删除
    
                
            hincrby(name, key, amount=1)
        
                # 自增name对应的hash中的指定key的值,不存在则创建key=amount
                # 参数:
                    # name,redis中的name
                    # key, hash对应的key
                    # amount,自增数(整数)
    
                    
            hincrbyfloat(name, key, amount=1.0)
        
                # 自增name对应的hash中的指定key的值,不存在则创建key=amount
                 
                # 参数:
                    # name,redis中的name
                    # key, hash对应的key
                    # amount,自增数(浮点数)
                 
                # 自增name对应的hash中的指定key的值,不存在则创建key=amount
    
                
            hscan(name, cursor=0, match=None, count=None)
             #先获取一部分数据
                # 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆
                 
                # 参数:
                    # name,redis的name
                    # cursor,游标(基于游标分批取获取数据)
                    # match,匹配指定key,默认None 表示所有的key
                    # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
                 
                # 如:
                    # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
                    # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
                    # ...
                    # 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕
    
            hscan_iter(name, match=None, count=None)
           #在上面hscan方法 中的取到的值,进行yield返回
                # 利用yield封装hscan创建生成器,实现分批去redis中获取数据
                 
                # 参数:
                    # match,匹配指定key,默认None 表示所有的key
                    # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
                 
                # 如:
                    # for item in r.hscan_iter('xx'):
                    #     print item
            
        6.连接池
            普通的连接:
                import redis
    
                conn = redis.Redis(host='47.93.4.198',port=6379)
                
                一些对字典/散列表/哈希的操作:
    
                    # conn.hset('k4','n1','xxx')
                    # data = conn.hget('k4','n1')
                    # print(data)
                    # conn.hset('oldboyedu', 'alex',16)
                    # conn.hincrby('oldboyedu', 'alex', amount=-1)
                    # data = conn.hget('oldboyedu', 'alex')
                    # print(data)
                    # conn.hset('oldboyedu', 'oldboy',56)
    
                    for k,v in conn.hscan_iter('oldboyedu',match="*lx"):
                        print(k,v)
            连接池:
    
                import redis
    
                pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
                conn = redis.Redis(connection_pool=pool)
                
                一些对字典/散列表/哈希的操作:
                    # conn.hset('k4','n1','xxx')
                    # data = conn.hget('k4','n1')
                    # print(data)
                    # conn.hset('oldboyedu', 'alex',16)
                    # conn.hincrby('oldboyedu', 'alex', amount=-1)
                    # data = conn.hget('oldboyedu', 'alex')
                    # print(data)
                    # conn.hset('oldboyedu', 'oldboy',56)
    
                    for k,v in conn.hscan_iter('oldboyedu',match="*lx"):
                        print(k,v)
            django的 django_redis组件
                - 需要配置文件,调用方法
                
                pip3 install django-redis 
                        
                配置文件:
                    CACHES = {
                        "default": {
                            "BACKEND": "django_redis.cache.RedisCache",
                            "LOCATION": "redis://47.93.4.198:6379",
                            "OPTIONS": {
                                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                                #"PASSWORD": "asdfasdf",
                            }
                        }
                    }
                
                # 使用
                import django_redis
                conn = django_redis.get_redis_connection()
    
            
            
  • 相关阅读:
    字节流与字符流的区别?
    启动一个线程是用run()还是start()?
    Java中的异常处理机制的简单原理和应用?
    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
    Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
    运行时异常与一般异常有何异同?
    常用清除浮动的方法,如不清除浮动会怎样?
    多线程有几种实现方法?同步有几种实现方法?
    你所知道的集合类都有哪些?主要方法?
    至少两种方式实现自适应搜索?
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/8490794.html
Copyright © 2011-2022 走看看