天天看点

Redis常用数据类型和用法

转自:http://my.oschina.net/1123581321/blog/160391

直接上代码吧 (python代码部分使用的是redis-py)

  • STRING 类似memcache ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

    from

    redis

    import

    client

    # 这个很重要, 从redis中导入client

    import

    msgpack

    # 我测试的,msgpack还没cPickle效率高,如果不跨语言就用cPickle吧

    """用key-obj(string)方式存储

    类似memcache, 主要管理好key,要唯一

    """

    r

    =

    client.Redis()

    # 默认

    # r = client.Redis(self, host='localhost', port=6379, db=0, password=None, socket_timeout=None, connection_pool=None, charset='utf-8', errors='strict', decode_responses=False, unix_socket_path=None)

    # r = client.StrictRedis.from_url("redis://127.0.0.1:6381")

    obj

    =

    {

    12

    :

    3

    }

    value

    =

    msgpack.packb(obj)

    r.

    set

    (

    "key"

    , value)

    value

    =

    r.get(

    "key"

    )

    # drivercount_epid2names

    obj

    =

    msgpack.unpackb(value)

    print

    obj

    del

    r

    # 不要忘了del r来关闭redis

    # result:

    # {12:3}

  • LIST 类似stl 的deque(双端队列),和python的list一样灵活, 详见<http://redis.io/commands#list> ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

    """LIST(列表) [1,2,3,4] [L <---> R]

    RPUSH key value [..] 在最后面添加元素

    LPUSH key value [..] 在最前面添加元素

    LINSERT key BEFORE/AFTER pre-value new-value 在其他位置插入

    LINDEX key index 根据索引获取元素(下标访问)

    LSET key index value 改变所给下边元素的值

    LRANGE mylist 0 1 (params:  key start stop)(L -> 表示list)(第一个(最L)索引0,队尾(最R)索引为-1, 类似python)

    LRANGE mylist 0 -1 >>>表示显示全部数据(因为0表示第一个(队头), -1表示最后一个(队尾))

    LTRIM mylist pos1, pos2 >>>表示只保留从pos1到pos2之间的列表(用途:只显示最新20条评论等)

    RPOP 删除最后一个元素

    LPOP 删除第一个元素

    BLPOP/BRPOP 阻塞删除,挺有意思(不懂得可以百度阻塞队列)

    LLEN mylist 获取LIST的大小

    """

    r

    =

    client.Redis()

    r.rpush(

    "mylist"

    ,

    "1"

    )

    r.rpush(

    "mylist"

    ,

    "2"

    )

    r.rpush(

    "mylist"

    ,

    "3"

    )

    #          L       R  

    r.rpush(

    "mylist"

    ,

    "4"

    )

    #  array : [1,2,3,4]

    r.lrange(

    "mylist"

    ,

    ,

    3

    )

    # r.lrange("mylist", 0, -1) / r.lrange("mylist", 0, 100) 超过数组(list)大小不报错 >>>非常类似python

    #result:

    # ['1', '2', '3', '4']

  • HASH 可以实现非key - value 模式 ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

    """用hash方式存储, field类似于key了

    hashname - field1:name1

    hashname - field2:name2

    HMSET key field value [field value ...] (H -> HASH, M -> Multi)

    HMGET key field [field ...]

    HKEYS key 获取hash的所有fields(字段)

    HVALS key 获取hash的所有value值

    HLEN key 取大小

    HEXISTS key field 测试某个field是否存在

    HMSET epid-name epid 车牌名 #eg.   HMSET epid-name 29952603 豫P5Z148 29947573 豫P5Z201

    HMGET epid-name epid       #eg.    HMGET epid-name 29952603 29947573

    """

    r

    =

    client.Redis()

    r.hmset(

    "epid-name"

    , {

    "29952603"

    :

    "豫P5Z148"

    ,

    "29947573"

    :

    "豫P5Z201"

    })

    result

    =

    r.hmget(

    "epid-name"

    , (

    "29952603"

    ,

    "29947573"

    ))

    print

    result

    # result:

    # ['\xe8\xb1\xabP5Z148', '\xe8\xb1\xabP5Z201']

  • SET 集合 三要素(确定, 互异, 无序) ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

    r

    =

    client.Redis()

    """SET(集合) 和python set类似

    SADD key value [..] 添加(->> set.add())

    SPOP key 随机(尼玛..)删除(并返回 貌似redis删除都会返回)

    SCARD key 取大小(->> len(set))

    集合运算:

    SDIFF set1 set2 集合差 (->> set1 - set2)

    SDIFFSTORE set3 set1 set2 集合差,并把结果存在第一个参数(第一个key)中

    SINTER set1 set2 集合交 (->> set1 & set2)

    SINTERSTORE set3 set1 set2 集合交并存储

    SUNION set1 set2 集合并 (->>set1 | set2)

    SUNIONSTROE ..

    SRANDMEMBER key [count] (尼玛,)随机获取count个

    SISMEMBER key number 判断元素是否属于集合

    SMEMBERS key 获取集合所有元素

    """

    # 由于和python很像, 就不上代码了

  • Sorted Set 带有权值的集合 命令都以Z打头 类似<多重集> 关于多重集可以参照 <离散数学及其应用第四版>p82 习题46: "有时一个元素在一个无序集中出现的次数也有意义.当同一个元素作为成员可以出现不止一次,这个无序元素集就是多重集.符号{m1.a1, m2.a2,...,mr.ar},整数mi称为ai的重数,i=1,2,...,r.",多重集的应用可以参照习题48.
  • Sub/Pub 发布订阅模式  ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

    """消息订阅,消息发布模式(SUBSCRIBE/PSUBSCRIBE,PUBLISH)

    SUBSCRIBE channel_name # 订阅通道channel_name的消息

    PUBLISH channel_name "data" # 向通道channel_name发布消息

    """

    # 订阅者 ***sub方法是client.PubSub的(注意和pub方法的区别(pub是client.Redis的))

    conn_pool

    =

    client.ConnectionPool()

    sub

    =

    client.PubSub(conn_pool)

    sub.subscribe(

    'xinwen-junshi'

    )

    sub.subscribe(

    'xinwen-guoji'

    )

    for

    msg

    in

    sub.listen():

    print

    msg

    # 发布者

    # 在另一个进程中运行

    r

    =

    client.Redis()

    r.publish(

    "xinwen-junshi"

    ,

    "dadaoxiaoriben"

    )

  • ing

    不要忘了最后 del client 来关闭redis

继续阅读