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" , 0 , 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值