直接上代码:
#!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