zoukankan      html  css  js  c++  java
  • python 操作 Redis

    Redis 模块基本介绍

    参考

    数据缓存系统:

    • mongodb:直接持久化,直接存储在于硬盘的缓存系统(有疑问)
    • redis:半持久化,存储于内存和硬盘
    • memcache:数据只能存储在内存里的缓存系统

    redis

    redis是一个key-value存储系统,支持的数据类型:

    • string
    • list
    • zet
    • szet(有序集合)
    • hash(哈希类型)

    这些数据类型都支持:push/pop,add/remove及取交集、并集和差集。关键的是,这些操作都是原子性

    redis-py 的 API

    • 连接方式和连接池
    • 操作:string操作、hash操作、list操作、set操作、sort set 操作
    • 管道(pipeline)的使用
    • 发布订阅
      redis-py GitHub 链接

    连接 redis

    连接方式:redis 提供了2个类

    1. StrictRedis:实现了大部分官方的命令
    2. Redis:是 StrictRedis 的子类,用于向后兼容旧版的Redis

    普通连接

    import redis
    
    redis_config = {
        "host": "192.168.189.100",
        "port": 6379
    }
    # redis连接对象
    redis_conn = redis.Redis(**redis_config)
    
    redis_conn.set("name","ping")
    print redis_conn.get("name")
    
    

    连接池

    管理对一个 redis server 的所有连接,避免每次建立,释放连接的开销。默认,每个redis实例后悔维护一个自己的连接池,可以直接建立一个连接池,作为参数传给redis,这样可以实现多个redis实例共享一个连接池。

    import redis
    
    redis_config = {
        "host": "192.168.189.100",
        "port": 6379
    }
    
    redis_pool = redis.ConnectPool(**redis_config)
    r = redis.Redis(connection_pool=redis_pool)
    r.set('name','qiang')
    print r.get('name')
    
    

    redis 字符串操作

    redis中的String在在内存中按照一个name对应一个value来存储

    set() 参数:
    set(name, value, ex=None, px=None, nx=False, xx=False)
    ex,过期时间(秒)
    px,过期时间(毫秒)
    nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
    xx,如果设置为True,则只有name存在时,当前set操作才执行

    单次设置key-value

    import redis
    
    redis_config = {
        "host": "192.168.189.100",
        "port": 6379
    }
    
    # 新建一个连接池
    redis_pool = redis.ConnectionPool(**redis_config)
    # 新建一个 Redis 连接对象
    r = redis.Redis(connection_pool=redis_pool)
    # 在 Redis 中设置值,若不存在则新建,存在则替换
    r.set("name","ping")
    
    print r.get("name")
    

    批量设置key-value

    import redis
    
    redis_config = {
        "host": "192.168.189.100",
        "port": 6379
    }
    
    # 新建一个连接池
    redis_pool = redis.ConnectionPool(**redis_config)
    # 新建一个 Redis 连接对象
    r = redis.Redis(connection_pool=redis_pool)
    # 在 Redis 中设置值,若不存在则新建,存在则替换
    
    k_v_pair = {
        "alpha": "a",
        "bete": "b",
        "gamma": "c"
    }
    # 批量设置值
    r.mset(**k_v_pair)
    
    # 批量取值
    print r.mget("alpha", "bete", "gamma")
    
    

    redis list操作

    redis中的List在内存中按照一个name对应一个list来存储

    lpush(name,values)

    #在 name 对应的list中添加元素,每个新的元素都添加到列表的最左边
    r.lpush("list1","alpha")
    r.lpush("list1",3,4,5)
    # 查看列表结果
    print r.lrange("list1",0,-1)
    # 结果
    ['5', '4', '3', 'alpha']
    

    rpush(name,values)

    # 同lpush,但每个新的元素都添加到列表的最右边
    

    lpushx(name,value)

    # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边,否则为空
    

    rpushx(name,value)

    # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边,否则为空
    

    llen(name)

    # name 对应的list元素的个数
    print r.llen("list1")
    

    linsert(name,where,refvalue,value)
    参数对应:
    name: redis的name
    where: BEFORE(前)或AFTER(后)
    refvalue: 列表内的值
    value: 要插入的数据

    # 在name对应的列表的某一个值前或后插入一个新值
    r.linsert("list1","BEFORE","alpha","bete")  #在列表内找到第一个元素alpha,在其之前插入 beta
    
    

    lset(name,index,value)

    # 对list中的某一个索引位置重新赋值,替换掉以前的元素
    r.lset("list1",0,"beta")
    

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

    # 删除name对应的list中的指定值
    r.lrem("list1","beta",num=1)
    

    r.lpop(name)

    # 移除列表的左侧第一个元素,并返回,相当于出桟
    print r.lpop("list1")
    
    

    r.lindex(name,index)

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

    lrange(name,start,end)

    # 分片获取元素,如获取整个list
    print r.lrange("list1",0,-1)
    

    ltrim(name,start,end)

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

    rpoplpush(src,dst)

    # 从一个列表取出最右边的元素,同时将其添加到另一个列表的最左边
    # src 要取数据的列表
    # dst 要添加数据的列表
    

    brpoplpush(src,dst,timeout=0)

    # 同rpoplpush,多了timeout
    # timeout:取数据的列表没元素后的阻塞时间,0为一直阻塞
    r.brpoplpush("list1","list2",timeout=0)
    
    

    blpop(keys,timeout)

    # 将多个列表排序,按照从左到右去移除各个列表内的元素
    r.lpush("list1",3,4,5)
    r.lpush("list2",3,4,5)
    
    while True:
        print r.blpop(["list1","list2"],timeout=0)
        print r.lrange("list1",0,-1),r.lrange("name",0,-1)
    
    #结果如下:
    ('list1', '5')
    ['4', '3'] ['5', '4', '3']
    ('list1', '4')
    ['3'] ['5', '4', '3']
    ('list1', '3')
    [] ['5', '4', '3']
    ('list2', '5')
    [] ['4', '3']
    ('list2', '4')
    [] ['3']
    ('list2', '3')
    [] []
    

    brpop(keys,timeout)

    # 同 blpop,将多个列表排序,按照从右往左移除各个列表内的元素
    

    redis set操作

    set集合就是不重复的列表

    sadd(name,values)

    # 给name对应的集合中添加元素
    r.sadd("set1","aa")
    r.sadd("set2","aa",1,2,"bb")
    

    smembers(name)

    # 获取name对应的集合的所有成员
    

    scard(name)

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

    有序集合

    在集合的基础上,为每个元素排序,元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用开做排序。

    zadd(name,*args,**kwargs)

    # 在name对应的有序集合中添加元素
    r.zadd("set1","a",1,"b",2,"c",3)
    # 或者
    r.zadd("set1",b1=10,b2=5)
    

    zcard(name)

    # 获取有序集合内元素的数量
    

    zcount(name,min,max)

    # 获取有序集合中分数在[min,max]之间的个数
    print r.zcount("set1",1,5)
    

    Redis Hash操作

    hashRedis2.0后增加的一种数据类型,类似大多数编程语言中的map数据结构一样,Redis是键值对的集合,也就是说它存放的是字符串和字符串之间的映射。由于这个特性,hash特别适用于存储一个对象。讲一个对象存储在hash中会占用更少的内存,并且可以方便的存取整个对象。

    hset命令

    hset 命令用来就爱那个某个hash指定键的值,如果间不存在,则创建并设置对应的值,返回一个整数1,如果键已经存在,则对应的值将被覆盖并返回整数0.具体格式为:

    hset hash_name field value
    
    #示例:
    
    127.0.0.1:6379> hset myhash name fred
    (integer) 1
    127.0.0.1:6379> hset myhash name fred2
    (integer) 0
    

    ** hmset 命令**

    hmset命令和hset命令的作用相似,可以用来设置hash的键和值。不同的是hmset可以同时设置多个键值对,操作成功后hmset命令返回一个简单的字符串'ok'.具体格式如下:

    hmset hash_name field1 value1 field2 value2...
    
    #示例
    127.0.0.1:6379> hmset myhash name fred age 24
    OK
    127.0.0.1:6379> hget myhash name
    "fred"
    127.0.0.1:6379> hget myhash age
    "24"
    
    

    hsetnx 命令

    hsetnx 命令也用来在指定键不存在的情况下设置键值信息。如果键不存在,则Redis会先创建键,然后设置对应的值,操作成功后返回整数1。如果该键已经存在,则该命令不进行任何操作,返回值为0.具体格式如下:

    hsetnx hash_name field value
    
    #示例
    127.0.0.1:6379> hsetnx myhsh address hangzhou
    (integer) 1
    127.0.0.1:6379> hsetnx myhsh address guangzhou
    (integer) 0
    127.0.0.1:6379> hget myhsh address
    "hangzhou"
    

    hget命令

    hget 命令用开获取某个hash指定key的值。如果该键存在,直接返回对应的值,否则返回nil。具体格式如下:

    hget hash_name field
    
    #示例
    127.0.0.1:6379> hset myhash name fred
    (integer) 0
    127.0.0.1:6379> hget myhash name
    "fred"
    127.0.0.1:6379> hget myhash nonkey
    (nil)
    

    hmget命令

    hmget命令和hget命令类似,用来返回某个hash多个键的值的列表,对于不存在的键,返回nil值。具体格式如下:

    hmget hash_name field1 field2...
    
    #示例
    127.0.0.1:6379> hmset myhash name fred age 24
    OK
    127.0.0.1:6379> hmget myhash name age weight
    1) "fred"
    2) "24"
    3) (nil)
    
    

    hexists命令

    hexists命令令用来判断某个hash指定键是否存在,若存在返回整数1,否则返回0。具体格式如下:

    hexists hash_name field
    
    #示例
    127.0.0.1:6379> hset myhash name fred
    (integer) 0
    127.0.0.1:6379> hexists myhash name
    (integer) 1
    127.0.0.1:6379> hexists myhash home
    (integer) 0
    
    

    hlen命令

    hlen命令用来返回某个hash中所有键的数量。具体格式如下:

    hlen hash_name
    
    #示例:
    127.0.0.1:6379> hmset myhash name fred age 24
    OK
    127.0.0.1:6379> hlen myhash
    (integer) 2
    127.0.0.1:6379> hlen nonhash
    (integer) 0
    
    
    

    hdel命令

    hdel命令用来删除某个hash指定的键,如果该键不存在,则不进行任何操作。hdel命令的返回值是成功删除的键的数量(不包括不存在的键)。具体格式为:

    hdel hash_name field:
    
    #示例
    127.0.0.1:6379> hmset myhash name fred age 24
    OK
    127.0.0.1:6379> hdel myhash name age
    (integer) 2
    127.0.0.1:6379> hmget myhash name age
    1) (nil)
    2) (nil)
    

    hgetall命令

    hgetall命令返回一个列表,该列表包含了某个hash的所有键和值。在返回值中,先是键,接下来的一个元素是对应的值,所以hgetall命令返回的列表长度是hash大小的两倍。具体格式如下:

    hgetall hash_name
    
    #示例
    127.0.0.1:6379> hmset myhash name fred age 24
    OK
    127.0.0.1:6379> hgetall myhash
    1) "name"
    2) "fred"
    3) "age"
    4) "24"
    
    

    其他操作

    在redis客户端中执行

    # 根据name删除redis中的任意数据类型
    delete(*name)
    
    # 检测redis的name是否存在
    exists(name)
    
    # 根据 *?等通配符匹配获取redis的name
    keys(pattern='*')
    
    # 为某个name设置超时时间
    expire(name,time)
    
    # 重命名
    rename(src,dst)
    
    # 将redis的某个值移动到指定的db下
    move(name,db)
    
    # 随机获取一个redis的name(不删除)
    randomkey()
    
    # 获取name对应值的类型
    type(name)
    
    
  • 相关阅读:
    java中使用MD5加密的算法
    [转]自定义注释@interface的用法
    [转]Spring IOC详解
    [转]sed命令详解
    SimpleDateFormat线程不安全问题处理
    Unable to locate the Javac Compiler 解决办法
    MySQL ERROR 1045错误解决办法
    Python装饰器学习(九步入门)
    python 可变参数函数定义* args和**kwargs的用法
    如何更好的利用Node.js的性能极限
  • 原文地址:https://www.cnblogs.com/pingqiang/p/7892906.html
Copyright © 2011-2022 走看看