第3节 Redis常见命令

Mr.Tong...
  • redis
  • redis
大约 10 分钟

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样,下面介绍常用的5种常见数据结构。

1652887393157

✅String命令

String类型,也就是字符串类型,是Redis中最简单的存储类型。

1652890121291

其value是字符串,不过根据字符串的格式不同,又可以分为3类:string(普通字符串)、int(整数类型)、float(浮点类型),其中int和float可以做自增,自减操作。

String的常见命令有:

命令描述
SET添加或者修改已经存在的一个String类型的键值对
GET根据key获取String类型的value
MSET批量添加多个String类型的键值对
MGET根据多个key获取多个String类型的value
INCR让一个整型的key自增1
INCRBY让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
INCRBYFLOAT让一个浮点类型的数字自增并指定步长
SETNX添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETEX添加一个String类型的键值对,并且指定有效期

贴心小提示:以上命令除了INCRBYFLOAT 都是常用命令,案例如下:

1.SET 和GET: 如果key不存在则是新增,如果存在则是修改

127.0.0.1:6379> set name Rose  //原来不存在
OK
127.0.0.1:6379> get name 
"Rose"
127.0.0.1:6379> set name Jack //原来存在,就是修改
OK
127.0.0.1:6379> get name
"Jack"

2.MSET和MGET

127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> MGET name age k1 k2 k3
1) "Jack" //之前存在的name
2) "10"   //之前存在的age
3) "v1"
4) "v2"
5) "v3"

3.INCR和INCRBY和DECY

127.0.0.1:6379> get age 
"10"
127.0.0.1:6379> incr age //增加1
(integer) 11
127.0.0.1:6379> get age //获得age
"11"
127.0.0.1:6379> incrby age 2 //一次增加2
(integer) 13 //返回目前的age的值  
127.0.0.1:6379> incrby age 2
(integer) 15  
127.0.0.1:6379> incrby age -1 //也可以增加负数,相当于减
(integer) 14  
127.0.0.1:6379> incrby age -2 //一次减少2个
(integer) 12
127.0.0.1:6379> DECR age //相当于 incr 负数,减少正常用法
(integer) 11  
127.0.0.1:6379> get age 
"11"

4.SETNX

127.0.0.1:6379> help setnx

  SETNX key value
  summary: Set the value of a key, only if the key does not exist
  since: 1.0.0
  group: string

127.0.0.1:6379> set name Jack  //设置名称
OK
127.0.0.1:6379> setnx name lisi //如果key不存在,则添加成功
(integer) 0
127.0.0.1:6379> get name //由于name已经存在,所以lisi的操作失败
"Jack"
127.0.0.1:6379> setnx name2 lisi //name2 不存在,所以操作成功
(integer) 1
127.0.0.1:6379> get name2 
"lisi"

5.SETEX

127.0.0.1:6379> setex name 10 jack
OK
127.0.0.1:6379> ttl name
(integer) 8
127.0.0.1:6379> ttl name
(integer) 7
127.0.0.1:6379> ttl name
(integer) 5

拓展:了解Key的层级结构

在此之前我们知道Redis是一个key-value的数据库。而Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?

例如,需要存储用户,商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:

Redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下:

多级key格式 项目名:业务名:类型:id

这个格式并非固定,也可以根据自己的需求来删除或添加词条。

例如我们的项目名称叫 test,有user和product两种不同类型的数据,我们可以这样定义key:

  • user相关的key:test:user:1

  • product相关的key:test:product:1

如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:

  • heima:user:1 ,{"id":1, "name": "Jack", "age": 21}
  • heima:product:1,{"id":1, "name": "小米11", "price": 4999}

一旦我们向redis采用这样的方式存储,那么在可视化界面中,redis会以层级结构来进行存储,形成类似于这样的结构,更加方便Redis获取数据

1652941883537

✅Hash命令

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构,Hash类型的常见命令如下:

命令描述
HSET key field value添加或者修改hash类型key的field的值
HGET key field获取一个hash类型key的field的值
HMSET批量添加多个hash类型key的field的值
HMGET批量获取多个hash类型key的field的值
HGETALL获取一个hash类型的key中的所有的field和value
HKEYS获取一个hash类型的key中的所有的field
HINCRBY key field increment让一个hash类型key的字段值自增并指定步长
HSETNX key field value添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

  • heima:user:1,{name:"Jack", age:21}(KEY、VALUE(键值对))

而Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

1652942027719

贴心小提示:哈希结构也是我们以后实际开发中常用的命令哟

1.HSET和HGET

127.0.0.1:6379> HSET heima:user:3 name Lucy//大key是 heima:user:3 小key是name,小value是Lucy
(integer) 1
127.0.0.1:6379> HSET heima:user:3 age 21// 如果操作不存在的数据,则是新增
(integer) 1
127.0.0.1:6379> HSET heima:user:3 age 17 //如果操作存在的数据,则是修改
(integer) 0
127.0.0.1:6379> HGET heima:user:3 name 
"Lucy"
127.0.0.1:6379> HGET heima:user:3 age
"17"

2.HMSET和HMGET

127.0.0.1:6379> HMSET heima:user:4 name HanMeiMei
OK
127.0.0.1:6379> HMSET heima:user:4 name LiLei age 20 sex man
OK
127.0.0.1:6379> HMGET heima:user:4 name age sex
1) "LiLei"
2) "20"
3) "man"

3.HGETALL

127.0.0.1:6379> HGETALL heima:user:4
1) "name"
2) "LiLei"
3) "age"
4) "20"
5) "sex"
6) "man"

4.HKEYS和HVALS

127.0.0.1:6379> HKEYS heima:user:4
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS heima:user:4
1) "LiLei"
2) "20"
3) "man"

5.HINCRBY

127.0.0.1:6379> HINCRBY  heima:user:4 age 2
(integer) 22
127.0.0.1:6379> HVALS heima:user:4
1) "LiLei"
2) "22"
3) "man"
127.0.0.1:6379> HINCRBY  heima:user:4 age -2
(integer) 20

6.HSETNX

127.0.0.1:6379> HSETNX heima:user4 sex woman
(integer) 1
127.0.0.1:6379> HGETALL heima:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
127.0.0.1:6379> HSETNX heima:user:3 sex woman
(integer) 1
127.0.0.1:6379> HGETALL heima:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
5) "sex"
6) "woman"

✅List命令

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。

特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

List的常见命令有:

命令描述
LPUSH key element ...向列表左侧插入一个或多个元素
LPOP key移除并返回列表左侧的第一个元素,如果列表为空则返回null
RPUSH key element ...向列表右侧插入一个或多个元素
RPOP key移除并返回列表右侧的第一个元素,如果列表为空则返回null
LRANGE key start end返回指定范围内元素(包含start和end对应的元素,如果end为-1,则返回从start到列表末尾的所有元素)
BLPOP key timeout从列表左侧弹出一个元素,如果列表为空,等待指定时间,而不是直接返回null
BRPOP key timeout从列表右侧弹出一个元素,如果列表为空,等待指定时间,而不是直接返回null

1652943604992

1.LPUSH和RPUSH(左进右进)

127.0.0.1:6379> LPUSH users 1 2 3
(integer) 3
127.0.0.1:6379> RPUSH users 4 5 6
(integer) 6

2.LPOP和RPOP(左出右出)

127.0.0.1:6379> LPOP users
"3"
127.0.0.1:6379> RPOP users
"6"

3.LRANGE:查看1-2范围的数据

127.0.0.1:6379> LRANGE users 1 2
1) "1"
2) "4"

✅Set命令

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集.并集.差集等功能

Set类型的常见命令

命令描述
SADD key member ...向集合中添加一个或多个元素
SREM key member ...从集合中移除一个或多个元素
SCARD key返回集合中元素的个数
SISMEMBER key member判断一个元素是否存在于集合中
SMEMBERS key获取集合中的所有元素
SINTER key1 key2 ...求一个或多个集合的交集
SDIFF key1 key2 ...求第一个集合与其他集合的差集(即存在于key1但不存在于其他key中的元素)
SUNION key1 key2 ...求一个或多个集合的并集

例如两个集合:s1和s2:

求交集:SINTER s1 s2

求s1与s2的不同:SDIFF s1 s2

具体命令

127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> smembers s1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> srem s1 a
(integer) 1
    
127.0.0.1:6379> SISMEMBER s1 a
(integer) 0
    
127.0.0.1:6379> SISMEMBER s1 b
(integer) 1
    
127.0.0.1:6379> SCARD s1
(integer) 2

案例

  • 将下列数据用Redis的Set集合来存储:
  • 张三的好友有:李四.王五.赵六
  • 李四的好友有:王五.麻子.二狗
  • 利用Set的命令实现下列功能:
  • 计算张三的好友有几人
  • 计算张三和李四有哪些共同好友
  • 查询哪些人是张三的好友却不是李四的好友
  • 查询张三和李四的好友总共有哪些人
  • 判断李四是否是张三的好友
  • 判断张三是否是李四的好友
  • 将李四从张三的好友列表中移除
127.0.0.1:6379> SADD zs lisi wangwu zhaoliu
(integer) 3
    
127.0.0.1:6379> SADD ls wangwu mazi ergou
(integer) 3
    
127.0.0.1:6379> SCARD zs
(integer) 3
    
127.0.0.1:6379> SINTER zs ls
1) "wangwu"
    
127.0.0.1:6379> SDIFF zs ls
1) "zhaoliu"
2) "lisi"
    
127.0.0.1:6379> SUNION zs ls
1) "wangwu"
2) "zhaoliu"
3) "lisi"
4) "mazi"
5) "ergou"
    
127.0.0.1:6379> SISMEMBER zs lisi
(integer) 1
    
127.0.0.1:6379> SISMEMBER ls zhangsan
(integer) 0
    
127.0.0.1:6379> SREM zs lisi
(integer) 1
    
127.0.0.1:6379> SMEMBERS zs
1) "zhaoliu"
2) "wangwu"

✅SortedSet类型

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。

SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

SortedSet的常见命令有:

命令描述
ZADD key score member添加一个或多个元素到sorted set ,如果已经存在则更新其score值
ZREM key member ...删除有序集合中的一个或多个指定元素。
ZSCORE key member获取有序集合中指定元素的分数。
ZRANK key member获取有序集合中指定元素的排名(从0开始,按分数从小到大排序)。
ZCARD key获取有序集合中的元素个数。
ZCOUNT key min max统计有序集合中分数在给定范围内的元素个数。
ZINCRBY key increment member让有序集合中指定元素的分数按指定的增量进行增加或减少。
ZRANGE key min max按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max按照score排序后,获取指定score范围内的元素
ZDIFF, ZINTER, ZUNION求差集.交集.并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

  • 升序获取sorted set 中的指定元素的排名:ZRANK key member
  • 降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber

你认为这篇文章怎么样?

  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.1