第三章 入门
本章详细介绍Redis的5种主要数据类型及相应的命令
3.1 简单操作介绍
-
获得符合规则的键名列表
keys pattern
其中,pattern支持glob风格通配符格式符 号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可以使用“-”符号表示一个范围, 如a[b-d]可以匹配“ab”、“ac”和“ad” \x 匹配字符x,用于转义符号、如要匹配"?"就需要使用? 正则表达式与glob风格模式的区别 http://www.voidcn.com/article/p-gmjhucid-btq.html
-
判断一个键是否存在
EXISTS key
如果存在键就返回整数类型1,否则返回0 -
删除键
DEL key [key...]
可以删除一个或多个键,返回删除的键的个数 -
获得键值的数据类型
TYPE key
用来获得键值的数据类型,返回值可能是string、hash、list、set、zset(有序集合)
上面简单操作见如图所示:
3.2 字符串类型
3.2.1 介绍
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512MB
**字符串类型是其他4中数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同。**例如,列表类型是以列表的形式组织字符串,而集合类型是以集合的形式组织字符串
3.2.2 命令
- 赋值与取值
SET key value
GET key
-
递增数字
INCE key
作用是让当前键值递增,并返回递增后的值
3.2.3 实践
Pass~~实践是检验真理的唯一标准
3.2.4 命令拾遗
-
增加指定的整数
INCRBY key increment
指定通过inrement参数指定一次增加的数值 -
减少指定的整数
DECR key
、DECRBY key decrement
与INCRBT用法相同,只不过是让简直递减 -
增加指定浮点数
INCRBYFLOAT key increment
可以递增一个双精度浮点数 -
向尾部追加值
APPEND key value
-
获取字符串长度
STRLEN key
-
同时获取/设置多个键值
MGET key [key...]
、MGET key value[key value...]
同时获得/设置多个键值 -
位操作
曾听到过的一句经典名言:“世界上有一个伟大的东西叫百度,百度能教会你许多,学会百度是一种能力与技巧”
上述命令见如图所示:
3.3 散列类型
3.3.1 介绍
散列类型的键值也是一种字典结构,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型。换言之,散列类型不能嵌套其他的数据类型
提示:除了散列类型,Redis的其他数据类型同样不支持数据类型嵌套。比如集合类型的每个元素都只能是字符串,不能是另一个集合或散列表等
对象的存储结构只是人为的约定,Redis并不要求每个键都依据此结构存储,我们完全可以自由地为任何键增减字段而不影响其他键
3.3.2 命令
-
赋值与取值
-
HSET命令用来给字段赋值,而HGET命令用来获得字段值
-
当需要同时设置多个字段的值时,使用HMSET命令。相应地,HMGET命令可以同时获得多个字段的值
-
使用HGETALL获取键中所有字段和字段值。返回的结果是字段和字段值组成的列表,这样的结果并不直观,大多数Redis客户端会将HGETALL返回的结果封装成一个对象
-
-
判断字段是否存在
HEISTS key field
用来判断一个字段是否存在 -
当字段不存在时赋值
HSETNX key field value
功能与HSET命令类似,区别在于如果字段已经存在,HSETNX命令将不执行任何操作 -
增加数字
HINCRBT key field increment
可以是字段值增加指定的整数 -
删除字段
HDEL key field [field...]
可以删除一个或多个字段
3.3.3 实践
Pass~~实践是检验真理的唯一标准
3.3.4 命令拾遗
-
只获取字段名或字段值
HKEYS key
用来获取键中所有字段的名字与之对应HVALS key
用来获得键中所有字段值 -
获得字段数量
HLEN key
3.4 列表类型
3.4.1 介绍
列表类型可以存储一个有序的字符串列表。常用的操作是向列表两端添加元素或者获得列表的某一个片段
列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。不过使用链表的代价是通过索引访问元素比较慢
这种数据类型是可以满足某些特定场景的,比起关系数据库会非常快速的完成
3.4.2 命令
-
向列表两端增加元素
LPUSH key value [value ...]
用来向列表左边增加元素,返回值表示增加元素后列表的长度RPUSH key value [value ...]
用来向列表右边增加元素,返回值表示增加元素后列表的长度 -
从列表两端弹出元素
LPOP key
从列表左边移出一个元素,并返回被移除的元素值RPOP key
从列表右边移出一个元素,并返回被移除的元素值 -
获取列表中元素的个数
LLEN key
获取列表中元素的个数值得注意的是LLEN的时间复杂度是O(1),使用时Redis会直接读取现成的值,而不需要像关系数据库遍历
-
获得列表片段
LRANGE key start stop
获取列表中的某一片段,返回索引是从start到stop之间的所有元素(包含双端元素)LRANGE还支持负索引,表示从右边开始计算序数,如“-3”表示从最右边第三个元素
一些特殊情况:
- 如果start的索引位置比stop的索引位置靠后,则会返回空列表
- 如果stop大于实际的索引范围,则会返回到列表最右边的元素
-
删除列表中指定的值
LREM key count value
删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM执行的方式也不同:count取值 执行方式 count>0 LREM命令会从列表左边开始删除前count个值为value的元素 count<0 LREM命令会从列表右边开始删除前count个值为value的元素 count=0 LREM命令会删除所有值为value的元素
3.4.3 实践
Pass~~实践是检验真理的唯一标准
3.4.4 命令拾遗
-
获得/设置指定索引的元素值
LINDEX key index
返回指定索引的元素,索引从0开始。索引也可以是负数LSET key index value
通过索引操作列表,它会将索引为index的元素赋值为value -
只保留列表指定片段
LTRIM key start end
可以删除指定索引范围之外的所有元素,其指定列表范围的方法与上述LRANGE相同 -
向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面 -
将元素从一个列表转到另一个列表
RPOPLPUSH source destination
先执行RPOP命令再执行LPUSH命令,会先从source列表类型键的右边弹出一个元素,然后加入到destination列表类型键的左边,并返回这个元素的值
3.5 集合类型
3.5.1 介绍
3.5.2 命令
-
增加/删除元素
SADD key member [member ...]
用来向集合中增加一个或多个元素SREM key member [member ...]
用来从集合中删除一个或多个元素 -
获得集合中的所有元素
SMEMBERS key
用来返回集合中的所有元素 -
判断元素是否在集合中
SISMEMBER key member
判断一个元素是否在集合中,无论集合中有多少个,都可以极快地返回结果
-
集合间运算
命 令 功 能 SDIFF key [key ...]
用来对多个集合执行差集运算 SINTER key[key ...]
用来对多个集合执行交集运算 SUNION key [key ...]
用来对多个集合执行并集运算
3.5.3 实践
Pass~~实践是检验真理的唯一标准
3.5.4 命令拾遗
-
获得集合中元素个数
SCARD key
用来获得集合中的元素个数 -
进行集合运算并将结果存储
SDIFFSTORE destination key [key ...]
用来存储差集结果到另一个集合。同时,另外两个运算也与之相同SINTERSTORE和SUNIONSTORE -
随机获得集合中的元素
SRANDMEMBER key [count]
用来随机从集合中获取一个元素,count参数见下表:count参数取值 SRANDMEMBER表现 正数 随机从集合中获得count个不重复的元素 负数 随机从集合中获得abs(count)个元素,元素可能相同 集合类型采用的存储结构是散列表造成的,散列函数将元素映射到不同的存储位置上以实现O(1)时间复杂度的元素查找。当两个不同的元素的散列值相同时会出现冲突,即用拉练法来解决这个冲突,散列值冲突的元素以链表形式存入
查找元素时先找到对应的散列值,然后再从这个散列值中的链表中随机抽取一个元素。所以说链表越短,被随机抽取的概率就越大。见下面原理图可知:
-
从集合中弹出一个元素
SPOP key
随机选择一个元素弹出
3.6 有序集合类型
3.6.1 介绍
在集合类型的基础上为集合中每一个元素都关联了一个分数。有序集合中每个元素是不相同的,但是分数是可以相同的
有序集合类型是使用散列表和跳表实现的,读取任何一个位置的数据速度很快,时间复杂度是O(log(N))
什么是跳表呢?
跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,就能轻松实现一个 SkipList。
定义
如果你要在一个有序的序列中查找元素 k ,相信大多数人第一反应都是二分查找。
如果你需要维护一个支持插入操作的有序表,大家又会想到链表。
简单的说,要达到以logn的速度查找链表中的元素
3.6.2 命令
-
增加元素
ZADD key score member [score member ...]
用来在有序集合中加入一个元素和该元素的分数,该分数可以是整数也可以是双精度浮点数+inf和-inf分别表示正无穷和负无穷
-
获得元素的分数
ZSCORE key member
-
获得排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES]
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端),加上WITHSCORES参数,会改变返回的数据格式ZREVRANGE key start stop [WITHSCORES]
与ZRANGE唯一不同就是从大到小的顺序 -
获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
按照元素分数从小到大的顺序返回分数在min和max之间(包含min、max)的元素,如果分数范围不包含端点值,可以在分数前加"("。LIMIT offset count参数表示获得元素列表的基础上向后偏移offset个元素,并且只获取前count个元素 -
增加某个元素的分数
INCRBY key increment member
可以增加一个元素的分数,返回值是更改后的分数。也可以减少,用负数表示
3.6.3 实践
Pass~~实践是检验真理的唯一标准
3.6.4 命令拾遗
-
获得集合中元素的数量
ZCARD key
-
获得指定分数范围内的元素个数
ZCOUNT key min max
参数特性与前面一样 -
删除一个或多个元素
ZREM key member [member ...]
-
按照排名范围删除元素
ZREMRANGERBYRANK key start stop
按照元素分数从小到大的顺序(索引0表示最小的值)删除在指定排名范围内的所有元素 -
按照分数范围删除元素
ZREMRANGEBYSCORE key min max
删除指定分数范围内的所有元素 -
获得元素的排名
ZRANK key member
按照元素分数从小到大的顺序获得指定的元素的排名(从0开始)
-
计算有序集合的交集
ZINTERSTORE destination numkeys key [keys ...] [weights weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
用来计算多个有序集合的交集并将结果存储在destination中。其中,destination键中元素的分数是由AGGREGATE参数决定的:- SUM是每个参与计算的集合中该元素分数的和
- MIN是每个参与计算的集合中该元素分数的最小值
- MAX是每个参与计算的集合中该元素分数的最大值
还能够通过WEIGHTS 参数设置每个集合的权值,每个集合在参与计算时元素的分数会被乘上该集合的权重
当然,与之对应的ZUNIONSTORE计算有序集合的并集用法语法都一样