redis的数据类型
redis支持的数据类型包括String、Hash、List、Set、Sorted 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:password,blog: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。
当key和newkey相同或者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(字符串)
string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。从内部实现来看其实string可以看作byte数组,最大上限是1G字节。下面是string类型的定义。
struct sdshdr {
long len;
long free;
char buf[];
};
buf是个char数组用于存贮实际的字符串内容。其实char和c#中的byte是等价的,都是一个字节
len是buf数组的长度,free是数组中剩余可用字节数。由此可以理解为什么string类型是二进制安全的了。因为它本质上就是个byte数组,当然可以包含任何数据了。另外string类型可以被部分命令按int处理.比如incr等命令,下面详细介绍。还有redis的其他类型像list、set、sorted set、hash它们包含的元素与都只能是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(列表)
redis的list类型其实就是一个每个子元素都是string类型的双向链表。所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1)
另外list会记录链表的长度。所以llen操作也是O(1).链表的最大长度是(2的32次方-1)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。有意思的是list的pop操作还有阻塞版本的。当我们[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个元素中包括上例PUSH的3个]
|
LLEN key
|
返回列表key的长度
|
redis 127.0.0.1:6379> llen mylist
(integer) 6
|
LRANGE key start stop
|
返回列表key中指定区间内的元素,区间以偏移量start和stop指定。
|
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(集合)
redis的set是string类型的无序集合。set元素最大可以包含(2的32次方-1)个元素。set的是通过hash table实现的,所以添加,删除,查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。需要注意的是调整hash table大小时候需要同步(获取写锁)会阻塞其他读写操作。可能不久后就会改用跳表(skip list)来实现跳表已经在sorted set中使用了。关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐和blog的tag功能。
下面介绍下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 list和hash table的混合体,当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另一个score到元素的映射被添加到skip list,并按照score排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是O(log(N))和skip list的开销一致,redis的skip 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值在min和max之间(默认包括score值等于min或max)的成员
|
redis 127.0.0.1:6379> zcount page_rank 7 9
(integer) 2
|
ZSCORE key member
|
返回有序集key中,成员member的score值
|
redis 127.0.0.1:6379> zscore page_rank baidu.com
"9"
|
Hash (哈希表)
redis hash是一个string类型的field和value的映射表.它的添加,删除操作都是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的数据类型已经全部讲完了
分享到:
相关推荐
在本“Redis学习笔记-包括周阳和狂神说”中,我们将深入探讨Redis的核心概念、功能特性以及实际应用。 1. Redis基本概念 - 键值对:Redis的核心数据结构,键是唯一的标识,值可以是多种类型,如字符串、哈希、列表...
`NoSql数据库之Redis笔记.docx`很可能是关于Redis的使用和最佳实践的学习笔记,可能涵盖了Redis的数据类型、命令操作、集群搭建等内容。`redis.conf-中文翻译.txt`则提供了`redis.conf`配置文件的中文解释,有助于...
Redis全套学习笔记 Redis是一种基于内存的NoSQL数据库,具有高性能、可扩展性和灵活性等特点。以下是Redis的详细知识点: 安装和启动 * 安装Redis可以通过下载软件包或使用yum、apt-get等安装工具进行安装。 * ...
一级分类:基础知识- Redis 数据类型- Redis 命令- Redis 过期策略- Redis 事务- Redis 持久化- Redis 发布订阅- Redis Lua 脚本- Redis 位图操作- Redis 分布式锁- Redis 主从复制- Redis 集群- Redis Sentinel- ...
二、 redis学习笔记之数据类型 3 三、 redis学习笔记之排序 11 四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记...
- 选择合适的数据类型:根据业务需求选择最合适的Redis数据类型,可以显著提升效率。 - 调整配置:根据实际情况调整Redis的内存限制、持久化策略等,确保系统稳定运行。 - 监控与维护:定期检查Redis的内存使用、...
### 超详细的Redis学习笔记知识点汇总 #### 1. Redis 的启动与停止 ##### 1.1 直接启动 Redis 服务 - **默认端口启动**:使用 `$ redis-server` 命令,默认监听端口为 `6379`。 - **指定端口启动**:使用 `$ ...
redis学习笔记redis 是一个开源的 key-value 数据库。它又经常被认为是一个数据结构服务器。 因为它的 value 不仅包括基本的 string 类型还有 list,set ,sorted set 和 hash 类型。当 然这些类型的元素也都是 string...
Redis作为一款高性能的键值存储数据库,支持多种数据类型,包括String、List、Set、ZSet和Hash,并且提供了数据持久化的机制,包括快照(Snapshot)和AOF(Append Only File)两种方式。在Java操作方面,可以利用...
### Redis 学习笔记知识点概览 #### 一、Redis 概述与应用场景 ##### 1.1 NoSQL 数据库简介 - **定义**: NoSQL(Not Only SQL)泛指非关系型数据库,它们通常不使用传统的表格关系来存储数据。 - **特性**: NoSQL ...
04-Redis数据类型 - Redis教程 05-Redis命令 - Redis教程 06-Redis键 - Redis教程。。。 13-Redis发布订阅 - Redis教程 。。。 24-Redis Java连接操作 - Redis教程 。。。 27-redis-cluster研究和使用 。。。
这个“redis学习笔记.zip”压缩包很可能是包含了关于Redis的学习资料,可能包括概念解释、操作教程、实践案例等内容,适合初学者和有一定基础的学习者参考。 Redis的学习可以分为以下几个主要部分: 1. **基础知识...
Redis学习笔记 Redis是基于键值对存储的NoSQL数据库,可以用来存储和检索数据。下面是Redis的基础知识点: 基础命令 * set key value:保存一个数据,重复set相同的key只会保存最新的value * get key:获取一个...
"深入redis学习(二)--redis five weapons.doc"揭示了Redis的五大核心数据类型:字符串、哈希、列表、集合和有序集合。字符串是最基础的类型,用于存储单个值;哈希是键值对的集合,适合存储对象;列表支持双向插入...
二、 redis学习笔记之数据类型 3 三、 redis学习笔记之排序 11 四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis...
2. Redis 数据类型: - **字符串(String)**:基本的键值对,支持设置、获取、追加、长度计算、原子递增/递减等操作。 - **列表(List)**:双端队列,允许在两端插入和删除元素,支持范围查询,可用于消息队列。 - ...
- **数据类型**:使用 String、Hash、List、Set 和 Sorted Set 存储和操作数据。 - **入门使用**:通过命令行交互,进行增删改查操作。 ### 3. REDIS 命令和管理 - **Server 端命令**:如 `INFO` 获取服务器状态,...