Redis基础(1)——数据类型

五种基本类型及其用法


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

  1. "BMW"

  2. "black"

127.0.0.1:6379> HMSET car:2 name audi color white

OK

127.0.0.1:6379> HMGET car:2 name color

  1. "audi"

  2. "white"

127.0.0.1:6379> HGETALL car

(empty list or set)

127.0.0.1:6379> HGETALL car:1

  1. "name" //字段名

  2. "BMW" //字段值

  3. "color" //字段名

  4. "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

  1. "name"

  2. "color"

127.0.0.1:6379> HVALS car:1

  1. "BMW"

  2. "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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容