Python使用Redis:五类数据类型操作

类型 简介 特性 场景
String 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M --
Hash 键值对集合,对应Python中的Dict;Java中的Map 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List 链表(双向链表) 增删快,提供了操作某一段元素的API ① 最新消息排行等功能(比如朋友圈的时间线);② 消息队列
Set 哈希表实现,元素不重复 ⒈ 添加、删除,查找的复杂度都是O(1) ;⒉ 为集合提供了求交集、并集、差集等操作 ① 共同好友;② 利用唯一性,统计访问网站的所有独立ip;③ 好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 ① 排行榜;② 带权重的消息队列

1、String(字符串)

redis的string

1.1- set(name, value, ex=None, px=None, nx=False, xx=False)
  -- 在redis中设置name对应的值。不存在则创建,存在则修改
  -- ex,过期时间(秒)
  -- px,过期时间(毫秒)
  -- nx,如果设置为True,则只有name不存在时,当前set方法才执行
  -- xx,如果设置为True,则只有name存在时,当前set方法才执行

1.2- setnx(name, value)
  -- 在redis中设置name对应的值。只有name不存在时,才执行添加

1.3- setex(name, value, time)
  -- 在redis中设置name对应的值
  -- time,过期时间(数字秒 或 timedelta对象)

1.4- psetex(name, value, time_ms)
  -- 在redis中设置name对应的值
  -- time_ms,过期时间(数字毫秒 或 timedelta对象)

1.5- mset(*args, **kwargs)
  -- 在redis中批量设置值
  -- eg:mset(k1='v1', k2='v2') 或 mget({'k1': 'v1', 'k2': 'v2'})

1.6- get(name)
  -- 获取redis中name对应的值

1.7- mget(keys, *args)
  -- 批量获取redis中name对应的值
  -- keys,redis的name
  -- eg:mget('cn-zh', 'chinese') 或 mget(['cn-zh', 'chinese'])

1.8- getset(name, value)
  -- 在redis中设置name对应的值并获取原来的值

1.9- getrange(name, start, end)
  -- 在redis中截取获得子序列(根据字节获取,非字符)
  -- start,字符串中字节的起始位置
  -- end,字符串中字节的结束位置
  -- eg:"文艺青年",0-3表示 “文”

1.10- setrange(key, offset, value)
  -- 修改redis中name对应的字符串内容,从指定字符串索引开始向后替换(新值太长则向后添加)
  -- offset,字符串的索引。字节(一个汉字为三个字节)
  -- value,要修改的值

1.11- setbit(name, offset, value)
  -- 对redis中name对应值的二进制表示位数进行操作
  -- offset,二进制位的索引(将值变换成二进制后在进行索引)
  -- value,值只能是0或1
  -- eg:n1 = "foo" 二进制表示为:01100110 01101111 01101111
所以setbit('n1', 7, 1)表示将二进制后的n1的第7位修改为1,即:01100111 01101111 01101111。转化为字符串则是"goo"

1.12- getbit(name, offset)
  -- 获取在redis中name对应的值的二进制表示中的某位的值(0或1)

1.13- bitcount(key, start=None, end=None)
  -- 获取在redis中name对应值的二进制表示中 1 的个数
  -- keys,redis的name
  -- start,位的起始位置
  -- end,位的结束位置

1.14- bitop(operation, dest, *keys)
  -- 获取多个值,并做位运算,将最后结果保存至新的name对应的值
  -- operation,AND(并)、OR(或)、NOT(非)、XOR(异或)
  -- dest,新的redis的name
  -- *keys,要查找的redis的name
  -- eg:bitop("AND", 'new_name', 'n1', 'n2', 'n3')表示获取redis中n1,n2,n3对应的值,所有值做位运算(求并集),然后将结果保存到new_name对应的值中

1.15- strlen(name)
  -- 返回name对应值的字节长度(一个汉字为三个字节)

1.16- incr(name, amount=1)
  -- 自增name的对应值,当name不存在时创建name=amount,否则自增
  -- amount,自增数(int)

1.17- incrbyfloat(name, amount=1.0)
  -- 自增name的对应值,当name不存在时创建name=amount,否则自增
  -- amount,自增数(float)

1.18- decr(name, amount=1)
  -- 自减name的对应值,当name不存在时创建name=amount,否则自减
  -- amount,自减数(int)

1.19- append(key, value)
  -- 在redis中name对应值后面追加内容
  -- key,redis的name
  -- value,要追加的字符串

2、List(列表)

(redis的list在内存中按照一个name对应一个列表来存储)


redis的list

2.1- lpush(name,values)
  -- 在name对应的list中从左到右添加新元素
  -- ps:rpush(name, values)表示从右到左添加
  -- eg:conn.lpush('en', 80,90,10) # 保存顺序:10, 90, 80

2.2- lpushx(name, value)
  -- 在name对应的list中添加元素,只当name存在才把元素添加到list最左边
  -- ps:rpushx(name, value)表示从右到左添加

2.3- llen(name)
  -- name对应的list中元素的个数

2.4- linsert(name, where, refvalue, value)
  -- 在name对应的list中的某个元素前或后插入一个新的元素
  -- where,前或后
  -- refvalue,标识元素。在它前后插入
  -- value,要插入的元素

2.5- r.lset(name, index, value)
  -- 对name对应的list中的某个索引位置重新赋值
  -- index,list中的索引值
  -- value,要改变的值

2.6- r.lrem(name, value, num)
  -- 在name对应的list中删除指定元素
  -- value,要删除的元素
  -- num,num=0,删除list中所有指定元素;num=2,从前往后删除2个;num=-2,从后往前删除2个

2.7- lpop(name)
  -- 在name对应的list的最左侧获取一个元素并移除,返回该元素
  -- ps:rpop(name)表示在最右侧操作执行

2.8- lindex(name, index)
  -- 在name对应的list中根据索引获取元素

2.9- lrange(name, start, end)
  -- 在name对应的list分片获取数据
  -- start,索引起始位置
  -- end,索引结束位置

2.10- ltrim(name, start, end)
  -- 在name对应的list中,移除不在start到end范围的元素
  -- start,索引起始位置
  -- end,索引结束位置

2.11- rpoplpush(src, dst)
  -- 从某个列表取出最右侧的元素,将其添加到另一个列表的最左侧
  -- src,取元素的列表
  -- dst,加元素的列表

2.12- brpoplpush(src, dst, timeout=0)
  -- 从一个列表的右侧移除一个元素并将其添加到另一个列表左侧
  -- src,取出并要移除元素的列表
  -- dst,要插入元素的列表
  -- timeout,当src对应的list中没有数据时,阻塞等待有数据的超时时间,0表示永远阻塞

2.13- blpop(keys, timeout)
  -- 将多个列表排列,按照从左到右去取对应列表的元素
  -- keys,redis的name的集合
  -- timeout,超时时间,当所有列表的元素都取完后,阻塞等到列表重新有元素的时间,0表示永远阻塞
  -- ps:brpop(keys, timeout)表示从右到左取元素

2.14- 自定义增量迭代
  -- 由于redis类库中没有提供对列表元素的增量迭代,如果需要循环name对应的list中的所有元素,则需要满足:
   -- a、获取name对应的所有列表
   -- b、循环列表
  -- 但如果列表过大,就应该自定义增量迭代功能

def list_iter(name):
    """
    :param name: 要迭代name对应的list
    :return: yield返回列表元素
    """
    list_count = conn.llen(name)
    for index in range(list_count):
        yield conn.lindex(name, index)

for iter in list_iter('txt'):
    print(item)

3、Hash(哈希)

redis的dict

3.1- hset(name, key, value)
  -- 在name对应的dict中设置一个键值对(不存在,则创建;存在,则修改)
  -- name为redis中的name
  -- key为name对应的dict中的key
  -- value为name对应的dict中的value
  -- eg:conn.hset('cn-zh', 'k1', 'v1')

3.2- hmset(name, mapping)
  -- 在name对应的dict中批量设置键值对
  -- name为redis中的name
  -- mapping,字典。如:{'k1': 'v1', 'k2': 'v2'}
  -- eg:conn.hmset('cn-zh', {'k1': 'v1', 'k2': 'v2'})

3.3- hget(name, key)
  -- 在name对应的dict中根据key获取value值
  -- eg:conn.hget('cn-zh', 'k1')

3.4- hmget(name, keys, *args)
  -- 在name对应的dict中获取多个key的value值
  -- keys,要获取key集合。如:['k1', 'k2', 'k3']
  -- *args,要获取的key。如:k1, k2, k3
  -- eg:conn.hmget('cn-zh', ['k1', 'k2', 'k3']) 或 conn.hmget('cn-zh', 'k1', 'k2', 'k3')

3.5- hgetall(name)
  -- 获取name对应的dict中所有的键值

3.6- hlen(name)
  -- 获取name对应的dict中键值对的个数

3.7- hkeys(name)
  -- 获取name对应的dict中所有key的值

3.8- hvals(name)
  -- 获取name对应的dict中所有value的值

3.9- hexists(name, key)
  -- 检查name对应的dict是否存在当前传入的key

3.10- hdel(name, *keys)
  -- 把name对应的dict中指定的key的键值对删除

3.11- hincrby(name, key, amount=1)
  -- 自增name对应的hash中指定的key的值,不存在时创建key=amount
  -- key,dict对应的key
  -- amount, 自增数(int)

3.12- hincrbyfloat(name, key, amount=1.0)
  -- 自增name对应的dict中的指定 key的值,不存在时创建key=amount
  -- key,dict对应的key
  -- amount,自增数(float)

3.13- hscan(name, cursor=0, match=None, count=None)
  -- 增量式迭代获取,优势在于数据大。可实现分片的获取数据,非一次全获取完,将内存撑爆
  -- cursor,游标(基于游标分批获取数据)
  -- match,匹配指定key,默认None,表示所有的key
  -- count, 每次分片最少获取的个数,默认None,表示采用Redis的默认分片个数
  -- eg:
cursor1, data1 = conn.hscan('cn-zh', cursor=0, match=None, count=None)
cursor2, data2 = conn.hscan('cn-zh', cursor=cursor1, match=None, count=None)
...
直到返回值cursor的值为0时,表示数据已通过分片获取结束

3.14- hscan_iter(name, match=None, count=None)
  -- 利用yield封装hscan创建生成器,实现分批到redis中获取数据
  -- match,匹配指定key,默认None,表示所有的key
  -- count,每次分片最少获取的个数,默认None,表示采用redis的默认分片个数
  -- eg:

for item in conn.hscan_item('cn-zh'):print(item)

4、Set(集合),无序不重复

4.1- sadd(name, values)
  -- name对应的集合中添加数据

4.2- scard(name)
  -- 获取name对应集合中元素个数

4.3- sdiff(keys, *args)
  -- 在第一个name对应的集合中,且不在其他name对应的集合的元素集合

4.4- sdiffstore(dest, keys, *args)
  -- 获取第一个name对应的集合中,且不在其他name对应的集合,再将其新加入到dest对应的集合中

4.5- sinter(keys, *args)
  -- 获取多一个name对应的集合的并集

4.6- sinterstore(dest, keys, *args)
  -- 获取多一个name对应集合的并集,再将其加入到dest对应的集合中

4.7- sismember(name, value)
  -- 检查value是否是name对应集合的成员

4.8- smembers(name)
  -- 获取name对应集合的所有成员

4.9- smove(src, dst, value)
  -- 将某个成员从一个集合移动到另一个集合

4.10- spop(name)
  -- 从集合的右侧移除一个成员,并将其返回

4.11- srandmember(name, numbers)
  -- 从name对应集合中随机获取numbers个元素

4.12- srem(keys, *args)
  -- 在name对应集合中删除某些值

4.13- sunion(keys, *args)
  -- 获取多一个name对应集合的并集

4.14- sunionstore(dest, keys, *args)
  -- 获取多一个name对应集合的并集,并将结果保存到dest对应集合中

4.15- sscan(name, cursor=0, match=None, count=None)
  -- 用于增量迭代获取,避免内存消耗太大

4.16- sscan_iter(name, match=None, count=None)
  -- 创建生成器,用于增量迭代分批获取,避免内存消耗太大

5、zset(sorted set:有序集合),不允许重复

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

5.1- zadd(name, *args, **kwargs)
  -- 在name对应的有序集合中添加元素
  -- eg:zadd('add', 'n1', 1, 'n2', 2) 或 zadd('add', n1=1, n2=2)

5.2- zcard(name)
  -- 获取name对应的有序集合元素的数量

5.3- zcount(name, min, max)
  -- 获取name对应的有序集合中分数 在 [min,max] 之间的个数

5.4- zincrby(name, value, amount)
  -- 自增name对应的有序集合的 name 对应的分数

5.5- zrange(name, start, end, desc=False, withscores=False,
score_cast_func=float)

  -- 按照索引范围获取name对应的有序集合的元素
  -- start,有序集合索引起始位置(非分数)
  -- end,有序集合索引结束位置(非分数)
  -- desc,排序规则,默认按照分数从小到大排序
  -- withscores,是否获取元素的分数,默认只获取元素的值
  -- score_cast_func,对分数进行数据转换的函数
  -- 从大到小排序:zrevrange(name, start, end, withscores=False, score_cast_func=float)
  -- 按照分数范围获取name对应的有序集合的元素:zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
  -- 从大到小:zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)

5.6- zrank(name, value)
  -- 获取某个值在 name对应的有序集合中的排行(从 0 开始)
  -- zrevrank(name, value),从大到小排序

5.7- zrangebylex(name, min, max, start=None, num=None)
  -- 当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的 值 (lexicographical ordering)来进行排序,而这个命令则可以返回给定的有序集合键 key 中, 元素的值介于 min 和 max 之间的成员。对集合中的每个成员进行逐个字节的对比(byte-by-byte compare), 并按照从低到高的顺序, 返回排序后的集合成员。 如果两个字符串有一部分内容是相同的话, 那么命令会认为较长的字符串比较短的字符串要大
  -- min,左区间(值)。 + 表示正无限; - 表示负无限; ( 表示开区间; [ 则表示闭区间
  -- min,右区间(值)
  -- start,对结果进行分片处理,索引位置
  -- num,对结果进行分片处理,索引后面的num个元素
  -- eg:
# ZADD myzset 0 aa 0 ba 0 ca 0 da 0 ea 0 fa 0 ga
# r.zrangebylex('myzset', "-", "[ca") 结果为:['aa', 'ba', 'ca']
  -- 从大到小排序
# zrevrangebylex(name, max, min, start=None, num=None)

5.8- zrem(name, values)
  -- 删除name对应的有序集合中值是values的成员
  -- eg:zrem('zz', ['s1', 's2'])

5.9- zremrangebyrank(name, min, max)
  -- 根据排行范围删除

5.10- zremrangebyscore(name, min, max)
  -- 根据分数范围删除

5.11- zremrangebylex(name, min, max)
  -- 根据值返回删除

5.12- zscore(name, value)
  -- 获取name对应有序集合中 value 对应的分数

5.13- zinterstore(dest, keys, aggregate=None)
  -- 获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作
  -- aggregate的值为: SUM MIN MAX

5.14- zunionstore(dest, keys, aggregate=None)
  -- 获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作
  -- aggregate的值为: SUM MIN MAX

5.15- zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
  -- 同字符串操作

5.16- zscan_iter(name, match=None, count=None,score_cast_func=float)
  -- 同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作

6、其他操作

6.1- delete(*names)
  -- 根据删除redis中的任意数据类型

6.2- exists(name)
  -- 检测redis的name是否存在

6.3- keys(pattern='')*
  -- 根据模型获取redis的name
 KEYS * 匹配数据库中所有 key 。
 KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
 KEYS h
llo 匹配 hllo 和 heeeeello 等。
 KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo*

6.4- expire(name ,time)
  -- 为某个redis的某个name设置超时时间

6.5- rename(src, dst)
  -- 对redis的name重命名为

6.6- move(name, db)
  -- 将redis的某个值移动到指定的db下

6.7- randomkey()
  -- 随机获取一个redis的name(不删除)

6.8- type(name)
  -- 获取name对应值的类型

6.9- scan(cursor=0, match=None, count=None)
  -- 同字符串操作

6.10- scan_iter(match=None, count=None)
  -- 同字符串操作,用于增量迭代获取key

参考引用博客:http://www.cnblogs.com/wupeiqi/articles/5132791.html

你可能感兴趣的:(Python使用Redis:五类数据类型操作)