五种基本类型及其用法
STRING类型
获得符合规则的键名列表
KEYS pattern
pattern可以以glob通配符的形式出现
| 符号 | 含义 |
|---|---|
| ? |匹配一个字符
|| * |匹配任意个字符|
| [] |匹配括号见的任意字符,可以用-来表示一个范围,如a[b-d]可以匹配ab,ac,ad|
| \x |匹配字符x,用于转意,若需要匹配?则使用 \?|
EXISTS key
如果key存在则返回整数类型的1,否则返回0
DEL key [key ...]
可以删除一个或者多个key,返回值是删除key的个数
TYPE key
用来获取key值的数据类型字符串类型是redis中最基本的数据类型,他可以储存任何形式的字符串,包括二进制字符,因为他是二进制安全的。你可以用string类型来存储邮箱、对象乃至图片,允许存储的数据最大容量是512MB,是其他4种数据类型的基础。
赋值和取值
赋值:为key赋值valueSET key value
取值:获取key的值GET key
递增数字
key的值加 1
INCR key
key的值加 3
INCRBY key 3
key的值减 1
DECR key
key的值减 2
DECRBY key 2
key的值加 2.1
INCRBYFLOAT 2.1
INCR以及INCRBY只适用于INT类型的操作,即key的值为整数,递增的量也是整数。下例会报错:
127.0.0.1:6379> set foo 2.1
OK
127.0.0.1:6379> INCR foo
(error) ERR value is not an integer or out of range
127.0.0.1:6379> INCRBYFLOAT foo 2.1
"4.2"
向尾部追加值
APPEND key value
用法示例:
127.0.0.1:6379> SET hi hello
OK
127.0.0.1:6379> APPEND hi " world !"
(integer) 13
127.0.0.1:6379> GET hi"hello world !"//若字符串中含有空格,则需要加引号
获取字符串长度
STRLEN key //返回key的值的长度,如果key不存在则返回0
同时获得/设置对个键值
MSET key1 value1 key2 value2 key3 value3 ...
//同时设置多个键值
MGET key1 key2 key3 ...
//同时获取多个键值
127.0.0.1:6379> MSET key1 1 key2 2 key3 3
OK127.0.0.1:6379> MGET key1 key2 key3
1) "1"
2) "2"
3) "3"
位操作
GETBIT key offset
// 获取key offset位置的值 offset从左往右计算,从0开始
SETBIT key offset value
// 将key offset位置的值设置为value,value只能为0/1
BITCOUNT key [start] [end]
// 获取key中值为1的位数
BITOP operation result key1 [key2 ...]
// 对key1 key2 进行operation位运算,结果存放于result
BITPOS key value [start] [end]
// start end之间首次出现value的位置```
---
#### 散列类型(HASH)
散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则储存属性值。例如存储ID为2的汽车对象,可以分别使用名为color、name和price三个字段来存储汽车的颜色、名称和价格。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2353159-f9b9c793aecde868.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**redis可以单独的为任何键自由的增减字段而不影响其他键。**
##### 取值和赋值
HSET key field value
// 赋值
HGET key field
// 取值
HMSET key field value [field value ...]
// 设置某个值的多个字段
HMGET key field [field ...]// 获取某个值的多个字段
HGETALL key
// 获取某个值的全部字段
127.0.0.1:6379> HSET car:1 name BMW
(integer) 1
127.0.0.1:6379> HSET car:1 color black
(integer) 1
127.0.0.1:6379> HGET car:1 name
"BMW"
127.0.0.1:6379> HGET car:1 color
"black"
127.0.0.1:6379> HMGET car:1 name color
"BMW"
"black"
127.0.0.1:6379> HMSET car:2 name audi color white
OK
127.0.0.1:6379> HMGET car:2 name color
"audi"
"white"
127.0.0.1:6379> HGETALL car
(empty list or set)
127.0.0.1:6379> HGETALL car:1
"name" //字段名
"BMW" //字段值
"color" //字段名
"black" //字段值
##### 判断字段是否存在
HEXISTS key field
// 判断key中的field是否存在,存在返回1,不存在返回0
##### 当字段不存在的时候赋值
HSETNX key field value
//当field字段不存在时再进行赋值
127.0.0.1:6379> HEXISTS car:1 name
(integer) 1
127.0.0.1:6379> HEXISTS car:1 value
(integer) 0
127.0.0.1:6379> HSETNX car:1 value 900000
(integer) 1 //赋值成功返回1
127.0.0.1:6379> HSETNX car:1 value 900000
(integer) 0 //赋值失败返回0
##### 增加数字
HINCRBY key field increment
// 将key的field字段值增加increment
127.0.0.1:6379> HGET car:1 amount
"20"
127.0.0.1:6379> HINCRBY car:1 amount 5
(integer) 25
##### 删除字段
HDEL key field [field]
// 删除一个或者多个字段,返回值是被删除字段的个数
127.0.0.1:6379> HDEL car:1 value amount(integer) 2
##### 只获取字段名 或 字段值
HKEYS key
// 只获取key中所有的字段名而不需要字段的值
HVALS key
// 只获取key中所有的字段值而不需要字段名
127.0.0.1:6379> HKEYS car:1
"name"
"color"
127.0.0.1:6379> HVALS car:1
"BMW"
"black"
##### 获得字段数量
```HLEN key
// 获取field的数量
列表类型
向列表两端添加元素
LPUSH key value1 [value2 ...]
// 向列表左端添加元素,按照value的顺序,从左往右依次添加
// 最终 value2在value1的左边 ......
RPUSH key value1 [value2 ...]
// 向列表右端添加元素,最终value1在value2的左边
从列表两端弹出元素
LPOP key
// 从列表左端弹出
RPOP key
// 从列表右端弹出
获取列表中元素个数
LLEN key
// 获取key中元素的个数,若key不存在返回0
获得列表的片段
LRANGE key start stop
// 获取索引从start到stop之间的所有元素
LRANGE 命令在获取列表片段时并不会像LPOP一样删除该片段,另外LRANGE命令取出的片段包含索引在start和stop位置的元素,同时LRANGE支持负索引,表示从右边开始计算序数,“-1”表示最右边的元素,-2 表示右数第二个元素,以此类推……所以,若想获取所有元素 请用命令: LRANGE key 0 -1 。如果stop过大,则会返回到列表最右边的元素;如果stop
- 当count>0,LREM会从列表左边开始删除前count个值为value的元素;
- 当count<0,LREM会从列表右边开始删除前|count|个值为value的元素;
- 当count=0,LREM会删除所有值为value的元素。
++列表示例++
127.0.0.1:6379> LPUSH numbers 1 //1
(integer) 1
127.0.0.1:6379> LPUSH numbers 2 3 // 3 2 1
(integer) 3
127.0.0.1:6379> RPUSH numbers 0 -1 // 3 2 1 0 -1
(integer) 5
127.0.0.1:6379> LPOP numbers // 2 1 0 -1
"3"
127.0.0.1:6379> RPOP numbers // 2 1 0
"-1"
127.0.0.1:6379> LLEN numbers // 2 1 0
(integer) 3
127.0.0.1:6379> LRANGE numbers 0 2 //2 1 0
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LREM numbers 1 0 // 2 1
(integer) 1
获取/设置指定索引的元素值
LINDEX key index
// 获取索引为index的元素值
LSET key index value
// 设置索引位置为index的元素值为value
// 若index为负数,则为从右开始计算
只保留指定列表片段
LTRIM key start end
// 只保留列表start和end(start和end位置也会保留)之间的片段
向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
// 先会在列表中从左到右查找值为pivot的元素
// 然后根据第二个参数是before还是after来决定将value插入前边还是后边
将元素从一个列表转移到另一个列表
RPOPLPUSH source destination
// 先从source中RPOP出一个元素,再把这个元素LPUSH到destination中
++列表示例++
127.0.0.1:6379> LRANGE numbers 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
9) "0"
10) "-1"
11) "-2"
12) "-3"
13) "-4"
14) "-5"
127.0.0.1:6379> LINDEX numbers 5
"3"
127.0.0.1:6379> LSET numbers 5 0
OK
127.0.0.1:6379> LINDEX numbers 5
"0"
127.0.0.1:6379> LTRIM numbers 3 10
OK
127.0.0.1:6379> LRANGE numbers 0 -1
1) "5"
2) "4"
3) "0"
4) "2"
5) "1"
6) "0"
7) "-1"
8) "-2"
127.0.0.1:6379> LINSERT numbers AFTER 0 3
(integer) 9
127.0.0.1:6379> LRANGE numbers 0 -1
1) "5"
2) "4"
3) "0"
4) "3"
5) "2"
6) "1"
7) "0"
8) "-1"
9) "-2"
127.0.0.1:6379> LINSERT numbers BEFORE 5 6
(integer) 10
127.0.0.1:6379> LRANGE numbers 0 -1
1) "6"
2) "5"
3) "4"
4) "0"
5) "3"
6) "2"
7) "1"
8) "0"
9) "-1"
10) "-2"
127.0.0.1:6379> RPOPLPUSH numbers another
"-2"
127.0.0.1:6379>
127.0.0.1:6379> LRANGE numbers 0 -1
1) "6"
2) "5"
3) "4"
4) "0"
5) "3"
6) "2"
7) "1"
8) "0"
9) "-1"
127.0.0.1:6379> LRANGE another 0 -1
1) "-2"
127.0.0.1:6379> RPOPLPUSH numbers another
"-1"
127.0.0.1:6379> LRANGE another 0 -1
1) "-1"
2) "-2"
集合类型
集合类型常用的操作是向集合中加入或者删除元素、判断某个元素是否存在等,由于集合类型在redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是O(1).更方便的是还可以将多个集合进行并集、交集、差集运算。
||集合类型|列表类型|
|---|---|---|
|存储内容|至多232-1个字符串|至多232-1个字符串|
|有序性|否|是|
|唯一性|是|否|
增加/删除元素
SADD key member1 [member2 ...]
//向集合中增加一个或者多个元素,返回值为成功加入的个数
SREM key member1 [member2 ...]
//向集合中删除一个或者多个元素,返回值为删除成功的个数
获得集合中的所有元素
SMEMBERS key
// 返回集合中的所有元素
判断元素是否在集合中
SISMEMBER key member
// 判断一个元素是否在集合中,时间复杂度为O(1)
// 值存在时,返回1,不存在时返回0
集合间运算
SDIFF key1 [key2 ...]
//key1-key2,key1 key2的差集
SINTER key [key ...]
//对多个集合求交集
SUNION key [key ...]
//SUNION对多个集合求并集
获取集合中元素个数
SCARD key
// 获取key中的元素个数
进行集合运算并将结果存储
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
//进行相应运算,但不直接返回运算结果,而是将结果存到destination中
随机操作
// 随机获得集合中的元素
SRANDMEMBER key [count]
//count 为正数时,随机从集合获取count个不重复的元素
//count为负数时,随机从集合获取|count|个元素,有可能重复
//从集合中随机弹出一个元素
SPOP key
操作举例
127.0.0.1:6379> SADD letters a
(integer) 1
127.0.0.1:6379> SADD letters a b c
(integer) 2
127.0.0.1:6379> SREM letters c d
(integer) 1
127.0.0.1:6379> SMEMBERS letters
1) "a"
2) "b"
127.0.0.1:6379> SISMEMBER letters a
(integer) 1
127.0.0.1:6379> SISMEMBER letters c
(integer) 0
127.0.0.1:6379> SADD setA 1 2 3
(integer) 3
127.0.0.1:6379> SADD setB 2 3 4
(integer) 3
127.0.0.1:6379> SDIFF setA setB
1) "1"
127.0.0.1:6379> SINTER setA setB
1) "2"
2) "3"
127.0.0.1:6379> SUNION setA setB
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SCARD letters
(integer) 2
127.0.0.1:6379> SRANDMEMBER letters
"a"
127.0.0.1:6379>
127.0.0.1:6379> SRANDMEMBER letters 2
1) "a"
2) "b"
127.0.0.1:6379> SRANDMEMBER letters 5
1) "a"
2) "b"
127.0.0.1:6379> SRANDMEMBER letters -5
1) "b"
2) "b"
3) "a"
4) "b"
5) "a"
127.0.0.1:6379> SPOP letters
"a"
127.0.0.1:6379> SMEMBERS letters
1) "b"
有序集合类型
有序集合类型为集合中的每一个元素都关联了分数,这使得不仅可以集合类型操作,而且还能轻易的获得分数最高的(最低的)N个元素等与分数相关的操作。虽然集合中元素不同,但是他们的分数却可以相同。
++有序集合类型和列表类型有些相似++
二者都是有序的,二者都可以获得某一范围的元素
++但也有不同的地方++
- 列表类型是基于链表实现的,获取两端的数据速度极快,但是当元素较多时,获取中间部分的元素的速度会比较慢。更适合新鲜事,或者日志这样很少访问中间元素的应用。
- 有序集合类型是使用散列表和跳跃表(skip list)实现的,所以即使读取中间位置的数据速度也很快(时间复杂度:O(log(N)))
- 列表中不能很简单的调整某个元素的位置,但是有序集合可以(更改分数即可)
- 有序集合更加消耗内存
命令
ZADD key score member [score member ...]
// 用来向有序集合加入一个元素和该元素的分数
// 分数可以是双精度浮点数
ZSCORE key member
// 获取元素的分数
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
// 获得排名在某个范围的元素列表
// ZRANGE 为从小到大,ZREVRANGE为从大到小
// 时间复杂度为O(log n+m),n为有序集合的基数,m为返回元素个数
// 如果两元素分数相等,redis会按照字典顺序来排列
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
// 获得指定分数范围的元素
ZINCRBY key increment member
// 把member的分数增加increment
ZCARD key
// key中元素的数量
ZCOUNT key min max
// min和max之间的元素个数
ZREM key member [member ...]
// 删除一个或多个元素
// 返回值为成功删除的数量
ZREMRANGEBYRANK key start stop
// 删除排名在start到stop之间的元素
ZREMRANGEBYSCORE key min max
// 删除指定分数范围内的所有元素
ZRANK key member
ZREVRANK key member
// 获取member的排名,从小到大/从大到小
/////////////////////
127.0.0.1:6379> ZADD scoreboard 89 Tom 67 Peter 100 David
(integer) 3
127.0.0.1:6379> ZADD scoreboard 76 Peter
(integer) 0
127.0.0.1:6379> ZADD testboard 17E+307 a
(integer) 1
127.0.0.1:6379> ZADD testboard 1.5 b
(integer) 1
127.0.0.1:6379> ZADD testboard +inf c
(integer) 1
127.0.0.1:6379> ZADD testboard -inf d
(integer) 1
127.0.0.1:6379> ZSCORE testboard c
"inf"
127.0.0.1:6379>
127.0.0.1:6379> ZSCORE testboard d
"-inf"
127.0.0.1:6379> ZSCORE scoreboard Tom
"89"
127.0.0.1:6379> ZRANGE scoreboard 0 2
1) "Peter"
2) "Tom"
3) "David"
127.0.0.1:6379> zrevrange scoreboard 0 -1
1) "David"
2) "Tom"
3) "Peter"
127.0.0.1:6379> zrevrange scoreboard 0 -1 withscores
1) "David"
2) "100"
3) "Tom"
4) "89"
5) "Peter"
6) "76"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 100
1) "Tom"
2) "David"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 (100
1) "Tom"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf
1) "Tom"
2) "David"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf withscores
1) "Tom"
2) "89"
3) "David"
4) "100"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf limit 1,1
(error) ERR syntax error
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf limit 1 1
1) "David"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf limit 0 1
1) "Tom"
127.0.0.1:6379> ZINCRBY scoreboard 4 Jerry
"4"
127.0.0.1:6379> ZINCRBY scoreboard 4 Jerry
"8"
127.0.0.1:6379> ZINCRBY scoreboard -1 Jerry
"7"
127.0.0.1:6379>
127.0.0.1:6379> ZCARD scoreboard
(integer) 4
127.0.0.1:6379> ZCOUNT scoreboard 90 100
(integer) 1
127.0.0.1:6379> ZCOUNT scoreboard 90 (100
(integer) 0