Redis数据类型

Redis数据类型

Redis是种key—value的存储系统

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

# 字符串(string)
	{"key": 123}
# 列表(list)
	{"key":[1,2,3]}
# 集合(set)
	{"key":{1,2,3}}
# 有序集合(zset)/sorted set
	{"key":{("a",20),("b",15)}}
#  哈希(hash)
	{"key": {"name":"bxb", "age":18}}

1. String/字符串

String 是 Redis 的基本类型

String类型是二进制的,可以包含任何数据(最大值512M),如图片或者序列化的对象

内存中按 name—value来存储:

常用操作 python命令 备注
set set(name, value, ex=None, px=None, nx=False, xx=False)
参数: ex -设置键key的过期时间,单位秒
参数: px milliseconds -设置键key的过期时间,单位毫秒
参数:nx -只有key不存在时才设置key的值
参数:xx -只有ket存在时才设置key的值
例:rdb.set("A", "aa", ex=100)
设置 name-value,key不存在创建, 存在修改value
get get(name)
例:rdb.get('A')
获取 name对应的 value,key不存在时返回空
mset mset(mapping)
例:rdb.mset({"age": 18, "sex": "men"})
批量设置值
mget mget(keys, *args)
例:rdb.mget("age", "sex")
例:rdb.mget(["age", "sex"])
批量获取值,输出为数组[18,"men"]
getset getset(name, value)
例:rdb,getset("age", 20)
设置新值并获取原来的值
getrange getrange(name, start, end)
例:getrange("sex", 0, 1)
注:start/end均以字节计算
获取 name 对应的 value[start, end]的切片, 输出为"me"
setrange setrange(name, offset, value)
例:rdb.setrabfe("sex", 0, "women")
注:offset以字节计算
修改 name 对应的 value 值,从指定字符串索引开始向后替换(新值太长时,则覆盖向后添加)
getbit getbit(name, offset)
例:rdb.getbit("sex", 5)
注:offset以字节计算
获取 name 对应的 value[offset] 二进制值,输出0/1
setbit setbit(name, offset, value)
例:rdb.setbit("sex", 5, 1)
注:offset以字节计算
修改 name 对应的 value[offset] 二进制值,value只能是0/1
bitcount bitcount(key, start=None, end=None)
注:start/end均以字节计算
获取 key 对应的 value[start, end] 二进制值中 1 的个数
bitop bitop(operation, dest, *keys)
参数:operation:AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
参数:dest:新的Redis的name
参数:*keys:要查找的Redis的name
例:bitop("AND", 'new_name', 'n1', 'n2', 'n3')
例:获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中
获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值
strlen strlen(name) 返回 name 对应 value 值的字节长度
incr incr(self, name, amount=1)
参数:amount自增数,整数型
自增 name对应的 value 值,当name不存在时,创建name=amount,否则,则自增。
incrbyfloat incrbyfloat(self, name, amount=1.0)
参数:amount自增数,浮点型
自增 name对应的 value 值,当name不存在时,创建name=amount,否则,则自增。
decr decr(self, name, amount=1)
参数:amount自减数,整数型
自减 name 对应的 value 值,当name不存在时,则创建name=amount,否则,则自减。
append append(key, value) 在 name 对应 value 值后面追加内容

2. List/列表

List 是简单的字符串列表

List 最多可存储 232 - 1 元素

内存中按 key—list 来存储:

常用操作 Python命令 备注
lpush lpush(name,values)
例:rdb.lpush("A", 1,2,3) >
设置 name 对应的 list 中添加新元素,每个元素都会添加到最左边
rpush rpush(name,values)<b
例:rdb.rpush("B", 4,5) >
设置 name 对应的 list 中添加新元素,每个元素都会添加到最右边
lpushx(name,value)
lset r.lset(name, index, value)
参数:index 列表索引
例:rdb.lset("A", 0, 5)
修改 name 对应的 list 中的某一个索引位置的值
llen llen(name)
例:rdb.llen("A")
获取 name 对应 list 的长度(元素个数)
linset linsert(name, where, refvalue, value))
参数:where BEFORE或AFTER
参数:refvalue 在它前后插入数据(如果存在多个,以找第一个为准)
例:rdb.linsert('A', 'before', 1, 5) 在[2,1]元素1之前插入5
在 name 对应的 list 的某一个值前或后插入一个新值
lindex lindex(name, index)
例:rdb.lindex("A", 2)
获取 name 对应 list 中根据索引元素
lpop lpop(name)
例:rdb.lpop("A")
获取 name 对应 list 中左侧第一个元素并在列表中移除
rpoplpush rpoplpush(src, dst)
参数:src 获取数据的name
参数:dst 添加数据的name
例:rdb("A", "B")
将 src 对应 list 中最右边的元素,添加至 dst 对应 list 的最左边
blpop blpop(keys, timeout)
参数:keys name集合
参数:timeout 超时时间,所有元素均取完之后,阻塞等待新值,0表示永远阻塞
例:blpop(("A", "B"), 2)
将多个 list 排列,按照从左到右去pop对应列表的元素
brpop brpop(keys, timeout)
参数:keys name集合
参数:timeout 超时时间,所有元素均取完之后,阻塞等待新值,0表示永远阻塞
例:blpop(("A", "B"), 2)
将多个 list 排列,按照从右到左去pop对应列表的元素
lrem r.lrem(name, value, num)
参数:num 从前向后删除num个value,0代表删除所有value
例:rdb.lrem("A", 5, 3)
删除 name对 应的 list 中指定的值
ltrim ltrim(name, start, end)
参数:statr 起始索引
参数:end 结束索引
例:rdb.ltrim("A", 0, -1)
将 name 对应的 list 没有在start-end索引之间的值移除

3. Set/集合

Set 是 string 类型的无序集合

内存中按 key—set 来存储:{"key":{1,2,3}}

常用操作 Python命令 备注
sadd sadd(name, values)
例:rdb.sadd("a_name", 7, 8, 9)
设置 name 对应的 set 中添加元素, 每个元素都在最右边(尾)
scard scard(name)
例:rdb.scard("a_name")
获取 name 对应 set 中的元素个数
sdiff sdiff(keys, *args)
例:rdb.sdiff("a_name", "b_name")
获取第一个 key 对应的 set 元素, 且不在其他 key 对应的 set 中的元素
sdiffstore sdiffstore(dest, keys, *args)
参数:dest 新集合key
例:rdb.sdiffstore("c_name", "b_name", "a_name")
获取第一个 key 对应的 set 元素, 且不在其他 key 对应的 set 中的元素,将其加入到新的 dest 对应的集合中
sinter sinter(keys, *args)
rdb.sinter("a_name", "b_name")
获取多个 key 对应的 set 交集
sinterstore sinterstore(dest, keys, *args)
参数:dest 新集合key<b
例:rdb.sinterstore("d_name", "a_name", "b_name")
获取多个 key 对应的 set 交集,将其加入到新的 dest 对应的新集合中
sismember sismember(name, value)
例:rdb.sismember("a_name", 1)
判断 name 对用的 set 中是否有 value
smembers smembers(name)
例:rdb.smembers("a_name")
获取 name 对应 set 的所有元素
smove smove(src, dst, value)
参数:src 源集合 name
参数:dst 目标集合 name
例子:rdb.smove("a_name", "b_name", 9)
将 src 对应 set 的中 value, 移动到 dst 对应的 set 中
spop spop(name)
例:edb.spop("a_name")
将 name 对应 set 右边(尾)的元素移除,并返回
srandmember srandmember(name, numbers)
例子:rdb.srandmember("a_name", 5)
从 name 对应的 set 中随机获取 numbers 个元素
srem srem(name, values)
例:rdb.srem("a_name", 7, 9)
删除 name 对应 set 中对应的 values
sunion sunion(keys, *args)
例:rdb.sunion("a_name", "b_name")
获取多个 key 对应的 set 并集
sunionstore sunionstore(dest,keys, *args)
例:rdb.sunionstore("a_name", "b_name")
获取多个 key 对应的 set 并集,将其加入到新的 dest 对应的新集合中
sscan sscan(name, cursor=0, match=None, count=None)
参数:name 集合键名称
参数:cursor 游标(基于游标取值)
参数:match 匹配指定key, None表示所有key
参数:count 每次且切片最少获取的个数
增量式迭代获取,sscan实现分片的获取数据,并非一次性将数据全部获取完,从而防止内存被撑爆
sscan_iter sscan_iter(name, match=None, count=None)
参数:name 哈希建名称
参数:match 匹配指定key,默认None 表示所有的key
参数:count 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
利用yield封装sscan创建生成器,实现分批去redis中获取数据

4. zset/有序集合

zset 是 string 类型的无序集合

对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序

内存中按 key—list 来存储:{"key":{("a",20),("b",15)}}

命令 Python操作 备注
zadd zadd(name, *args, **kwargs)
例:rdb.zadd("zset_name", {"a":1, "b":3})
在 name 对应的 zset 中添加元素
zcard zcard(name)
例:rdb.zcard("zset_name")
获取 name 对应的 zset 中的元素个数
zcount zcount(name, min, max)
例:rdb.zcount("zset_name", 0, 3)
获取 name 对应的 zset 中分数在 [min, max] 之间元素的个数
zincrby zincrby(name, amount, value)
参数:amount 自增数
例:rdb.zincrby("zset_name", 5, "a")
自增 name 对应的 zset 中的 value 的分数
zrange zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
参数:name 有序集合键名称
参数:start 有序集合索引起始位置(非分数)
参数:end 有序集合索引结束位置(非分数)
参数:desc 排序规则,默认按照分数从小到大排序
参数:withscores 是否获取元素的分数,默认只获取元素的值
参数:score_cast_func 对分数进行数据转换的函数
例:rdb.zrange('zset_name', 4, 5, desc=False, withscores=True, score_cast_func=float)
对 name 对应的 zset 按照 desc 规则排序分数之后获取 [start, end] 之间的值
zrevrange zrevrange(name, start, end, withscores=False, score_cast_func=float)
参数:name 有序集合键名称
参数:start 有序集合索引起始位置(非分数)
参数:end 有序集合索引结束位置(非分数)
参数:withscores 是否获取元素的分数,默认只获取元素的值
参数:score_cast_func 对分数进行数据转换的函数
例:rdb.zrevrange("zset_name", 0,1)
对 name 对应的 zset 按照从大到小规则排序分数之后获取 [start, end] 之间的值
zrangebyscore zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
参数:name 有序集合键名称
参数:min 最小分数值
参数:max 最大分数值
参数:start 返回结果起始位置
参数:num 返回结果数量
参数:withscores 是否获取元素的分数,默认只获取元素的值
参数:score_cast_func 对分数进行数据转换的函数
例:rdb.zrangebyscore("zset_name", 5, 10, start=2, num=3)
注:获取 zset_name 的 zset 中分数在5~10之间,且从 索引2 开始取值,取3个
按照分数范围获取name对应的有序集合的元素,之后按分数从大到小排序
zrevrangebyscore zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)
参数:name 有序集合键名称
参数:max 最大分数值
参数:min 最小分数值
参数:start 返回结果起始位置
参数:num 返回结果数量
参数:withscores 是否获取元素的分数,默认只获取元素的值
参数:score_cast_func 对分数进行数据转换的函数
按照分数范围获取name对应的有序集合的元素,之后按分数从小到大排序
zrem zrem(name, values)
例:rdb.zrem("zset_name", "a", "b")
删除 name 对应 zset 中的 values 元素们
zremrangebyrank zremrangebyrank(name, min, max) 根据排行范围删除
zremrangebyscore zremrangebyscore(name, min, max) 根据分数范围删除
zremrangebylex zremrangebylex(name, min, max) 根据值返回删除
zscore zscore(name, value) 获取name对应 zset 中 value 对应的分数
zinterstore zinterstore(dest, keys, aggregate=None)
参数:aggregate的值为: SUM MIN MAX
获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作
zunionstore zunionstore(dest, keys, aggregate=None)
参数:aggregate的值为: SUM MIN MAX
获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作
zscan zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
参数:name 哈希建名称
参数:cursor 游标(基于游标分批取获取数据)
参数:match 匹配指定key,默认None 表示所有的key
参数:count 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
参数:score_cast_func 对分数进行数据转换的函数
增量式迭代获取,zscan实现分片的获取数据,并非一次性将数据全部获取完,从而防止内存被撑爆
zscan_iter zscan_iter(name, match=None, count=None,score_cast_func=float)
参数:name 哈希建名称
参数:match 匹配指定key,默认None 表示所有的key
参数:count 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
参数:score_cast_func 对分数进行数据转换的函数
利用yield封装zscan创建生成器,实现分批去redis中获取数据

5. Hash/哈希

Hash 是一个 string 类型的 field 和 value 的映射表

内存中按 key—dict 存储:{"key": {"name":"A", "age":18}}

命令 Python操作 备注
hset hset(name, key, value)
例:rdb.hset("h_name", "age", 18)
name 对应的 hash中 设置一个键值对(不存在创建,存在修改)
hmset hmset(name, mapping)
例:rdb.hmset("h_name", {"sex": "man"})
在 name 对应的 hash 中批量设置键值对
hget hget(name,key)
例:rdb.hget("h_name", "age")
在 name 对应的 hash 中获取根据 key 获取 value
hmget hmget(name, keys, *args)
例:rdb.hmget("h_name", "age", "sex")
例:rdb.hmget("h_mange", ["age", "sex"])
在 name 对应的 hash 中获取多个 key 的值
hgetall hgetall(name)
例:rdb.hegtall("h_name")
获取 name 对应的 hash 中所有的键值
hlen hlen(name)
例:rdb.hlen("h_name")
获取 name 对应的 hash 中键值对的个数
hkeys hkeys(name)
例:rdb.hkeys("h_name")
获取 name 对应 hash 中所有 keys
hvals hvals(name)
例:rdb.hvals("h_name")
获取 name 对应 hash 中所有的 values
hexists hexists(name, key)
例:rdb.hexists("h_name", "name")
判断 name 对应 hash 中是否有 key
hdel hdel(name,*keys)
例:rdb.hdel("h_name", "name", "age")
删除 name 对应 hash 中指定的键值对
hincrby hincrby(name, key, amount=1)
参数:amount 自增数(整型)
例:rdb.hincrby("dic_name", "age", amount=10)
自增 name 对应 hash 中, key 对应的值(不存在创建key=amoount)
hincrbyfloat hincrbyfloat(name, key, amount=1.0)
参数:amount 自增数(浮点型)
例:rdb.hincrbyfloat("h_name", "age", amount=2.0)
自增 name 对应 hash 中, key 对应的值(不存在创建key=amoount)
hscan hscan(name, cursor=0, match=None, count=None)
参数:name 哈希建名称
参数:cursor 游标(基于游标分批取获取数据)
参数:match 匹配指定key,默认None 表示所有的key
参数:count 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
注意:返回结果为cursor, data;当cursor为0是,表示数据获取完毕
增量式迭代获取,hscan实现分片的获取数据,并非一次性将数据全部获取完,从而防止内存被撑爆
hscan_iter hscan_iter(name, match=None, count=None)
参数:name 哈希建名称
参数:match 匹配指定key,默认None 表示所有的key
参数:count 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
利用yield封装hscan创建生成器,实现分批去redis中获取数据

参考链接:https://www.redis.com.cn/

posted @ 2020-09-01 14:00  丶小白吖  阅读(103)  评论(0编辑  收藏  举报