zoukankan      html  css  js  c++  java
  • Python Redis

      redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

      Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便,Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。

      redis是用于操作内存的一个软件。

      1、可以做持久化,且有两种模式:AOF和RDB
      2、相当于一个大字典,存储的是key/value
      3、单进程单线程,请求多则排队,一个个处理
      4、支持5大数据类型
        a.字符串
        b.列表
        c.集合
        d.字典
        e.有序集合

    1.连接Redis数据库:

    1)直接连接

    import redis
    
    red = redis.Redis(host='localhost',port=6379,db=1)

    2)连接池连接

    连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作,这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能。redis模块采用ConnectionPool来管理对redis server的所有连接。

    pool = redis.ConnectionPool(host='localhost',port=6379,db=1)    # 创建一个连接池
    conn = redis.Redis(connection_pool=pool,max_connections=1000)       # 调用连接池,并指定最多连接数
    conn.set('k2','v2') # 设置值
    print(conn.get('k2'))   # 取值
    
    如果想更方便的使用,则创建一个redis_pool的连接池,将pool = redis.ConnectionPool(host='localhost',port=6379,db=1,max_connections=1000)独立文件中
    在redis_pool文件中
    import redis
    POOL = redis.ConnectionPool(host='182.254.210.59',port=6379,password='123123',max_connections=1000)
    在redis操作文件中
    from redis_oper.redis_pool import POOL
    conn = redis.Redis(connection_pool=POOL)
    conn.set('k2','v2')
    print(conn.get('k2'))

    2.String类型存取:

    set(self, name, value, ex=None, px=None, nx=False, xx=False)

    #在Redis中设置值,默认不存在则创建,存在则修改
    red.set('key', 'value')
    #参数:
    #     set(name, value, ex=None, px=None, nx=False, xx=False)
    #     ex,过期时间(秒)
    #     px,过期时间(毫秒)
    #     nx,如果设置为True,则只有key不存在时,当前set操作才执行,同#setnx(key, value)
    #     xx,如果设置为True,则只有key存在时,当前set操作才执行
    
    
    setex(self, name, value, time)
    #设置过期时间(秒)
    
    psetex(self, name, time_ms, value)
    #设置过期时间(豪秒)

    mset(self, *args, **kwargs)

    #批量设置值
    red.mget({"key1":'value1', "key2":'value2'})

    get(self, name)

    #获取某个key的值
    red.get('key1')

    mget(self, keys, *args)

    #批量获取
    red.mget("key1","key1")

    strlen(self, name)

    #返回key对应值的字节长度(一个汉字3个字节)
    red.strlen("key")

    append(name, value)

    #在name对应的值后面追加内容
    red.set("key","value")
    print(r.get("key"))    #输出:'value'
    r.append("key","one")
    print(r.get("key"))    #输出:'valueone'

    3.Hash类型:一个name对应一个dic字典来存储。

    hset(self, name, key, value)

    red.hset("name","key","value")
    #在name对应的hash中根据key获取value
    print(red.hget("name","key"))#输出:'value'

    hget(self, name, key)

    red.hset("name","key","value")
    #在name对应的hash中根据key获取value
    print(red.hget("name","key"))#输出:'value'

    hgetall(self, name)

    #获取name所有键值对
    red.hgetall("name")

    hmset(self, name, mapping)

    #在name对应的hash中批量设置键值对,mapping:字典
    dic={"key1":"aa","key2":"bb"}
    red.hmset("name",dic)
    print(red.hget("name","key2"))#输出:bb

    hmget(self, name, keys, *args)

    #在name对应的hash中批量获取键所对应的值
    dic={"key1":"aa","key2":"bb"}
    red.hmset("name",dic)
    print(red.hmget("name","key1","key2"))#输出:['aa', 'bb']

    hlen(self, name)

    #获取hash键值对的个数
    print(red.hlen("name"))#输出:2

    hkeys(self, name)

    #获取hash中所有key
    red.hkeys("name")

    hvals(self, name)

    #获取hash中所有value
    red.hvals("name")

    hexists(self, name, key)

    #检查name对应的hash是否存在当前传入的key
    print(red.hexists("name","key1"))#输出:Ture

    hdel(self, name, *keys)

    #删除指定name对应的key所在的键值对,删除成功返回1,失败返回0
    print(red.hdel("name","key1"))#输出:1

    hincrby(self, name, key, amount=1)

    #与hash中key对应的值相加,不存在则创建key=amount(amount为整数)
    print(red.hincrby("name","key",amount=10))#返回:10

    4.list类型:一个name对应一个列表存储。

    lpush(self, name, *values)

    #元素从list的左边添加,可以添加多个
    red.lpush('name','元素1','元素2')

    rpush(self, name, *values)

    #元素从list右边添加,可以添加多个
    red.rpush('name','元素1','元素2')

    lpushx(self, name, *values)

    #当name存在时,元素才能从list的左边加入
    red.lpushx('name','元素1')

    rpushx(self, name, *values)

    #当name存在时,元素才能从list的右边加入
    red.rpushx('name','元素1')

     llen(self, name)

    #name列表长度
    red.llen('name')

    linsert(self, name, where, refvalue, value)

    # 在name对应的列表的某一个值前或后插入一个新值
    red.linsert("name","BEFORE","元素2","元素1.5")#在列表内找到第一个"元素2",在它前面插入"元素1.5"
    
    #参数:
    #     name: redis的name
    #     where: BEFORE(前)或AFTER(后)
    #     refvalue: 列表内的值
    #     value: 要插入的数据

    lset(self, name, index, value)

    #对list中的某一个索引位置重新赋值
    red.lset("name",0,"abc")

    lrem(self, name, value, num=0)

    #删除name对应的list中的指定值
    red.lrem("name","元素1",num=0)
    
    # 参数:
    #    name:  redis的name
    #    value: 要删除的值
    #    num:   num=0 删除列表中所有的指定值;
    #           num=2 从前到后,删除2个;
    #           num=-2 从后向前,删除2个'''

    lpop(self, name)

    #移除列表的左侧第一个元素,返回值则是第一个元素
    print(red.lpop("name"))

    lindex(self, name, index)

    #根据索引获取列表内元素
    print(red.lindex("name",1))

    lrange(self, name, start, end)

    #分片获取元素
    print(red.lrange("name",0,-1))

    ltrim(self, name, start, end)

    #移除列表内没有在该索引之内的值
    red.ltrim("name",0,2)

    5.set类型:集合是不允许重复的列表

    sadd(self, name, *values)

    #给name对应的集合中添加元素
    red.sadd("name","aa")
    red.sadd("name","aa","bb")

    scard(self, name)

    #获取name对应的集合中的元素个数
    red.scard("name")

    smembers(self, name)

    #获取name对应的集合的所有成员
    red.smembers('name')

    sdiff(self, keys, *args)

    #在第一个name对应的集合中且不在其他name对应的集合的元素集合
    red.sadd("name","aa","bb")
    red.sadd("name1","bb","cc")
    red.sadd("name2","bb","cc","dd")
    
    print(red.sdiff("name","name1","name2"))#输出:{aa}

    sismember(self, name, value)

    #检查value是否是name对应的集合内的元素

    smove(self, src, dst, value)

    #将某个元素从一个集合中移动到另外一个集合

    spop(self, name)

    #从集合的右侧移除一个元素,并将其返回

    6.其他常用操作

    flushdb(self,asynchronous=False)

    #清空当前db中的数据,默认是同步。若开启异步asynchronous=True,会新起一个线程进行清空操作,不阻塞主线程

    flushall(self,asynchronous=False)

    #清空所有db中的数据,默认是同步。异步同flushdb

    delete(self, *names)

    #根据name删除redis中的任意数据类型

    exists(self, name)

    #检查redis的name是否存在

    keys(self, pattern='*')

    #根据* ?等通配符匹配获取redis的name

    expire(self,name ,time)

    #为某个name的设置过期时间

    rename(self, src, dst)

    #重命名

    move(self, name, db))

    # 将redis的某个name移动到指定的db下

    randomkey(self)

    #随机获取一个redis的name(不删除)

    type(self, name)

    # 获取name对应值的类型
  • 相关阅读:
    配置基于全局地址池的DHCP
    配置基于接口地址池的DHCP
    将access数据库导入mysql
    php读取数据库数据,出现中文乱码(数据库中没有出现乱码)
    mysql 错误1054
    sublimetext3 安装php语法检测
    各种幻灯片特效SuperSlide
    jquery特效网
    生成loading图片
    iScroll内部textarea滑动不了bug
  • 原文地址:https://www.cnblogs.com/john-xiong/p/11797253.html
Copyright © 2011-2022 走看看