ITPub博客

首页 > Linux操作系统 > Linux操作系统 > redis基础(2)-类型及操作

redis基础(2)-类型及操作

原创 Linux操作系统 作者:zghover_cu 时间:2012-04-04 17:29:09 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-03-25

  • 博文量
    12
  • 访问量
    56781