专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 行业应用

redis学习札记-数据类型

发布时间:2010-06-06 18:56:31 文章来源:www.iduyao.cn 采编人员:星星草
redis学习笔记-数据类型

redis的数据类型

redis支持的数据类型包括StringHashListSetSorted Set,由于redis本质上一个key-value db,所以首先从Key开始学习。

 

Key()

<!--[if !supportLists]-->Ø  <!--[endif]-->key也是字符串类型,但是key中不能包括边界字符。

<!--[if !supportLists]-->Ø  <!--[endif]-->由于key不是binary safe的字符串,所以像"my key""mykey\n"这样包含空格和换行的key是不允许的。

<!--[if !supportLists]-->Ø  <!--[endif]-->顺便说一下在redis内部并不限制使用binary字符,这是redis协议限制的。"\r\n"在协议格式中会作为特殊字符。

<!--[if !supportLists]-->Ø  <!--[endif]-->关于key的一个格式约定介绍下,object-type:id:field。比如user:1000:passwordblog:xxidxx:title

<!--[if !supportLists]-->Ø  <!--[endif]-->key的长度最好不要太长。道理很明显占内存啊,而且查找时候相对短key也更慢。不过也推荐过短的key,比如u:1000:pwd,这样的。显然没上面的user:1000:password可读性好。

下面介绍下key相关的几个命令,其他的请看相关文档:

命令

说明

示例

DEL key [key ...]

移除给定的一个或多个key。如果key不存在,则忽略该命令。

redis 127.0.0.1:6379> set name naxsu

OK

redis 127.0.0.1:6379> del name

(integer) 1

KEYS pattern

查找符合给定模式的key

KEYS *命中数据库中所有key

redis 127.0.0.1:6379> mset one 1 two 2 three 3 four 4

OK

redis 127.0.0.1:6379> keys *

1) "four"

2) "three"

3) "two"

4) "one"

RANDOMKEY

从当前数据库中随机返回(不删除)一个key

redis 127.0.0.1:6379> randomkey

"two"

TTL key

返回给定key的剩余生存时间(time to live)(以秒为单位),过期的key将被删除

 

redis 127.0.0.1:6379> set name naxsu

OK

redis 127.0.0.1:6379> expire name 30

(integer) 1

redis 127.0.0.1:6379> ttl name

(integer) 25

EXISTS key

检查给定key是否存在,若key存在,返回1,否则返回0

redis 127.0.0.1:6379> exists name

(integer) 0

redis 127.0.0.1:6379> exists one

(integer) 1

RENAME key newkey

key改名为newkey

keynewkey相同或者key不存在时,返回一个错误。

newkey已经存在时,RENAME命令将覆盖旧值。

redis 127.0.0.1:6379> rename one newone

TYPE key

返回key所储存的值的类型

redis 127.0.0.1:6379> type two

string

 

String(字符串)

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

struct sdshdr {

long len;

long free;

char buf[];

};

buf是个char数组用于存贮实际的字符串内容。其实charc#中的byte是等价的,都是一个字节

lenbuf数组的长度,free是数组中剩余可用字节数。由此可以理解为什么string类型是二进制安全的了。因为它本质上就是个byte数组,当然可以包含任何数据了。另外string类型可以被部分命令按int处理.比如incr等命令,下面详细介绍。还有redis的其他类型像listsetsorted sethash它们包含的元素与都只能是string类型。

 

下面介绍下String相关的一些命令,其他的请看相关文档:

命令

说明

示例

SET key value

将字符串值value关联到key

如果key已经持有其他值,SET就覆写旧值,无视类型。

redis 127.0.0.1:6379> set name naxsu

OK

MSET key value [key value ...]

同时设置一个或多个key-value对。

redis 127.0.0.1:6379> mset one 1 two 2 three 3 four 4

OK

APPEND key value

如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后

如果key不存在,APPEND就简单地将给定key设为value,就像执行SET key value一样。

redis 127.0.0.1:6379> append name -neng

(integer) 10

redis 127.0.0.1:6379> get name

"naxsu-neng"

GET key

返回key所关联的字符串值。

redis 127.0.0.1:6379> get name

"naxsu-neng"

STRLEN key

返回key所储存的字符串值的长度

redis 127.0.0.1:6379> strlen name

(integer) 10

 

List(列表)

redislist类型其实就是一个每个子元素都是string类型的双向链表。所以[lr]push[lr]pop命令的算法时间复杂度都是O(1)

另外list会记录链表的长度。所以llen操作也是O(1).链表的最大长度是(232次方-1)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。有意思的是listpop操作还有阻塞版本的。当我们[lr]pop一个list对象时,如果list是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以则可以阻塞,当然可以加超时时间,超时后也会返回nil。为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。

 

下面介绍下list相关的一些命令,其他的请看相关文档:

命令

说明

示例

LPUSH key value [value ...]

将一个或多个值value插入到列表key的表头。

redis 127.0.0.1:6379> LPUSH mylist a b c

(integer) 3

RPUSH key value [value ...]

将一个或多个值value插入到列表key表尾

redis 127.0.0.1:6379> RPUSH mylist a b c

(integer) 6[6个元素中包括上例PUSH3]

LLEN key

返回列表key的长度

redis 127.0.0.1:6379> llen mylist

(integer) 6

LRANGE key start stop

返回列表key中指定区间内的元素,区间以偏移量startstop指定。

redis 127.0.0.1:6379> lrange mylist 0 6

1) "c"

2) "b"

3) "a"

4) "a"

5) "b"

6) "c"

LPOP key

移除并返回列表key的头元素

redis 127.0.0.1:6379> lpop mylist

"c"

RPOP key

移除并返回列表key的尾元素

redis 127.0.0.1:6379> rpop mylist

"c"

 

Set(集合)

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

 

下面介绍下set相关的一些命令,其他的请看相关文档:

命令

说明

示例

SADD key member [member ...]

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

redis 127.0.0.1:6379> sadd languages java c lisp python ruby

(integer) 5

SMEMBERS key

返回集合key中的所有成员

redis 127.0.0.1:6379> smembers languages

1) "c"

2) "lisp"

3) "python"

4) "java"

5) "ruby"

SREM key member [member ...]

移除集合key中的一个或多个member元素

redis 127.0.0.1:6379> srem languages lisp

(integer) 1

SISMEMBER key member

判断member元素是否是集合key的成员

redis 127.0.0.1:6379> SISMEMBER languages php

(integer) 0

SCARD key

返回集合key基数(集合中元素的数量)

redis 127.0.0.1:6379> SCARD languages

(integer) 4

SINTER key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的交集

redis 127.0.0.1:6379> sadd group_1 lilei tom jack

(integer) 3

redis 127.0.0.1:6379> sadd group_2 naxsu jack

(integer) 2

redis 127.0.0.1:6379> sinter group_1 group_2

1) "jack"

SUNION key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的并集

redis 127.0.0.1:6379> sunion group_1 group_2

1) "naxsu"

2) "lilei"

3) "tom"

4) "jack"

SDIFF key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的差集

redis 127.0.0.1:6379> SDIFF group_1 group_2

1) "lilei"

2) "tom"

 

Sorted Set (有序集)

set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score

sorted set的实现是skip listhash table的混合体,当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另一个score到元素的映射被添加到skip list,并按照score排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是O(log(N))skip list的开销一致,redisskip list实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为score存储,对象的id当元素存储。

 

下面介绍下sorted set相关的一些命令,其他的请看相关文档:

命令

说明

示例

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

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

redis 127.0.0.1:6379> ZADD page_rank 9 baidu.com 8 bing.com 10 google.com

(integer) 3

ZRANGE key start stop [WITHSCORES]

返回有序集key中,指定区间内的成员, 其中成员的位置按score值递增(从小到大)来排序

 

ZREVRANGE key start stop [WITHSCORES] 其中成员的位置按score值递减(从大到小)来排列

redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES

1) "bing.com"

2) "8"

3) "baidu.com"

4) "9"

5) "google.com"

6) "10"

ZREM key member [member ...]

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

redis 127.0.0.1:6379> ZREM page_rank google.com

(integer) 1

ZCARD key

返回有序集key的基数

redis 127.0.0.1:6379> zcard page_rank

(integer) 2

ZCOUNT key min max

返回有序集key中,score值在minmax之间(默认包括score值等于minmax)的成员

redis 127.0.0.1:6379> zcount page_rank 7 9

(integer) 2

ZSCORE key member

返回有序集key中,成员memberscore

redis 127.0.0.1:6379> zscore page_rank baidu.com

"9"

 

Hash (哈希表)

redis hash是一个string类型的fieldvalue的映射表.它的添加,删除操作都是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字节

 

下面介绍下hash相关的一些命令,其他的请看相关文档:

命令

说明

示例

HSET key field value

将哈希表key中的域field的值设为value

redis 127.0.0.1:6379> hset website google www.google.com

HGET key field

返回哈希表key中给定域field的值

redis 127.0.0.1:6379> hget website google

"www.google.com"

HDEL key field [field ...]

删除哈希表key中的一个或多个指定域,不存在的域将被忽略

redis 127.0.0.1:6379> hdel website google

(integer) 1

HMSET key field value [field value ...]

同时将多个field - value(-)对设置到哈希表key

redis 127.0.0.1:6379> HMSET website google www.google.com yahoo www.yahoo.com

OK

HMGET key field [field ...]

返回哈希表key中,一个或多个给定域的值

redis 127.0.0.1:6379> hmget website google yahoo

1) "www.google.com"

2) "www.yahoo.com"

HGETALL key

返回哈希表key中,所有的域和值

redis 127.0.0.1:6379> hgetall website

1) "naxsu"

2) "www.naxsu.com"

3) "google"

4) "www.google.com"

5) "yahoo"

6) "www.yahoo.com"

HLEN key

返回哈希表key中域的数量

redis 127.0.0.1:6379> hlen website

(integer) 3

HEXISTS key field

查看哈希表key中,给定域field是否存在

redis 127.0.0.1:6379> HEXISTS website baidu

(integer) 0

HKEYS key

返回哈希表key中的所有域

redis 127.0.0.1:6379> hkeys website

1) "naxsu"

2) "google"

3) "yahoo"

HVALS key

返回哈希表key中的所有值

redis 127.0.0.1:6379> hvals website

1) "www.naxsu.com"

2) "www.google.com"

3) "www.yahoo.com"

 

到此,redis的数据类型已经全部讲完了

 

学习笔记系统文章PDF下载地址:http://itway.iteye.com/blog/1555285

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • 《松本行弘的程序全世界》之面向对象

    《松本行弘的程序世界》之面向对象 最近读《SICP》把脑细胞搞死大半,还没看完2章,而且看得也是一知半解,实在是受不了了,...

  • GroovyHelp 3.2.7 GA公布

    GroovyHelp 3.2.7 GA发布 GroovyHelp简介   GroovyHelp是一款Javadoc及Groovydoc搜索查阅软件,它能够帮助Java开发人员以...

  • Velocity在Roller中的使用

    Velocity在Roller中的应用 Velocity是java世界中出现比较早,也比较成熟的、性能比较好的、应用也比较广泛的模板框架。   所...

  • Rpc远程调用框架的设计与兑现(2)

    Rpc远程调用框架的设计与实现(2) 接上: 3   基于Json的前后端数据交互 3.1   轻量级的数据交换形式 3.1.1    什么是Jso...

  • excel 单元格的锁定 以及 JXL的兑现方式

    excel 单元格的锁定 以及 JXL的实现方式 在使用excel表格时,有些列是不希望用户可以修改的,诸如审计日志里面确定的部分,而审计...

  • 仓秤跟散料秤:java连接opc Server

    仓秤和散料秤:java连接opc Server 这三篇都是之前写好的,一直没发。 这次一起发出来吧。   java连接硬件很痛苦,特别是对我这...

  • Rpc远程调用框架的设计与兑现(1)

    Rpc远程调用框架的设计与实现(1) Rpc远程调用框架的设计与实现 1     Rpc远程调用框架设计概述 1.1   研究背景 1.1.1...

  • 集合中的线程安全有关问题

    集合中的线程安全问题 一、why? Java中常用的集合框架推荐使用的三个实现:HashSet\ArrayList\HashMap都是线程不安全的.如...

  • Java定时任务的兑现

    Java定时任务的实现 本例依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。 MyListener: ...

  • java中log日记的使用

    java中log日志的使用 一、介绍  Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控...

热门推荐: