本文由larrylgq编写,转载请注明出处:http://blog.csdn.net/larrylgq/article/details/7399769
作者:吕桂强
邮箱:[email protected]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