深入浅出Redis(零):Redis常用命令的使用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 深入浅出Redis(零):Redis常用命令的使用

前言

Redis是一款基于键值对的数据结构存储系统,它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等

本篇文章作为深入浅出Redis(一):对象与数据结构的基础篇,将深入浅出的介绍Redis中常用命令,如果想了解底层实现可以去观看那篇文章

Redis中的命令分为两种,一种则是所有对象通用的,另一种是专门为对象使用的

本篇文章将先简单说明通用命令,再说明五大对象(string、hash、list、set、zset)专用命令

通用命令

  • keys *查看所有key
  • sort key 对key进行排序,key只能是list、set、zset对象
  • exists key查看这个key是否存在,存在为1,不存在为0
127.0.0.1:6379> keys *
 1) "age"
 2) "name"
 127.0.0.1:6379> exists name
 (integer) 1
 127.0.0.1:6379> exists names
 (integer) 0
  • move key db把这个key移动到编号为几的数据库,成功为1,失败为0
127.0.0.1:6379> move name 3      
 (integer) 1
 127.0.0.1:6379> keys  *
 1) "age"
 127.0.0.1:6379> select 3
 OK
 127.0.0.1:6379[3]> keys *
 1) "name"
  • 把name移动到了编号为3的数据库(第四个数据库)
  • expire key seconds让这个key多少秒失效,返回1为成功,0为失败
  • ttl key查看这个key的有效时间,返回-1为永久,-2为已过期,其他数字代表有效秒数
127.0.0.1:6379[3]> expire name 10
 (integer) 1
 127.0.0.1:6379[3]> ttl name
 (integer) 7
 127.0.0.1:6379[3]> ttl name
 (integer) 6
 127.0.0.1:6379[3]> ttl name
 (integer) 5
 127.0.0.1:6379[3]> ttl name
 (integer) 4
 127.0.0.1:6379[3]> ttl name
 (integer) 2
 127.0.0.1:6379[3]> ttl name
 (integer) -2
 127.0.0.1:6379[3]> ttl name
 (integer) -2
 127.0.0.1:6379[3]> ttl name
 (integer) -2
 127.0.0.1:6379[3]> expire name 10
 (integer) 0
 127.0.0.1:6379[3]> keys *
 (empty list or set)
  • type key返回这个key的类型
127.0.0.1:6379[3]> get age
 "1"
 127.0.0.1:6379[3]> type age
 string

String(字符串)

动态字符数组

  • set key value设置一个key的值
  • get key得到这个key的值
  • append key value给key追加字符串value。如果key不存在就相当于 set key
127.0.0.1:6379> append name "hello"
 (integer) 5
 127.0.0.1:6379> get name
 "hello"
 127.0.0.1:6379> append name ",wrold!"
 (integer) 12
 127.0.0.1:6379> get name
 "hello,wrold!"
  • strlen key获得这个key的字符串长度
127.0.0.1:6379> get name
 "hello,wrold!"
 127.0.0.1:6379> strlen name
 (integer) 12
  • incr key让key自增1
  • decr key让key自减1
127.0.0.1:6379> set age 18
 OK
 127.0.0.1:6379> incr age
 (integer) 19
 127.0.0.1:6379> decr age
 (integer) 18
  • incrby key increment让key增加指定的增量(设置步长)
  • decrby key decrement让key减少指定的减量(设置步长)
127.0.0.1:6379> get age
 "18"
 127.0.0.1:6379> incrby age 10
 (integer) 28
 127.0.0.1:6379> decrby age 20
 (integer) 8
  • getrange key start end截取字符串【start,end】(这里是下标,从0开始,end如果是-1就算截取到倒数第一位,类似substring方法)
  • setrange key offset value替换指定位置开始的字符串
127.0.0.1:6379> get string
 "hello"
 127.0.0.1:6379> getrange string 0 2
 "hel"
 127.0.0.1:6379> setrange string 0 abcd
 (integer) 5
 127.0.0.1:6379> get string
 "abcdo"
  • setex key seconds value设置key的过期秒数(set with expire)
127.0.0.1:6379> setex name 10 hello
OK
127.0.0.1:6379> get name
"hello"
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
  • setnx key value如果key不存在就创建,存在就创建失败
127.0.0.1:6379> setnx name liang
 (integer) 1
 127.0.0.1:6379> get name
 "liang"
 127.0.0.1:6379> setnx name chenliang
 (integer) 0
 127.0.0.1:6379> get name
 "liang"
  • mset key value[key value...]同时设置多个元素
  • mget key [key...]同时获取多个元素
127.0.0.1:6379[3]> mset user:1:name liang user:1:age 18  
 #这个key是精妙的设计,user:{id}:{filed}
 OK
 127.0.0.1:6379[3]> mget user:1
 1) "{name:al,age:3}"
 127.0.0.1:6379[3]> mget user:1:name user:1:age
 1) "liang"
 2) "18"
  • msetnx key value[key value...]在setnx的基础上加上可同时创建多个,如果有一个存在,所有都不会创建成功(原子性)
  • getset先get再set
127.0.0.1:6379[3]> getset name redis #不存在返回空
 (nil)
 127.0.0.1:6379[3]> getset name mongodb #返回原来设置的redis,再设置mongodb
 "redis"
 127.0.0.1:6379[3]> get name
 "mongodb"
  • rename key newkey重命名key
127.0.0.1:6379> set name chenliang
 OK
 127.0.0.1:6379> rename name liang
 OK
 127.0.0.1:6379> get name
 (nil)
 127.0.0.1:6379> get liang
 "chenliang"
  • del key...删除一个或多个Key
127.0.0.1:6379> get liang
 "chenliang"
 127.0.0.1:6379> del liang
 (integer) 1
 127.0.0.1:6379> get liang
 (nil)

Hash(哈希)

可以把hash当作map集合 Hash:key-<field,value>

有关hash的命令基本上是以h开头

可以把以下的key看成hash

  • hset key field value设置hash中的字段和值,返回1为创建并赋值,0为已经有了并覆盖
  • hget key field得到hash中一个字段对应的值
  • hmset key field value[field value...]设置同个hash的多个字段和值
  • hmget key field field...得到同个hash的多个字段对应的值
  • hgetall key获得这个hash的数据
127.0.0.1:6379> hset user:1 name liang
 (integer) 1
 127.0.0.1:6379> hmset user:1 age 18 addres China
 OK
 127.0.0.1:6379> hget user:1 name
 "liang"
 127.0.0.1:6379> hmget user:1 age addres
 1) "18"
 2) "China"
 127.0.0.1:6379> hgetall user:1
 1) "name"
 2) "liang"
 3) "age"
 4) "18"
 5) "addres"
 6) "China"
 127.0.0.1:6379> hset user:1 name chenliang
 (integer) 0
 127.0.0.1:6379> hgetall user:1
 1) "name"
 2) "chenliang"
 3) "age"
 4) "18"
 5) "addres"
 6) "China"
  • hdel key field field...删除一个或多个hash指定字段(对应的值就消失了)
127.0.0.1:6379> hgetall user:1
 1) "name"
 2) "chenliang"
 3) "age"
 4) "18"
 5) "addres"
 6) "China"
 127.0.0.1:6379> hdel user:1 addres age
 (integer) 2
 127.0.0.1:6379> hgetall user:1
 1) "name"
 2) "chenliang"
 127.0.0.1:6379> hdel user:1 name
 (integer) 1
 127.0.0.1:6379> hgetall user:1
 (empty list or set)
  • hlen key获得hash字段数
127.0.0.1:6379> hmset user:2 name zhangsan age 20 address china
 OK
 127.0.0.1:6379> hlen user:2
 (integer) 3
  • hexists key field判断该hash中是否存在field该字段,在返回1,不在返回0
127.0.0.1:6379> hgetall user:2
 1) "name"
 2) "zhangsan"
 3) "age"
 4) "20"
 5) "address"
 6) "china"
 127.0.0.1:6379> hexists user:2 name
 (integer) 1
 127.0.0.1:6379> hexists user:2 names
 (integer) 0
  • hkeys key只获得所有hash的字段
  • hvalue key只获得所有hash的值
127.0.0.1:6379> hgetall user:2
 1) "name"
 2) "zhangsan"
 3) "age"
 4) "20"
 5) "address"
 6) "china"
 127.0.0.1:6379> hkeys user:2
 1) "name"
 2) "age"
 3) "address"
 127.0.0.1:6379> hvals user:2
 1) "zhangsan"
 2) "20"
 3) "china"
  • hincrby key field increment 给hash的字段自增(increment设置步长)
127.0.0.1:6379> hset hash count 0
 (integer) 1
 127.0.0.1:6379> hincrby hash count 10
 (integer) 10
 127.0.0.1:6379> hincrby hash count -20
 (integer) -10
  • hsetnx key field value也是给hash设置字段和值,与hset不同的是如果已经存在就失败返回0,如果还没有就成功返回1,与setnx用法类似
127.0.0.1:6379> hsetnx user:3 name liang
 (integer) 1
 127.0.0.1:6379> hsetnx user:3 name cheng
 (integer) 0
 127.0.0.1:6379> hvals user:3
 1) "liang"

List(列表)

有关List的指令大部分都是以L开头(往左边操作),以R开头(往右边操作)

以下的key可以看成列表

  • lpush key value...在队列头(左)插入一个或多个元素
  • rpush key value...在队列尾(右)插入一个或多个元素
  • lrange key start end用法与range相同
127.0.0.1:6379> lpush list hello1 hello2 hello3
 (integer) 3
 127.0.0.1:6379> lrange list 0 -1
 1) "hello3"
 2) "hello2"
 3) "hello1"
 127.0.0.1:6379> rpush list hello4 hello5 hello6
 (integer) 6
 127.0.0.1:6379> lrange list 0 -1
 1) "hello3"
 2) "hello2"
 3) "hello1"
 4) "hello4"
 5) "hello5"
 6) "hello6"
  • lpop key从队列左边移除一个元素并返回
  • rpop key从队列右边移除一个元素并返回
127.0.0.1:6379> lpop list
 "hello3"
 127.0.0.1:6379> rpop list
 "hello6"
 127.0.0.1:6379> lrange list 0 -1
 1) "hello2"
 2) "hello1"
 3) "hello4"
 4) "hello5"
  • lindex key index通过下标获取一个元素
  • llen key返回队列的长度
127.0.0.1:6379> lrange list 0 -1
 1) "hello2"
 2) "hello1"
 3) "hello4"
 4) "hello5"
 127.0.0.1:6379> lindex list 0
 "hello2"
 127.0.0.1:6379> llen list
 (integer) 4
  • lrem count value从列表中删除多少个元素(从头到尾)
127.0.0.1:6379> lrange list 0 -1
 1) "hello1"
 2) "hello4"
 3) "hello2"
 4) "hello1"
 5) "hello2"
 6) "hello1"
 7) "hello4"
 8) "hello5"
 127.0.0.1:6379> lrem list 2 hello1
 (integer) 2
 127.0.0.1:6379> lrange list 0 -1
 1) "hello4"
 2) "hello2"
 3) "hello2"
 4) "hello1"
 5) "hello4"
 6) "hello5"
  • ltrim key start end将列表修剪到指定范围(start从0开始 end-1表示倒数第一位)
127.0.0.1:6379> lrange list 0 -1
 1) "hello4"
 2) "hello2"
 3) "hello2"
 4) "hello1"
 5) "hello4"
 6) "hello5"
 127.0.0.1:6379> ltrim list 2 -1
 OK
 127.0.0.1:6379> lrange list 0 -1
 1) "hello2"
 2) "hello1"
 3) "hello4"
 4) "hello5"
  • rpoplpush source destination将source的最后一个元素,插到destination的头部
127.0.0.1:6379> lrange list 0 -1
 1) "hello2"
 2) "hello1"
 3) "hello4"
 4) "hello5"
 127.0.0.1:6379> lpush mylist hello1
 (integer) 1
 127.0.0.1:6379> rpoplpush list mylist
 "hello5"
 127.0.0.1:6379> lrange list  0 -1
 1) "hello2"
 2) "hello1"
 3) "hello4"
 127.0.0.1:6379> lrange mylist  0 -1
 1) "hello5"
 2) "hello1"
  • lset key index value将列表中指定的index下标的值替换为value,如果index超出范围返回error
127.0.0.1:6379> lrange mylist  0 -1
 1) "hello5"
 2) "hello1"
 127.0.0.1:6379> lset mylist 2 hello
 (error) ERR index out of range
 127.0.0.1:6379> lset mylist 0 hello
 OK
 127.0.0.1:6379> lrange mylist 0 -1
 1) "hello"
 2) "hello1"
  • linsert key before|after pivot value在列表中的一个元素(pivot)之前(before)或之后(after)插入另一个元素(value)
127.0.0.1:6379> lrange mylist 0 -1
 1) "hello"
 2) "hello1"
 127.0.0.1:6379> linsert mylist before hello1 hello0
 (integer) 3
 127.0.0.1:6379> linsert mylist after hello1 hello2
 (integer) 4
 127.0.0.1:6379> lrange mylist 0 -1
 1) "hello"
 2) "hello0"
 3) "hello1"
 4) "hello2"
  • 阻塞
    blpop key 时间秒
    brpop key 时间秒

Set(集合)

无序,不可重复的散列表:Key用来存值,Value则是空的(类似HashSet)

有关set的指令基本上都是以s开头

以下的key可以看成set集合

  • sadd key value...给set集合中添加一个或多个元素,返回1为成功,0为失败
  • smembers key查看set集合中所有元素
  • sismember key value判断value是不是在set集合中
  • scard key返回set集合中的元素个数
127.0.0.1:6379> sadd set1 a
 (integer) 1
 127.0.0.1:6379> sadd set1 b
 (integer) 1
 127.0.0.1:6379> sadd set1 c
 (integer) 1
 127.0.0.1:6379> smembers set1
 1) "c"
 2) "b"
 3) "a"
 127.0.0.1:6379> sismember set1 a
 (integer) 1
 127.0.0.1:6379> sismember set1 d
 (integer) 0
 127.0.0.1:6379> scard set1
 (integer) 3
  • srandmember key [count]随机抽取set集合中的多个元素,不写count默认一个,返回抽中的元素
127.0.0.1:6379> srandmember set1
 "b"
 127.0.0.1:6379> srandmember set1
 "c"
 127.0.0.1:6379> srandmember set1 2
 1) "b"
 2) "a"
  • srem key value...指定删除一个或多个set集合中的元素,返回删除的元素
127.0.0.1:6379> smembers set1
 1) "c"
 2) "b"
 3) "a"
 127.0.0.1:6379> srem set1 a b
 (integer) 2
 127.0.0.1:6379> smembers set1
 1) "c"
  • spop key [count]随机删除set集合中的元素,不写count默认一个,返回删除的元素
127.0.0.1:6379> smembers set1
 1) "c"
 2) "b"
 3) "a"
 4) "d"
 127.0.0.1:6379> spop set1
 "d"
 127.0.0.1:6379> spop set1 2
 1) "c"
 2) "b"
 127.0.0.1:6379> smembers set1
 1) "a"
  • smove source destination member将set集合(source)中指定的一个元素(member)移动到另一个set集合(destination)中
127.0.0.1:6379> smembers set1
 1) "a"
 127.0.0.1:6379> sadd set2 b
 (integer) 1
 127.0.0.1:6379> smove set1 set2 a
 (integer) 1
 127.0.0.1:6379> smembers set1
 (empty list or set)
 127.0.0.1:6379> smembers set2
 1) "b"
 2) "a"
  • sdiff key key..差集(以第一个set集合作为对象去比较)
  • sinter key key..交集(以第一个set集合作为对象去比较)【共同好友的实现】
  • sunion key key..并集(以第一个set集合作为对象去比较)
127.0.0.1:6379> sadd set1 a b c
 (integer) 3
 127.0.0.1:6379> sadd set2 c d f
 (integer) 3
 127.0.0.1:6379> sdiff set1 set2
 1) "b"
 2) "a"
 127.0.0.1:6379> sinter set1 set2
 1) "c"
 127.0.0.1:6379> sunion set1 set2
 1) "c"
 2) "b"
 3) "f"
 4) "a"
 5) "d"

Zset(有序集合)

看作是一个有序的集合,它比集合多了一个score用来排序

把以下的key看成有序集合

  • zadd key score member在同一个有序集合中添加一个或多个带score的值
  • zrangebyscore key min max [withscores]让有序集合从min到max这个范围排序输出,-inf ,+inf代表负无穷,正无穷,如果加上withscores就会把成员的score也输出出来
  • zrevrangebyscore key min max [withscores]从max到min ,与zrangebuscore 类似
  • zrevrange key start stop从score高到低输出成员 0代表第一个元素,-1代表倒数第一个
  • zrange key start stop从score低到高输出成员 0代表第一个元素,-1代表倒数第一个
127.0.0.1:6379> zadd zset 1 one 2 two 3 three
 (integer) 3
 127.0.0.1:6379> zrangebyscore zset 0 2 
 1) "one"
 2) "two"
 127.0.0.1:6379> zrangebyscore zset -inf +inf
 1) "one"
 2) "two"
 3) "three"
 127.0.0.1:6379> zrangebyscore zset -inf +inf withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 127.0.0.1:6379> zrevrangebyscore zset +inf -inf withscores
 1) "three"
 2) "3"
 3) "two"
 4) "2"
 5) "one"
 6) "1"
 127.0.0.1:6379> zrange zset 0 -1
 1) "one"
 2) "two"
 3) "three"
 127.0.0.1:6379> zrevrange zset 0 -1
 1) "three"
 2) "two"
 3) "one"
  • zrem key member member...移除有序集合中的成员
  • zcard key获得有序集合中的个数
  • zcount key min max获得min~max范围之间的成员数量
127.0.0.1:6379> zrange zset 0 -1
 1) "one"
 2) "two"
 3) "three"
 127.0.0.1:6379> zrem zset one
 (integer) 1
 127.0.0.1:6379> zrange zset 0 -1
 1) "two"
 2) "three"
 127.0.0.1:6379> zcard zset
 (integer) 2
 127.0.0.1:6379> zcount zset -inf +inf
 (integer) 2


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
25天前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
30 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
19天前
|
缓存 NoSQL 测试技术
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!
|
24天前
|
缓存 NoSQL Redis
Redis命令:列表模糊删除详解
Redis命令:列表模糊删除详解
21 3
|
26天前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
136 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
11天前
|
NoSQL Redis 数据安全/隐私保护
Redis 命令
10月更文挑战第15天
19 0
|
2月前
|
监控 NoSQL Redis
redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
55 3
|
2月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
57 0
|
3月前
|
存储 消息中间件 NoSQL
Redis命令详解以及存储原理
Redis命令详解以及存储原理
|
4月前
|
存储 缓存 NoSQL
Redis 全局通用命令整理
Redis 全局通用命令整理
63 10
|
4月前
|
存储 JSON NoSQL
Redis常见命令大全
【7月更文挑战第30天】
36 3