redis的类型和操作
1,string 类型
string是最简单的类型,它是二进制安全的,也就是说redis的string可以包含任何数据,比如jpg图片或者序列化的对象。从内部实现来看其实string可以看作byte数组,最大上限是1G字节。
.string类型的定义:
struct sdshdr {
int len; //buf的总长度
int free; //剩余buf空间的长度
char buf[]; //bytes串,所以可以支持二进制数据
};
另外string类型可以被部分命令按int处理.比如incr等命令,如果只用string类型,redis就可以被看作加上持久化特性的memcached。
1.1 string 类型的方法
.set
设置key对应的值为string类型的value。
redis> set name ttr //设置key键name的值为ttr
OK //成功
.setnx
设置key对应的值为string类型的value。如果key已经存在,返回0,nx是not exist的意思。
redis> setnx name ttr2 //若没有键key为name,那么就设置name的值为ttr2
(integer) 0 //失败,因为前面已经有键name了
.setex
设置key对应的值为string类型的value,并指定此键值对应的有效期(一般是秒)。
redis> setex color 10 red //设置键color的值为red,并且该键10秒有效
OK
redis> get color //10秒后,color的值为空,同时color键被销毁
(nil)
.setrange
设置指定key的value值的子字符串,可用来覆盖原来的字符串。
redis> get name
"ttrsssss"
redis> setrange name 3 hello //从name键的值的第3个字符开始替换成hello
(integer) 8 //注意只替换hello这几个字符,后面的不覆盖
redis> get name
"ttrhello"
.mset
一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。
redis> mset k1 v1 k2 v2 k3 v3
OK
redis> keys
(error) ERR wrong number of arguments for 'keys' command
redis> keys *
1) "k1"
2) "k2"
3) "name"
4) "k3"
redis> get k1
"v1"
.msetnx
一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。
redis> msetnx k1 v1 k5 v5 //k1的值已经设置了
(integer) 0 //设置失败
.get
获取key对应的string值,如果key不存在返回nil。
redis> get k1
"v1"
.getset
设置key的值,并返回key的旧值。
redis> getset k1 vv1
"v1"
redis> get k1
"vv1"
.getrange
获取指定key的value值的子字符串。
redis> get name
"ttroollo"
redis> get name 0 2 //获取键为name的值的0到2个位置的值
(error) ERR wrong number of arguments for 'get' command
redis> getrange name 0 2
"ttr"
redis> getrange name -2 -1 //最右边是-1
"lo"
redis> getrange name -3 -1 //最右边是-1,然后往回数
"llo"
.mget
一次获取多个key的值,如果对应key不存在,则对应返回nil。
redis> mget k1 k2 k3 k8
1) "vv1"
2) "v2"
3) "v3"
4) (nil)
.incr
对key的值做加加操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1。
redis> set age 10
OK
redis> incr age
(integer) 11
redis> get age
"11"
redis> incr k1 //键k1的值非整数,所以返回错误
(error) ERR value is not an integer or out of range
.incrby
同incr类似,加指定值 ,key不存在时候会设置key,并认为原来的value是 0
redis> get age
"4"
redis> incrby age 6
(integer) 10
redis> get age
"10"
.decr
对key的值做的是减减操作,decr一个不存在key,则设置key为-1
redis> get age
"11"
redis> decr age
(integer) 10
redis> get age
"10"
.decrby
同decr,减指定值。
redis> decrby age 6
(integer) 4
redis> get age
"4"
.append
给指定key的字符串值追加value,返回新字符串值的长度。
redis> append k1 world
(integer) 8
redis> get k1
"vv1world"
.strlen
取指定key的value值的长度。
redis> strlen k1
(integer) 3
redis> get k1
"vv1"
2, hash类型及操作
Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
.hset
设置hash field为指定值,如果key不存在,则先创建。
redis> hset hash1 field1 hello1 //设置hash表hash1的field1域的值为hello1
(integer) 1
redis> hset hash1 filed2 hello2 //设置hash表hash1的field2域的值为hello2
(integer) 1
.hsetnx
设置hash field为指定值,如果key不存在,则先创建。如果field已经存在,返回0,nx是not exist的意思。
redis> hsetnx hash1 f3 hello3 //成功
(integer) 1
redis> hsetnx hash1 f3 hello3 //失败了,已存在这样的key
(integer) 0
.hmset
同时设置hash的多个field。
//设置hash1表中的f4域和f5域的值分别为hello4和hello5
redis> hmset hash1 f4 hello4 f5 hello5
OK
.hget
获取指定的hash field。
redis> hget hash1 f4
"hello4"
redis> hget hash1 f6 //没有f6这个关键字,所以其值为空
(nil)
.hmget
获取多个指定的hash filed。若没有这个域,则其值为空
.hincrby
指定的hash filed 加上给定值。
redis> hset hash1 f8 8
(integer) 1
redis> hincrby hash1 f8 9
(integer) 17
redis> hincrby hash1 f8 -6 //可加负数,相当于减法
(integer) 11
.hexists
测试指定field是否存在。
redis> hexists hash1 f1
(integer) 0
.hlen
返回指定hash的field数量。
redis> hlen hash1 //获取hash1表中域的数量
(integer) 6
.hdel
返回指定hash的field数量。
redis> hdel hash1 f3
(integer) 1
.hkeys
返回hash的所有field。
redis> hkeys hash1
1) "field1"
2) "filed2"
3) "f4"
4) "f5"
5) "f8"
.hvals
返回hash的所有value。
redis> hvals hash1
1) "hello1"
2) "hello2"
3) "hello4"
4) "hello5"
5) "11"
.hgetall
获取某个hash中全部的filed及value。
redis> hgetall hash1
1) "field1" //域
2) "hello1" //值
3) "filed2"
4) "hello2"
5) "f4"
6) "hello4"
7) "f5"
8) "hello5"
9) "f8"
10) "11"
3,list类型及操作
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字。 Redis的list类型其实就是一个每个子元素都是string类型的双向链表。链表的最大长度是(2的32次方)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。
可用命令help @list 查看链表的所有命令帮助。
.lpush
在key对应list的头部添加字符串元素
redis> lpush list1 "hellolist1" //返回的是当前list的元素个数
(integer) 2
.rpush
在key对应list的尾部添加字符串元素。
redis> rpush list1 "end1" //把end1放到尾部
(integer) 3
redis> lrange list1 0 9 //显示从0到9的结点
1) "hellolist1"
2) "hello"
3) "end1"
.linsert
在key对应list的特定位置之前或之后添加字符串元素。
redis> linsert list1 BEFORE hello "hellobef"
(integer) 5
redis> lrange list1 0 9
1) "begin"
2) "hellolist1"
3) "hellobef"
4) "hello"
5) "end1"
.lset
设置list中指定下标的元素值(下标从0开始)。
redis> lindex list1 1 //查看1位置的值
"hellolist1"
redis> lset list1 1 "hello11" //重新设置1位置的值
OK
redis> lindex list1 1 //查看1位置的值
"hello11"
.lrem
从key对应list中删除count个和value相同的元素。 count>0时,按从头到尾的顺序删除。
redis> lrem list1 1 "hello11" //从1位置开始删除和hello11相同的值的结点
(integer) 1
redis> lindex list1 1 //"hello11" 已经被删除
"hellobef"
.ltrim
保留指定key 的值范围内的数据
redis> ltrim list1 1 3 //只保留3个元素
OK
redis> llen list1 //只有3个元素了
(integer) 3
.lpop
从list的头部删除元素,并返回删除元素
redis> lindex list1 0
"hellobef"
redis> lpop list1
"hellobef"
redis> lindex list1 0
"hello"
.rpop
从list的尾部删除元素,并返回删除元素
redis> lindex list1 1
"end1"
redis> rpop list1
"end1"
redis> lindex list1 1
(nil)
.rpoplpush
从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的.如果第一个list是空或者不存在返回nil。
redis> rpoplpush list1 list2
"hello"
.lindex
返回名称为key的list中index位置的元素
redis> lindex list1 0
"hellobef"
.llen
返回key对应list的长度。
redis> llen list1
(integer) 2
.set类型及操作
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作,操作中key理解为集合的名字。
set的是通过hash table实现的,所以添加、删除和查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。需要注意的是调整hash table大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在sorted set中使用了。关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐和blog的tag功能。
.sadd
向名称为key的set中添加元素
待续...
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20498361/viewspace-720314/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20498361/viewspace-720314/