您的位置:首页 > 数据库 > Redis

Redis数据类型及操作

2012-03-27 19:27 435 查看
本文由larrylgq编写,转载请注明出处:http://blog.csdn.net/larrylgq/article/details/7399769



作者:吕桂强
邮箱:larry.lv.word@gmail.com
strings 类型

string 类型是二进制安全的。

redis 的 string 可以包含任何数据,比如 jpg 图片或者序列化的对象。从内部实现来看其实 string 可以看作 byte 数组,最大上限是 1G 字节

struct sdshdr {

 long len;//buf的长度

 long free;//buf剩余可用字节数

 char buf[];//实际的字符串内容

};

1:set

设置 key 对应的value(string类型)

> set name larry

ok

2:setnx

即set not exist,如果 key 已经存在,返回 0

> set name larry

ok

>setnx name larry

(integer) 0

3:setex

存储键值对,并设置有效期

>setex name 10 larry

ok

>get name

"larry"

10秒钟后...

>get name

(nil)

4:setrange

有就替换,没有就用\x00代替缺少的字符来替换,数字代表开始替换的下标

> get name

"larry"

>setrange name 0 lv

(integer) 5

>get name

"lvrry"

>setrange name 10 lv

"lvrry\x00\x00\x00\x00\x00lv"

5:mset

每次设置多个key值

>mset key1 value1 key2 value2

ok

6:msetnx

一次设置多个 key 的值,具有原子性,同时成功或失败,失败返回0,所有操作回滚

7:get

根据key获取值,不存在返回(nil)

>get asdasds

(nil)

8:getset

获取旧值并设置一个新值,不存在返回(nil)

>get name

"larry"

>getset name lv

"larry"

>get name

"lv"

>getset dsadasd lv

(nil)

9:getrange

根据指定的下标获取值,负数表示从右边开始

>getrange 0 1 name

"la"

10:mget

返回多个值,不存在返回(nil)

>get name sdadasd

1)"larry"

2)(nil)

11:incr

加加操作,如果字符不是int型会报错(error) ERR value is not an integer or out of range

> set age 20

OK

 incr age

(integer) 21

12:incrby

加操作

> get age

"21"

> incrby age 5

(integer) 26

13:decr

减减操作

14:decrby

减操作

15:append

追加操作,返回字符串长度

>append name lv

(integer) 15

>get name

"larrylv"

16:strlen

返回value的长度

hashes 类型

新建的 hash 对象开始是用 zipmap(又称为 small hash)来存储的,当条件超个以下配置

hash-max-zipmap-entries 64 //字段最多 64 个

hash-max-zipmap-value 512 //value 最大为 512 字节

Redis 自动将 zipmap 替换成正常的 hash 实现.

1:hset

> hset testhash field1 test

(integer) 1

2: hsetnx

hsetnx testhash field1 test

(integer) 1

> hsetnx testhash field1 test

(integer) 0

3:hmset

> hmset testhash field1 a field2 b

OK

4:hget

 >hget testhash field1

"a"

5:hmget

> hmget testhash field1 field2 field3

1) "a"

2) "b"

3) (nil)

6:hincrby

类似incrby

7:hexists

>hexists testhash field10

(integer) 0

8:hlen

返回hash 的 field 数量

>len testhash

(integer) 2

9:hdel

删除返回删除成功的数目

> hdel testhash field1 field2

(integer) 2

10:hkeys

返回当前hash所有的key

11:hvals

返回当前hash所有value

12:hgetall

返回整个hash

lists:每个元素带前后指针,所以元素占用空间为:元素大小+24字节+16字节

list 类型是一个子元素为 string 类型的双向链表。最大长度为(2的 32 次方)。

可以通过 lpush,lpop,rpush,rpop 从链表的头部,尾部进行添加,删除元素。

另外为了防止轮询 list 的 pop 操作还有阻塞版本

1:lpush

在list 的头部添加string元素,返回list长度

>lpush testlist "larry"

(integer) 1

2:rpush

在list 的尾部添加string元素

3:linsert

在特定位置添加string元素,失败返回(integer) -1

 linsert testlist before "lv"

(integer) 2

4:lset

设置指定下标的值,下标越界会报错(error) ERR index out of range

> lset testlist 0 ok

OK

5:lrem

按顺序删除count个指定value内容的值,count=0全删,>0正序删,<0倒序删

> lrem testlist 2 "lv"

(integer) 2

6:ltrim

只保留指定范围的数据

> ltrim testlist 1 -1//表示删掉第一个元素

OK

7:lpop

删除并返回头部数据

8:rpop

删除并返回尾部数据

9:rpoplpush

移除第一个list的尾部数据,将其添加到第二个list的头部

>rpoplpush testlist testlist2

10:lindex

返回 index 位置的元素

11:llen

返回list的长度
set

通过hash表实现

1:sadd

添加元素

> sadd testset "lv"

(integer) 1

2:srem

删除元素

3:spop

随机删除并返回一个元素

4:sdiff

返回两个set的差集,当前set独有的

5:sdiffstore

返回两个set的差集,将结果存为第三个set

6:sinter

返回2个set的交集

7:sinterstore

返回2个set的交集,另存为一个set

8:sunion

返回2个set的并集

9:sunionstore

返回2个set的并集,并另存为第三个set

10;smove

移动第一个set的元素到第二个set

11:scard

返回set的元素个数

12:sismember

返回set中特定值的个数

13:srandmember

随机返回一个元素,但是不删除

sorted sets

1:zadd

添加元素

> zadd testzset 1 "one"

(integer) 1

2:zrem

删除元素

3:zincrby

如果该元素存在,增加该元素的 score

4:zrank

返回当前元素的排名,从小到大

5:zrevrank

返回当前元素的排名,从小到大

6:zrevrange

按 score 从大到小排序,返回给定区间的元素

7:zrangebyscore

返回score 在给定区间的元素

8:zcount

返回给定score区间的元素数目

9:zcard

返回集合中元素数目

10:zscore

返回元素对应的score

11:zremrangebyrank

删除score排名在给定区间的元素

12:zremrangebyscore

删除score在给定区间的元素

另外redis支持强大的sort ... by ... get ... 操作:

> ./redis-cli sadd uid  001

1

> ./redis-cli sadd uid  002

1

>./redis-cli set uid:sort:001 98 #uid对应的评分

OK

> ./redis-cli set uid:sort:002 97

OK

> ./redis-cli set title:001 "iam 001" #uid对应的内容

OK

> ./redis-cli set title:002 "iam002"

OK

> ./redis-cli sort uid by uid:sort:* get title:* #从好友列表中获得id与uid:sort字段匹配后排序,并根据排序后的顺序,用key在uid表获得信息

1.iam 001

2. iam002
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息