代码改变世界

redis key和value数据类型

2014-07-09 16:14  youxin  阅读(11970)  评论(0编辑  收藏  举报

exists key 

del key1 key2

Redis 的vaule
redis 提供五种数据类型:string,hash,list,set 及sorted set。

string 是最基本的类型,而且string 类型是二进制安全的。意思是redis 的string 可以
包含任何数据。比如jpg 图片或者序列化的对象。从内部实现来看其实string 可以看作byte数组,最大上限是1G 字节。

set key value 设置 key对应 string 类型的值,返回 1 表示成功,0失败。
setnx key value 如果 key 不存在,设置 key 对应 string 类型的值。如果 key 已经存在,返
回0。SET if Not eXists』 

set a 1 后get  a 返回的是“1”,并且type a是字符串。
get key 获取 key对应的 string值,如果 key不存在返回 nil
getset key value 先获取 key的值,再设置 key的值。如果 key不存在返回 nil。

mget key1 key2 ...... keyN 一次获取多个key 的值,如果对应 key不存在,则对应返回 nil
mset key1 value1 ...... keyN valueN 一次设置多个 key的值,成功返回 1表示所有的值都设置
了,失败返回0 表示没有任何值被设置。
msetnx key1 value1 ...... keyN valueN 一次设置多个 key的值,但是不会覆盖已经存在的 key
incr key 对 key 的值做++操作,并返回新的值。注意 incr一个不是 int 的 value 会返回错
误,incr 一个不存在的key,则设置key 值为1。
decr key 对 key的值做--操作,decr一个不存在 key,则设置 key值为-1。
incrby key integer 对 key 加上指定值 ,key 不存在时候会设置 key,并认为原来的 value
是0。
decrby key integer 对key减去指定值。decrby完全是为了可读性,我们完全可以通过incrby
一个负值来实现同样效果,反之一样。

 

2.2.2. hash 类型
hash 是一个string 类型的field 和value 的映射表。添加,删除操作都是O(1)(平均)。
hash 特别适合用于存储对象。相对于将对象的每个字段存成单个string 类型。将一个对象
存储在hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是
新建一个hash 对象时开始是用zipmap(又称为small hash)来存储的。这个zipmap 其实并
不是hash table,但是zipmap 相比正常的hash 实现可以节省不少hash 本身需要的一些元
数据存储开销。尽管zipmap 的添加,删除,查找都是O(n),但是由于一般对象的field
数量都不太多。所以使用zipmap 也是很快的,也就是说添加删除平均还是O(1)。如果field
或者value 的大小超出一定限制后,redis 会在内部自动将zipmap 替换成正常的hash 实现.
这个限制可以在配置文件中指定。
hash-max-zipmap-entries 64 #配置字段最多64 个
hash-max-zipmap-value 512 #配置value 最大为512 字节

 

hset key field value 设置 hash field为指定值,如果 key不存在,则创建

返回值:
如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。
如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。
redis> HSET website google "www.g.cn"       # 设置一个新域
(integer) 1

redis> HSET website google "www.google.com" # 覆盖一个旧域
(integer) 0

hget key field 获取指定的 hash field。
hmget key filed1....fieldN 获取全部指定的 hash filed。
hmset key filed1 value1 ...... filedN valueN 同时设置hash的多个 field。
hincrby key field integer 将指定的 hash filed 加上指定值。成功返回 hash filed 变更后的
值。
hexists key field 检测指定 field是否存在。
hdel key field 删除指定的 hash field。
hlen key 返回指定 hash的 field 数量。

hkeys key 返回 hash 的所有 field。
hvals key 返回 hash的所有 value。
hgetall 返回 hash的所有 filed和 value

 

list类型:参考:http://www.cnblogs.com/youxin/p/3585867.html

 

2.2.4. set 类型
set 是无序集合,最大可以包含(2 的32 次方-1)个元素。set 的是通过hash table 实现的,
所以添加,删除,查找的复杂度都是O(1)。hash table 会随着添加或者删除自动的调整大小。
需要注意的是调整hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作。可能不
久后就会改用跳表(skip list)来实现。跳表已经在sorted sets 中使用了。关于set 集合类型
除了基本的添加删除操作,其它有用的操作还包含集合的取并集(union),交集(intersection),
差集(difference)。通过这些操作可以很容易的实现SNS 中的好友推荐和blog 的tag 功能。

SADD key member [member ...]

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

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

当 key 不是集合类型时,返回一个错误。

# 添加单个元素

redis> SADD bbs "discuz.net"
(integer) 1


# 添加重复元素

redis> SADD bbs "discuz.net"
(integer) 0


# 添加多个元素

redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2

redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"

smembers key 返回集合 key 中的所有成员。

srem key member 从 key 对应 set 中移除指定元素,成功返回 1,如果 member 在集合中不
存在或者key 不存在返回0,如果key 对应的不是set 类型的值返回错误。
spop key 删除并返回 key 对应 set 中随机的一个元素,如果 set 是空或者 key 不存在返回
nil。
srandmember key 同 spop,随机取 set中的一个元素,但是不删除元素。
smove srckey dstkey member 从srckey对应set中移除member并添加到dstkey对应set中,
整个操作是原子的。成功返回1,如果member 在srckey 中不存在返回0,如果key 不是set
类型返回错误。
scard key 返回 set的元素个数,如果 set是空或者 key不存在返回 0。
sismember key member 判断 member 是否在 set 中,存在返回 1,0 表示不存在或者 key 不
存在。
sinter key1 key2 …… keyN 返回所有给定key 的交集。
sinterstore dstkey key1 ....... keyN 返回所有给定 key的交集,并保存交集存到 dstkey下
sunion key1 key2 ...... keyN 返回所有给定 key的并集。
sunionstore dstkey key1 ...... keyN 返回所有给定 key的并集,并保存并集到 dstkey下。
sdiff key1 key2 ...... keyN 返回所有给定 key 的差集。

 

sorted set 类型
sorted set 是有序集合,它在set 的基础上增加了一个顺序属性,这一属性在添加修
改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序。可以理解了有两列的
mysql 表,一列存value,一列存顺序。操作中key 理解为sorted set 的名字。

 

ZADD key score member [[score member] [score member] ...]

将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。

score 值可以是整数值或双精度浮点数。

如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。

当 key 存在但不是有序集类型时,返回一个错误。

对有序集的更多介绍请参见 sorted set 。

# 添加单个元素

redis> ZADD page_rank 10 google.com
(integer) 1


# 添加多个元素

redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 添加已存在元素,且 score 值不变

redis> ZADD page_rank 10 google.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # 没有改变
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 添加已存在元素,但是改变 score 值

redis> ZADD page_rank 6 bing.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # bing.com 元素的 score 值被改变
1) "bing.com"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

ZREM key member [member ...]

移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

当 key 存在但不是有序集类型时,返回一个错误。

 ZINCRBY key increment member

Increments the score of member in the sorted set stored at key by increment. If member does not exist in the sorted set, it is added with increment as its score (as if its previous score was0.0). If key does not exist, a new sorted set with the specified member as its sole member is created.

An error is returned when key exists but does not hold a sorted set.

The score value should be the string representation of a numeric value, and accepts double precision floating point numbers. It is possible to provide a negative value to decrement the score.

Return value

Bulk string reply: the new score of member (a double precision floating point number), represented as string.

Examples

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"
redis> 

 

参考:https://redis.readthedocs.org/en/latest/