天天看点

【Redis高手修炼之路】②Redis的五大数据类型

目录

  • ​​1.字符串​​
  • ​​1.1 常用命令:​​
  • ​​1.1.1 添加、查询、获取长度、字符串的追加​​
  • ​​1.1.2 批量插入和查询​​
  • ​​1.1.3 设置key值的生存时间​​
  • ​​1.1.4 key值的自增和自减​​
  • ​​1.2 使用场景​​
  • ​​2.哈希​​
  • ​​2.1 常用命令​​
  • ​​2.1.1 添加、查询、删除、获取长度以及是否存在​​
  • ​​2.1.2 key值的增加​​
  • ​​2.1.3 批量添加字段​​
  • ​​2.2 三种存储方式的区别​​
  • ​​3.列表​​
  • ​​3.1 常用命令​​
  • ​​3.1.1 列表的插入、移除及查询​​
  • ​​3.1.2 对已有列表进行更新、截取元素​​
  • ​​3.2 使用场景​​
  • ​​4.集合​​
  • ​​4.1 常用命令​​
  • ​​4.1.1 添加、删除​​
  • ​​4.1.2 交集、并集、差集​​
  • ​​4.1.3 随机数​​
  • ​​4.2 使用场景​​
  • ​​5.有序集合​​
  • ​​5.1 常用命令​​
  • ​​5.1.1 添加、查询​​
  • ​​5.1.2 排序、成员值的更新​​
  • ​​5.1.3 交集​​
  • ​​5.2 使用场景​​

1.字符串

字符串是Redis最基础的数据类型:
  • 字符串类型实际可以存储字符串、数字、二进制数据;
  • Redis中的键都是字符串类型,值也支持字符串类型;
  • 字符串类型的存储空间是有限的,最大可以存放512M的数据。

1.1 常用命令:

1.1.1 添加、查询、获取长度、字符串的追加

​set key value​

​设置指定 key 的值

​get key​

​获取指定 key 的值

​getrange key start end​

​返回 key 中字符串值的子字符

​setrange key offset value​

​用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。

​strlen key​

​返回 key 所储存的字符串值的长度

​append key value​

​如果 key 已经存在并且是一个字符串,将 value 追加到 key 原来的值的末尾

127.0.0.1:6379> set name tom
OK
127.0.0.1:6379> get name
"tom"
#当值为字符串时要加双引号,或者之间加逗号隔开,空格代表命令结束
127.0.0.1:6379> set address "bei jing" 
OK
127.0.0.1:6379> set hobby basketball,football
OK
127.0.0.1:6379> get address
"bei jing"
127.0.0.1:6379> get hobby
"basketball,football"
127.0.0.1:6379> append hobby "music"  #追加字符串
(integer) 24
127.0.0.1:6379> get hobby
"basketball,footballmusic"
127.0.0.1:6379> getrange address 0 2 #截取字符串,下标从0开始
"bei"
127.0.0.1:6379> strlen address
(integer) 8
      

1.1.2 批量插入和查询

​mset key value [key value ...]​

​同时设置一个或多个 键值对

​mget key1 [key2...]​

​获取一个或多个给定key的值

​msetnx key value [key value ...]​

​同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在

127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> msetnx weight "170" height "100"
(integer) 1
127.0.0.1:6379> mget weight height
1) "170"
2) "100"      

1.1.3 设置key值的生存时间

​setex key seconds value​

​设置key-value ,并设置key的生存时间(秒)

​psetex key milliseconds value​

​设置key-value ,并设置key的生存时间(毫秒)

​setnx key value​

​在 key 不存在时设置 key 的值

127.0.0.1:6379> setex id 10 "1001"
OK
127.0.0.1:6379> get id
"1001"
127.0.0.1:6379> get id  #10s之后就过期了
(nil)
127.0.0.1:6379> psetex key 10000 abc
OK
127.0.0.1:6379> get key
"abc"
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> setnx id "1002"
(integer) 1
127.0.0.1:6379> get id
"1002"      

1.1.4 key值的自增和自减

​incr key key​

​值自动增一

​decr key key​

​值自动减一

​incrby key increment​

​将 key 所储存的值加上给定的增量值(increment)

​incrbyfloat key increment​

​将 key 所储存的值加上给定的浮点增量值(increment)

​decrby key decrementkey​

​所储存的值减去给定的减量值(decrement)

127.0.0.1:6379> set age "15"
OK
127.0.0.1:6379> get age
"15"
127.0.0.1:6379> incr age
(integer) 16
127.0.0.1:6379> incrby age 5
(integer) 21
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379> decrby age 5
(integer) 15
127.0.0.1:6379> incrbyfloat age 1.5
"16.5"      

1.2 使用场景

  • 缓存

    set user:1 “{id:1,name:tom,…}” ex 300

  • 计数:比如计算页面的访问次数或者某个链接的点击次数

    set post:1 “0”

    incr post:1 …

  • 限速:限制一分钟只能设置5次密码

    set pwd:1 5 ex 60

    decr pwd:1

2.哈希

Redis的键所对应的值本身又是一个键值对结构
【Redis高手修炼之路】②Redis的五大数据类型

与关系型数据库的区别:

1.关系型数据库是结构化的,若添加新的列,会影响到所有的行,而哈希类型是稀疏的,每个键可以有不同的哈希数据;

2.关系型数据库则可以支持复杂的关系查询

2.1 常用命令

2.1.1 添加、查询、删除、获取长度以及是否存在

​hset key field value​

​将哈希表 key 中的字段 field 的值设为 value

​hget key field​

​获取存储在哈希表中指定字段的值/td>

​hdel key field2 [field2]​

​删除一个或多个哈希表字段

​hkeys key​

​获取所有哈希表中的字段

​hvals key​

​获取哈希表中所有值

​hgetall key​

​获取在哈希表中指定 key 的所有字段和值

​hlen key​

​获取哈希表中字段的数量

​hexists key field​

​查看哈希表 key 中,指定的字段是否存在

127.0.0.1:6379> hset user name tom age "18"
(integer) 2
127.0.0.1:6379> hget user name
"tom"
127.0.0.1:6379> hgetall user
1) "name"
2) "tom"
3) "age"
4) "18"
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "tom"
127.0.0.1:6379> hkeys user
1) "name"
127.0.0.1:6379> hlen user
(integer) 1
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user age
(integer) 0
127.0.0.1:6379> hvals user
1) "tom"      

2.1.2 key值的增加

​hincrby key field increment​

​为哈希表 key 中的指定字段的整数值加上增量 increment

​hincrbyfloat key field increment​

​为哈希表 key 中的指定字段的浮点数值加上增量 increment

127.0.0.1:6379> hset user score "85"
(integer) 1
127.0.0.1:6379> hincrby user score 5
(integer) 90
127.0.0.1:6379> hincrbyfloat user score 1.5
"91.5"      

2.1.3 批量添加字段

​hsetnx key field value​

​在字段 field 不存在时,设置哈希表字段的值

​hmget key field1 [field2]​

​获取所有给定字段的值

​hmset key field1 value1 [field2 value2]​

​同时将多个域值对设置到哈希表中

127.0.0.1:6379> hsetnx user grade 3
(integer) 1
127.0.0.1:6379> hmget user name age grade
1) "tom"
2) "20"
3) "3"
127.0.0.1:6379> hmset user gender M class 1
OK
127.0.0.1:6379> hgetall user
 1) "name"
 2) "tom"
 3) "age"
 4) "20"
 5) "score"
 6) "91.5"
 7) "grade"
 8) "3"
 9) "gender"
10) "M"
11) "class"
12) "1"      

2.2 三种存储方式的区别

  • 常规的字符串

    优点:每个键都可以单独设置过期时间;

    缺点:键占用大量内存,信息内聚性差;

  • 序列化字符串

    优点︰编程简单;

    缺点:全量更新(反序列化->更新->序列化);

  • 哈希类型

    优点:每个键都可以单独更新;

    缺点:如果没有控制好编码,会消耗更多内存。

3.列表

1.列表是线性有序的数据结构;

2.列表中的元素是可以重复的;

3.—个列表最多能存储232-1个元素。

3.1 常用命令

3.1.1 列表的插入、移除及查询

​lpush key value1 [value2]​

​将一个或多个值插入到列表头部(左插入)

​rpush key value1 [value2]​

​在列表尾部添加一个或多个值(右插入)

​rpop key​

​移除并输出列表最后一个元素

​lpop key​

​移出并输出列表的第一个元素

​llen key​

​获取列表长度

​lindex key index​

​ 通过索引获取列表中的元素

​lrange key start stop​

​获取列表指定范围内的元素

127.0.0.1:6379> lpush list 3 2 1
(integer) 3
127.0.0.1:6379> rpush list 4 5 6
(integer) 6
127.0.0.1:6379> lrange list 0 -1 # 相当于lrange list 0 5 ,-1表示末尾
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpop list
"6"
127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> llen list
(integer) 4
127.0.0.1:6379> lindex list 3
"5"      

3.1.2 对已有列表进行更新、截取元素

​lrem key count value​

​根据value移除指定数量的值

​lset key index value​

​通过索引更新元素

​linsert key before|after pivot value​

​在列表的元素前或者后插入元素

​lpushx key value​

​ 将一个或多个值插入到已存在的列表头部

​rpushx key value​

​将一个或多个值插入到已存在的列表尾部

​ltrim key start stop​

​裁剪列表元素,只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

​rpoplpush source destination​

​移除列表的最后一个元素,并将该元素添加到另一个列表并返回

127.0.0.1:6379> lpush mylist a 1 a 2 b 3 b 4 c 5 a 6
(integer) 12
127.0.0.1:6379> lrem mylist 2 a   #删除前两个a
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
 1) "6"
 2) "5"
 3) "c"
 4) "4"
 5) "b"
 6) "3"
 7) "b"
 8) "2"
 9) "1"
10) "a"
127.0.0.1:6379> lset mylist 1 12
OK
127.0.0.1:6379> linsert mylist before 3 111   #在3前面插入111
(integer) 11
127.0.0.1:6379> lrange mylist 0 -1
 1) "6"
 2) "12"
 3) "c"
 4) "4"
 5) "b"
 6) "111"
 7) "3"
 8) "b"
 9) "2"
10) "1"
11) "a"
127.0.0.1:6379> lpushx mylist aaa
(integer) 12
127.0.0.1:6379> rpushx mylist bbb
(integer) 13
127.0.0.1:6379> lrange mylist 0 -1
 1) "aaa"
 2) "6"
 3) "12"
 4) "c"
 5) "4"
 6) "b"
 7) "111"
 8) "3"
 9) "b"
10) "2"
11) "1"
12) "a"
13) "bbb"
127.0.0.1:6379> ltrim mylist 0 5
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "aaa"
2) "6"
3) "12"
4) "c"
5) "4"
6) "b"
127.0.0.1:6379> rpoplpush mylist newlist
"b"      

3.2 使用场景

  • 消息队列:生产者通过lpush命令从列表左侧插入元素;消费者通过brpop命令从列表右侧弹出元素;
  • 内容列表:有序存储用户的待办事项、收藏文章等内容;

4.集合

1.集合中的元素是无序、不可重复的,一个集合最多能存储232-1个元素;

2.集合除了支持对元素的增删改查之外,还支持对多个集合取交集、并集、差集。

4.1 常用命令

4.1.1 添加、删除

​sadd key member1 member2​

​向集合中添加一个或多个成员

​scard key​

​获取集合成员数

​spop key​

​移除并返回集合中的一个随机元素

​smembers key​

​返回集合中的所有成员

​sismember key member​

​判断member是否是集合key的成员

​srem key member1 member2​

​移除集合中的一个或多个成员

​smove source destination member​

​将 member 元素从 source 集合移动到 destination 集合

127.0.0.1:6379> sadd myset1 a b c d e f
(integer) 6
127.0.0.1:6379> sadd myset2 d e f g h i
(integer) 6
127.0.0.1:6379> scard myset1
(integer) 6
127.0.0.1:6379> smembers myset1
1) "b"
2) "a"
3) "c"
4) "f"
5) "d"
6) "e"
127.0.0.1:6379> spop myset1 2  # 随机移除2个成员
1) "e"
2) "b"
127.0.0.1:6379> sismember myset1 c   #查询集合中是否存在c
(integer) 1
127.0.0.1:6379> srem myset1 f #将集合中的f移除
(integer) 1
127.0.0.1:6379> smove myset1 newset a  #将a从集合myset1移动到newset
(integer) 1
127.0.0.1:6379> smembers newset
1) "a"      

4.1.2 交集、并集、差集

​sinter key1 key2返​

​回给定的集合的交集

​sunion key1 key2​

​返回给定的集合的并集

​sdiff key1 key2​

​返回给定的集合的差集

​sinterstore destination key1 key2​

​返回给定的集合的交集并存到destination中

​sunionstore destination key1 key2​

​返回给定的集合的并集并存到destination中

​sdiffstore destination key1 key2​

​返回给定的集合的差集并存到destination中

127.0.0.1:6379> sinter myset1 myset2
1) "d"
2) "e"
127.0.0.1:6379> sunion myset1 myset2
1) "d"
2) "e"
3) "a"
4) "c"
5) "g"
6) "h"
7) "f"
8) "b"
9) "i"
127.0.0.1:6379> sdiff myset1 myset2
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> sinterstore newset1 myset1 myset2
(integer) 2
127.0.0.1:6379> smembers newset1
1) "d"
2) "e"
127.0.0.1:6379> sunionstore newset2 myset1 myset2
(integer) 9
127.0.0.1:6379> smembers newset2
1) "d"
2) "e"
3) "a"
4) "c"
5) "g"
6) "h"
7) "f"
8) "b"
9) "i"
127.0.0.1:6379> sdiffstore newset3 myset1 myset2
(integer) 3
127.0.0.1:6379> smembers newset3
1) "a"
2) "b"
3) "c"      

4.1.3 随机数

​srandmember key count​

​随机返回集合中的一个或多个元素

127.0.0.1:6379> srandmember myset1 2 #随机返回两个元素
1) "b"
2) "a"
127.0.0.1:6379> srandmember myset1 
"a"
127.0.0.1:6379> srandmember myset1 
"d"      

4.2 使用场景

  • 点赞:统计一篇文章的点赞数量
  • 命令:scard like
  • 抽奖:在一组数据中随机弹出一个元素以达到抽奖的目的
  • 命令:spop user
  • 共同关注:通过求两个集合的交集来达到目的
  • 命令:sinterstore follow follow1 follow2

5.有序集合

1.有序集合保留了集合元素不能重复的特点;

2.有序集合会给每个元素设置一个分数,并以此作为排序的依据;

3.有序集合不能包含相同的元素,但是不同元素的分数可以相同。

5.1 常用命令

5.1.1 添加、查询

​zadd key score1 member1 score2 member2​

​向有序集合添加一个或多个成员,或者更新已存在成员的分数

​zrange key start stop [WITHSCORES]​

​通过索引区间返回有序集合成指定区间内的成员

​zrangebyscore key min max [WITHSCORES] [LIMIT]​

​通过分数返回有序集合指定区间内的成员

​zcount key min max​

​计算在有序集合中指定区间分数的成员数

127.0.0.1:6379> zadd scores 70 tom
(integer) 1
127.0.0.1:6379> zadd scores 80 lucy 85 lily
(integer) 2
127.0.0.1:6379> zrange scores 0 -1
1) "tom"
2) "lucy"
3) "lily"
127.0.0.1:6379> zrange scores 0 -1 withscores
1) "tom"
2) "70"
3) "lucy"
4) "80"
5) "lily"
6) "85"
127.0.0.1:6379> zrangebyscore scores 70 85 withscores
1) "tom"
2) "70"
3) "lucy"
4) "80"
5) "lily"
6) "85"
127.0.0.1:6379> zrangebyscore scores -inf 80 withscores  #负无穷到80
1) "tom"
2) "70"
3) "lucy"
4) "80"
127.0.0.1:6379> zrangebyscore scores 80 +inf withscores  #80到正无穷
1) "lucy"
2) "80"
3) "lily"
4) "85"
127.0.0.1:6379> zcount scores 70 80
(integer) 2      

5.1.2 排序、成员值的更新

​zrevrange key start stop [WITHSCORES]​

​返回有序集中指定区间内的成员,由大到小

​zrevrangebyscore key max min [WITHSCORES]​

​返回有序集中指定分数区间内的成员,分数由大到小

​zrank key member​

​返回有序集合中指定成员的索引

​zscore key member​

​返回有序集中,成员的分数值

​zincrby key increment member​

​有序集合中对指定成员的分数加上增量 increment

​zcard key​

​获取有序集合的成员数

127.0.0.1:6379> zrevrange scores 0 -1 withscores
 1) "jery"
 2) "90"
 3) "dady"
 4) "88"
 5) "lily"
 6) "85"
 7) "lucy"
 8) "80"
 9) "tom"
10) "70"
127.0.0.1:6379> zrevrangebyscore scores 88 80
1) "dady"
2) "lily"
3) "lucy"
127.0.0.1:6379> zrank scores tom
(integer) 0
127.0.0.1:6379> zscore scores lucy
"80"
127.0.0.1:6379> zincrby scores 5 lucy
"85"
127.0.0.1:6379> zcard scores
(integer) 5
127.0.0.1:6379> zrem scores jery
(integer) 1      

5.1.3 交集

127.0.0.1:6379> zunionstore newscores 2 scores scores1 aggregate max
(integer) 5
127.0.0.1:6379> zrange newscores 0 -1 withscores
 1) "das"
 2) "56"
 3) "tom"
 4) "70"
 5) "lily"
 6) "85"
 7) "lucy"
 8) "85"
 9) "dady"
10) "88"      

5.2 使用场景

  • 排行榜:根据文章或帖子的点赞数、评论数、浏览量等的权重来统计
  • 命令zrevrange key 0 -1
  • 延时队列:轮询集合中的数据,根据分数判断是否超时,若超时则做出处理并移除数据
  • 命令:zrange key 0 0 , zremrangebyrank key 0 0 / zpopmin