`

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

分享到:
评论

相关推荐

    Redis学习笔记-安装、性能、复制等

    一、Redis 介绍 二、Redis 性能介绍 三、Redis 功能 四、Redis 安装及配置 五、Redis 启动 六、Redis 的数据类型 七、Redis 的master/slave 配置

    Redis学习笔记整理

    二、 redis学习笔记之数据类型 3 三、 redis学习笔记之排序 11 四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记...

    redis学习笔记

    redis学习笔记redis 是一个开源的 key-value 数据库。它又经常被认为是一个数据结构服务器。 因为它的 value 不仅包括基本的 string 类型还有 list,set ,sorted set 和 hash 类型。当 然这些类型的元素也都是 string...

    分布式缓存REDIS学习笔记

    04-Redis数据类型 - Redis教程 05-Redis命令 - Redis教程 06-Redis键 - Redis教程。。。 13-Redis发布订阅 - Redis教程 。。。 24-Redis Java连接操作 - Redis教程 。。。 27-redis-cluster研究和使用 。。。

    Redis学习笔记.rar

    二、 redis学习笔记之数据类型 3 三、 redis学习笔记之排序 11 四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis...

    Redis学习笔记.pdf

    简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的...redis 提供了多种数据类型来支持不同的业 务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

    redis学习笔记(详细总结)

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、...Redis 可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

    Redis全套学习笔记

    Redis全套学习笔记,分享的是整理的《Redis 全套学习笔记.pdf》,图文并茂,特别详细,基本上涵盖了 Redis 所有知识点。redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,...

    redis 缓存技术学习笔记

    这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是...

    Redis学习资料整理.zip

    个人的学习笔记,五大基本数据类型,相关配置,redis事务,主从同步,集群,持久化,Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本...

    Redis的学习笔记

    之前整理的redis的一些相关知识,从安装到配置,主要是介绍各数据类型和命令

    Redis设计与实现学习思维笔记.xmind

    Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的...

    Redis配套学习资料

    redis是一款高性能的NOSQL系列的非关系型数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题...

    Redis必备基础知识

    本资源包含redis的学习笔记,详细记录了学习和使用Redis必须要了解的各种知识点,包括redis的安装、数据类型、持久化、主从复制、集群搭建、如何整合redis,以及redis应用的各种问题的解决方案等等

    cyc学习笔记.pdf

    2021秋招学习笔记总结,包含Java基础、Java并发、数据库、redis等常用后端技术等内容。数据类型 注:包装类型中一般设有缓冲池,比如Integer、String。 1、Integer缓存池范围-128~127都是同一个地址,在缓存池范围...

    redisDoc:Redis源代码学习笔记

    redisDoc 本系列通过分析Redis的5.0.8版本的源代码,来了解Redis的内部实现细节。 基础数据类型 高级数据类型 对象类型 数据库操作 网络IO接口 Redis服务器组件

    python基础学习笔记整理

    2.1.1、变量和数据类型 2.1.2、控制流程if for while 2.1.3、函数实例 2.1.4、购物车 2.1.5、字符编码与文件操作 2.1.6、可迭代对象、迭代器、生成器 2.2、封装 2.2.1、面向对象编程 2.2.2、类的继承与派生 2.2.3、...

Global site tag (gtag.js) - Google Analytics