redis常用操作

直接上代码:

#!usr/bin/env python
#coding: utf-8
'''
Created on 2013-10-11

@author: root
'''
import redis
import hashlib
def main():
    
    # 连接redis数据库
    redis_db = redis.StrictRedis(host='10.2.161.15', port=6379, db=0)
    
    
    '''
        key操作
    '''
    keys = redis_db.keys()   # 列出所有键值
    print type(keys), keys
    
    #或者 同时取一批 它们的名字(key)很像 而恰好你又不想输全部
    print 'keys:', redis_db.keys('test_dashan*')
    
    result = redis_db.exists('template_21')  #看是否存在这个键值
    print result
    
    '''
        # 取数据
        print 'r['']:',r['c1']
        #或者
        print 'get:',r.get('a')
        #或者 同时取一批
        print 'mget:',r.mget('c1','c2')
        #或者 同时取一批 它们的名字(key)很像 而恰好你又不想输全部
        print 'keys:',r.keys('c*')
        #又或者 你只想随机取一个:
        print 'randomkey:',r.randomkey()
        
        
# 查看一个数据有没有 有 1 无0
print 'existes:',r.exists('a')

# 删数据 1是删除成功 0和None是没这个东西
print 'delete:',r.delete('cc')
# 哦对了 它是支持批量操作的
print 'delete:',r.delete('c1','c2')

# 其他
r.rename('a','c3') #呃.改名
r.expire('c3',10) #让数据10秒后过期 说实话我不太明白么意思
r.ttl('c3') #看剩余过期时间 不存在返回-1
    '''
    
    
    '''
    DEL
DEL key [key ...]

删除给定的一个或多个 key 。

不存在的 key 会被忽略。

可用版本:
>= 1.0.0
时间复杂度:
O(N), N 为被删除的 key 的数量。
删除单个字符串类型的 key ,时间复杂度为O(1)。
删除单个列表、集合、有序集合或哈希表类型的 key ,时间复杂度为O(M), M 为以上数据结构内的元素数量。
返回值:
被删除 key 的数量。
    '''
    #s = redis_db.delete('foo')
    #print 'DEL: ', s
    
    
    '''
    TYPE
TYPE key

返回 key 所储存的值的类型。

可用版本:
>= 1.0.0
时间复杂度:
O(1)
返回值:
none (key不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
    '''
    print 'test_dashan所储存的值的类型', redis_db.type('test_dashan')
    print 'test_dashan_set所储存的值的类型', redis_db.type('test_dashan_set')
    print 'test_dashan_list所储存的值的类型', redis_db.type('test_dashan_list')
    print 'test_dashan_hash所储存的值的类型', redis_db.type('test_dashan_hash')
    
    
    
    
    
    '''
        string操作(key, value)
    '''
    
    # 添加string数据
    redis_db.set('foo', 'bar')
    redis_db['test_dashan'] = 'test_dashan'
    
    # 获取string数据
    foo = redis_db.get('foo')
    foo2 = redis_db['foo']
    
    print type(foo), foo, foo2
    
    
    
    
    '''
        list操作 key:[(index, value), (index, value), (index, value), ……]
    '''
    # 获取list数据
    word_list = redis_db.lrange('sensitive_word_list', 0, -1)
    print word_list
    
    # 添加list数据,如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。当 key 存在但不是列表类型时,返回一个错误。
    # lpushx:将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。和 LPUSH 命令相反,当 key 不存在时, LPUSHX 命令什么也不做。
    # lpush添加到list左边,rpush添加到list右边
    #redis_db.lpush('test_dashan_list','dashan3')
    
    '''
        RPUSH
RPUSH key value [value ...]

将一个或多个值 value 插入到列表 key 的表尾(最右边)。

如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。

如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。

当 key 存在但不是列表类型时,返回一个错误。
    '''
    
    '''
# 取出一位
print 'list index 0:',r.lindex('b',0)

# 修剪列表
#若start 大于end,则将这个list清空
print 'list ltrim :',r.ltrim('b',start=0,end=3) #只留 从0到3四位
    '''
    # 看长度
    print 'list len:', redis_db.llen('test_dashan_list')
    
    '''
    LREM
LREM key count value

根据参数 count 的值,移除列表中与参数 value 相等的元素。

count 的值可以是以下几种:

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
    '''
    
    
    
    
    
    '''
        set操作 key:[value, value, value, ……]
    '''
    # 获取set数据
    template_set = redis_db.smembers('test_own_template')
    print template_set
    # 遍历set集合
    for template_id in template_set:
        print type(template_id), template_id
    
    # 判断set中一个对象是否存在
    s = redis_db.sismember('test_own_template', '21')
    print s
    
    
    '''
    SADD
SADD key member [member ...]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

当 key 不是集合类型时,返回一个错误。
    '''
    # 添加set数据
    #redis_db.sadd('test_dashan_set', 'b')
    
    # 判断一个set长度为多少 不存在为0
    s = redis_db.scard('test_dashan_set')
    print 'set长度: ', s
    
    # 取个随机数
    s = redis_db.srandmember('test_dashan_set')
    print '随机数: ', s
    
    '''
    SREM
SREM key member [member ...]

移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。

当 key 不是集合类型,返回一个错误。
    '''
    # 删除
    s = redis_db.srem('test_dashan_set', 'b')
    print '删除srem: ', s
    
    
    #zset 有序set
    #'zadd', 'zcard', 'zincr', 'zrange', 'zrangebyscore', 'zrem', 'zscore'
    # 分别对应
    #添加, 数量, 自加1,取数据,按照积分(范围)取数据,删除,取积分
    
    
    
    
    
    
    
    
    '''
        hash操作 key:[(hashkey, value), (hashkey, value), (hashkey, value), ……]
    '''
    # 获取hash数据
    template_info_dict = redis_db.hgetall('template_21')
    print type(template_info_dict), template_info_dict
    
    '''
    HSET
HSET key field value

将哈希表 key 中的域 field 的值设为 value 。

如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。

如果域 field 已经存在于哈希表中,旧值将被覆盖。
    '''
    # 添加hash数据
    #s = redis_db.hset('test_dashan_hash', 'key2', 'value2') # 返回1表示新添加,返回0表示覆盖
    #print '添加hash数据: ', s
    
    
    '''
    HGET
HGET key field

返回哈希表 key 中给定域 field 的值。

可用版本:
>= 2.0.0
时间复杂度:
O(1)
返回值:
给定域的值。
当给定域不存在或是给定 key 不存在时,返回 nil 。
    '''
    # 获取hash数据
    s = redis_db.hget('test_dashan_hash', 'key2')
    print '获取hash数据: ', s
    
    
    '''
    HMSET
HMSET key field value [field value ...]

同时将多个 field-value (域-值)对设置到哈希表 key 中。

此命令会覆盖哈希表中已存在的域。

如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。

可用版本:
>= 2.0.0
时间复杂度:
O(N), N 为 field-value 对的数量。
返回值:
如果命令执行成功,返回 OK 。
当 key 不是哈希表(hash)类型时,返回一个错误。


HMGET
HMGET key field [field ...]

返回哈希表 key 中,一个或多个给定域的值。

如果给定的域不存在于哈希表,那么返回一个 nil 值。

因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

可用版本:
>= 2.0.0
时间复杂度:
O(N), N 为给定域的数量。
返回值:
一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。
    '''
    
    redis_db.hmset("test_dashan_hash", {"29952603":"豫P5Z148", "29947573":"豫P5Z201"})
    result = redis_db.hmget("test_dashan_hash", ("29952603", "29947573"))
    print 'hmget: ', type(result), result

    
    # 删除hash操作
    #s = redis_db.hdel("test_dashan_hash", "29952603", "29947573")
    #print '删除hash操作: ', s
    
    # 返回哈希表 key 中域的数量。
    s = redis_db.hlen("test_dashan_hash")
    print '域的数量: ', s
    
    
    '''
    HEXISTS
HEXISTS key field

查看哈希表 key 中,给定域 field 是否存在。

可用版本:
>= 2.0.0
时间复杂度:
O(1)
返回值:
如果哈希表含有给定域,返回 1 。
如果哈希表不含有给定域,或 key 不存在,返回 0 。
    '''
    # 查看哈希表 key 中,给定域 field 是否存在。
    s = redis_db.hexists("test_dashan_hash", 'key1')
    print 'field 是否存在: ', s
    
    
    # 返回哈希表 key 中的所有域。
    s = redis_db.hkeys("test_dashan_hash")
    print '哈希表 key 中的所有域: ', s
    
    # 返回哈希表 key 中所有域的值。
    s = redis_db.hvals("test_dashan_hash")
    print '哈希表 key 中所有域的值: ', s
    
    
    '''
    今天在工作中发现,某些有顺序的hash记录,取出来却不能保证顺序。 后来发现是自己的疏忽,并不是redis的问题

Redis的hash顺序是按照存入hash的先后保存的。只是Python的Hash无法保证顺序

这点让我疏忽了, 所以在存入的时候我用了 hmset.

    就如同我们上面所说,这其实是python字典无法保证顺序导致。
    
    既然不能用 hmset, 那自然也不能用 hgetall 得用 hkeys / hvals 来取

    '''
    # 
    redis_db.hmset('test_dashan_hash2', {100:1, 104:2, 101:3, 89: 4})
    
    for index, value in enumerate([100, 104, 101, 89]):
        redis_db.hset('test_dashan_hash3', value, index+1)
    
    test_dashan_hash2 = redis_db.hgetall('test_dashan_hash2')
    print type(test_dashan_hash2), test_dashan_hash2
    test_dashan_hash3 = redis_db.hgetall('test_dashan_hash3')
    print type(test_dashan_hash3), test_dashan_hash3
    
    hash_result = zip(redis_db.hkeys('test_dashan_hash3'), redis_db.hvals('test_dashan_hash3'))
    print 'hash_result: ', type(hash_result), hash_result
    
    
    '''
    # 添加用户
    # 单项加密中的salt
    ENCODE_SALT = 'smsplat_salt'
    username = 'test'
    password = 'test'
    m = hashlib.md5()
    m.update(password)
    m.update(ENCODE_SALT)
    cipher = m.digest()
    s = redis_db.hset('user_password', username, cipher) # 返回1表示新添加,返回0表示覆盖
    print s
    '''
    
def test():
    return '21', 'testhello'


#------------------------- start---------------------------
if __name__ == '__main__':
    main()
    s = test()
    print s
    
    
    
    


redis相关命令全集:

http://manual.csser.com/redis/index.html






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值