前言
本章整理一下Redis常用命令。
Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令。
这些命令运用在不同的场景下,本章只介绍其中常用的一部分,剩下的命令在用到的时候可以去查询字典。
这里罗列了两个官方地址,也可以作为参考。
redis官方命令文档地址:https://redis.io/commands
redis中文官方文档地址:http://www.redis.cn/commands.html
五大基本数据类型
基础操作命令
PING
如果后面没有参数时返回PONG,否则会返回后面带的参数。
这个命令经常用来测试一个连接是否还是可用的,或者用来测试一个连接的延时。
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> ping hello
"hello"
SELECT index
选择一个数据库,下标值从0开始,一个新连接默认连接的数据库是DB0。注意:redis默认16个数据库。
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> select 0
OK
SHUTDOWN [NOSAVE] [SAVE]
停止所有客户端.
如果配置了save 策略 则执行一个阻塞的save命令.
如果开启了AOF,则刷新aof文件…
关闭redis服务进程(redis-server).
[NOSAVE] [SAVE] 退出时是否持久化存储
127.0.0.1:6379> shutdown
not connected>
exit
退出
not connected> exit
[root@zhangdl bin]#
FLUSHDB
删除当前数据库里面的所有数据。
127.0.0.1:6379> flushdb
OK
FLUSHALL
删除所有数据库里面的所有数据,注意不是当前数据库,而是所有数据库。
127.0.0.1:6379> flushAll
OK
TIME
TIME 命令返回当前Unix时间戳和这一秒已经过去的微秒数
127.0.0.1:6379> time
1) "1617849342"
2) "212874"
TYPE key
返回key所存储的value的数据结构类型,它可以返回string, list, set, zset 和 hash等不同的类型。
127.0.0.1:6379[3]> type arr1
list
127.0.0.1:6379[3]> type age
string
EXISTS key
返回key是否存在。
127.0.0.1:6379> EXISTS name
(integer) 1
一、String(字符串)
SET key value
将键key设定为指定的“字符串”值。
如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。
127.0.0.1:6379> set age 18
OK
GET key
返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。
127.0.0.1:6379> get name
"zs"
DEL key
删除指定的一批keys,如果删除中的某些key不存在,则直接忽略。
127.0.0.1:6379[3]> get name
"sss"
127.0.0.1:6379[3]> del name
(integer) 1
127.0.0.1:6379[3]> get name
(nil)
keys [正则表达式]
查找所有符合给定模式pattern(正则表达式)的 key 。
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> keys n?me
1) "name"
DBSIZE
返回当前数据里面keys的数量。
127.0.0.1:6379> dbsize
(integer) 2
APPEND key value
如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。
127.0.0.1:6379> get name2
"ls"
127.0.0.1:6379> append name2 123 #返回追加后的字符长度
(integer) 5
127.0.0.1:6379> get name2
"ls123"
STRLEN key
返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
127.0.0.1:6379> get name2
"ls123"
127.0.0.1:6379> strlen name2
(integer) 5
INCR key
对存储在指定key的数值执行原子的加1操作。
如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。
如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,
那么执行这个命令时服务器会返回一个错误
127.0.0.1:6379> get name
"zs123"
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incr age
(integer) 19
127.0.0.1:6379> incr a # a不存在
(integer) 1
DECR key
对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。
127.0.0.1:6379> decr name
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr age
(integer) 18
127.0.0.1:6379> decr b
(integer) -1
INCRBY key increment
将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> INCRBY age 10
(integer) 28
DECRBY key decrement
将key对应的数字减decrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。
127.0.0.1:6379> DECRBY age 15
(integer) 13
MOVE key db
将当前数据库的 key 移动到给定的数据库 db 当中。
如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果
127.0.0.1:6379> move a 3
(integer) 1
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> keys *
1) "a"
EXPIRE key seconds
设置key的过期时间,超过时间后,将会自动删除该key。
TTL key
返回key剩余的过期时间。
127.0.0.1:6379[3]> get a
"1"
127.0.0.1:6379[3]> expire a 10
(integer) 1
127.0.0.1:6379[3]> ttl a
(integer) 6
127.0.0.1:6379[3]> ttl a
(integer) -2
127.0.0.1:6379[3]> ttl a
(integer) -2
127.0.0.1:6379[3]> get a
(nil)
GETSET key value
返回key的值,并给key设置新的value值
127.0.0.1:6379[3]> get name
"zs"
127.0.0.1:6379[3]> getset name ls
"zs"
127.0.0.1:6379[3]> get name
"ls"
GETRANGE key start end
返回key的字串,start和end为下标,0为第一个,1为第二个,-1为倒数第一个,以此类推。
127.0.0.1:6379[3]> get s
"abcdefg"
127.0.0.1:6379[3]> getrange s 0 2
"abc"
127.0.0.1:6379[3]> getrange s -3 -1
"efg"
SETRANGE key offset value
这个命令的作用是覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度
127.0.0.1:6379[3]> get s
"abcdefg"
127.0.0.1:6379[3]> setrange s 3 hi
(integer) 7
127.0.0.1:6379[3]> get s
"abchifg"
127.0.0.1:6379[3]> setrange s 5 hello
(integer) 10
127.0.0.1:6379[3]> get s
"abchihello"
MSET key value [key value …]
对应给定的keys到他们相应的values上。
MGET key [key …]
返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil
127.0.0.1:6379[3]> mset k1 zs k2 ls
OK
127.0.0.1:6379[3]> mget k1 k2
1) "zs"
2) "ls"
SETNX/SETEX
SETNX key 当key不存在时,setkey,存在不操作。
SETEX key seconds value 给key设置过期时间
这两个方法可以使用set代替,此处不举例说明了。
二、List(链表)
List默认为一个字符串链表,左右都可插入元素,默认左边为头部,索引小,右边为尾部,索引大。
LPUSH key value [value …]
将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
RPUSH key value [value …]
向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是一个列表,那么会返回一个错误。
LRANGE key start stop
返回存储在 key 的列表里指定范围内的元素。 start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。
127.0.0.1:6379[3]> lrange name 0 -1
(empty array)
127.0.0.1:6379[3]> lpush name zs
(integer) 1
127.0.0.1:6379[3]> lpush name ls ws
(integer) 3
127.0.0.1:6379[3]> lrange name 0 -1
1) "ws"
2) "ls"
3) "zs"
127.0.0.1:6379[3]> rpush name xx
(integer) 4
127.0.0.1:6379[3]> lrange name 0 -1
1) "ws"
2) "ls"
3) "zs"
4) "xx"
LPOP key
移除并且返回 key 对应的 list 的第一个元素。
RPOP key
移除并返回存于 key 的 list 的最后一个元素。
127.0.0.1:6379[3]> lpop name
"ws"
127.0.0.1:6379[3]> lrange name 0 -1
1) "ls"
2) "zs"
3) "xx"
127.0.0.1:6379[3]> rpop name 2 # 从尾部移除两个并返回移除的值
1) "xx"
2) "zs"
127.0.0.1:6379[3]> lrange name 0 -1
1) "ls"
LINDEX key index
127.0.0.1:6379[3]> lrange name 0 -1
- “zhaoliu”
- “wangwu”
- “lisi”
- “zhangsan”
127.0.0.1:6379[3]> lindex name 1
“wangwu”
127.0.0.1:6379[3]> lindex name 0
“zhaoliu”
LLEN key
返回存储在 key 里的list的长度。 如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。
127.0.0.1:6379[3]> llen name
(integer) 4
LINSERT key BEFORE|AFTER pivot value
把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。
当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。
当 key 存在,但保存的不是一个list的时候,会返回error。
127.0.0.1:6379[3]> linsert name before zhangsan aa #zhangsan在尾部,它的前面就是lisi后面
(integer) 5
127.0.0.1:6379[3]> lrange name 0 -1
1) "zhaoliu"
2) "wangwu"
3) "lisi"
4) "aa"
5) "zhangsan"
LREM key count value
从存于 key 的列表里移除前 count 次出现的值为 value 的元素。
127.0.0.1:6379[3]> lrange hiarr 0 -1
1) "hello"
2) "hi"
3) "hello"
4) "hi"
5) "hello"
6) "hello"
127.0.0.1:6379[3]> lrem hiarr 1 hi
(integer) 1
127.0.0.1:6379[3]> lrange hiarr 0 -1
1) "hello"
2) "hello"
3) "hi"
4) "hello"
5) "hello"
127.0.0.1:6379[3]> lrem hiarr -2 hello
(integer) 2
127.0.0.1:6379[3]> lrange hiarr 0 -1
1) "hello"
2) "hello"
3) "hi"
127.0.0.1:6379[3]> lrem hiarr 0 hello
(integer) 2
127.0.0.1:6379[3]> lrange hiarr 0 -1
1) "hi"
LTRIM key start stop
修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素,取子list,原list会改变。
127.0.0.1:6379[3]> lrange name 0 -1
1) "zhaoliu"
2) "wangwu"
3) "lisi"
4) "aa"
5) "zhangsan"
127.0.0.1:6379[3]> ltrim name 1 -1 # zhaoliu为0,因此不在范围内
OK
127.0.0.1:6379[3]> lrange name 0 -1
1) "wangwu"
2) "lisi"
3) "aa"
4) "zhangsan"
LSET key index value
设置 index 位置的list元素的值为 value。
127.0.0.1:6379[3]> lrange numarr 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379[3]> lset numarr 0 four
OK
127.0.0.1:6379[3]> lset numarr -2 five
OK
127.0.0.1:6379[3]> lrange numarr 0 -1
1) "four"
2) "five"
3) "three"
RPOPLPUSH source destination
原子性地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)。
127.0.0.1:6379[3]> lrange arr1 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[3]> lrange arr2 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379[3]> rpoplpush arr1 arr2
"3"
127.0.0.1:6379[3]> lrange arr1 0 -1
1) "1"
2) "2"
127.0.0.1:6379[3]> lrange arr2 0 -1
1) "3"
2) "one"
3) "two"
4) "three"
三、Set(无序集合)
SADD key member [member …]
添加一个或多个指定的member元素到集合的 key中.指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.
127.0.0.1:6379[3]> sadd name zs
(integer) 1
127.0.0.1:6379[3]> sadd name ls ww
(integer) 2
SMEMBERS key
返回key集合所有的元素.
127.0.0.1:6379[3]> smembers name
1) "zs"
2) "ww"
3) "ls"
SISMEMBER key member
返回成员 member 是否是存储的集合 key的成员.
127.0.0.1:6379[3]> SISMEMBER name zs
(integer) 1
127.0.0.1:6379[3]> SISMEMBER name zl
(integer) 0
SCARD key
返回集合存储的key的基数 (集合元素的数量).
127.0.0.1:6379[3]> SCARD name
(integer) 3
SPOP key [count]
从存储在key的集合中移除并返回一个或多个随机元素。
127.0.0.1:6379[3]> spop name 1
1) "ww"
SRANDMEMBER key [count]
仅提供key参数,那么随机返回key集合中的一个元素.(不移除,只返回)
127.0.0.1:6379[3]> SRANDMEMBER name 1
1) "ls"
127.0.0.1:6379[3]> SRANDMEMBER name 1
1) "zs"
SREM key member [member …]
在key集合中移除指定的元素. 如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.
如果key的类型不是一个集合,则返回错误.
127.0.0.1:6379[3]> SMEMBERS name
1) "zs"
2) "ls"
127.0.0.1:6379[3]> srem name zs
(integer) 1
127.0.0.1:6379[3]> SMEMBERS name
1) "ls"
SMOVE source destination member
将member从source集合移动到destination集合中. 对于其他的客户端,在特定的时间元素将会作为source或者destination集合的成员出现.
127.0.0.1:6379[3]> smove name name2 ls
(integer) 1
127.0.0.1:6379[3]> smembers name2
1) "ls"
SDIFF key [key …] 差集
SINTER key [key …]交集
SUNIONkey [key …]并集
127.0.0.1:6379[3]> sadd name1 1 2 3
(integer) 3
127.0.0.1:6379[3]> sadd name2 2
(integer) 1
127.0.0.1:6379[3]> sdiff name1 name2
1) "1"
2) "3"
127.0.0.1:6379[3]> sinter name1 name2
1) "2"
127.0.0.1:6379[3]> sunion name1 name2
1) "1"
2) "2"
3) "3"
四、sorted set(有序集合)
ZADD key [NX|XX] [CH] [INCR] score member [score member …]
将所有指定成员添加到键为key有序集合(sorted set)里面
ZRANGE key start stop [WITHSCORES]
返回存储在有序集合key中的指定范围的元素。
127.0.0.1:6379[3]> zadd name 1 zs
(integer) 1
127.0.0.1:6379[3]> zadd name 2 zs2
(integer) 1
127.0.0.1:6379[3]> zadd name 3 zs3
(integer) 1
127.0.0.1:6379[3]> zrange name 0 -1
1) "zs"
2) "zs2"
3) "zs3"
ZRANK key member
返回有序集key中成员member的排名
127.0.0.1:6379[3]> zrank name zs
(integer) 0
127.0.0.1:6379[3]> zrank name zs2
(integer) 1
ZREVRANGE key start stop
返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从大到小)来排列。
127.0.0.1:6379[3]> zrevrange name 0 -1
1) "zs3"
2) "zs2"
3) "zs"
ZSCORE key member
返回有序集key中,成员member的score值。
127.0.0.1:6379[3]> zscore name zs
"1"
127.0.0.1:6379[3]> zscore name zs2
"2"
ZCARD key
返回key的有序集元素个数。
127.0.0.1:6379[3]> zcard name
(integer) 3
ZCOUNT key min max
返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员
127.0.0.1:6379[3]> zcount name 2 3
(integer) 2
五、Hash
hash和String的语法类似,此处就少记录一些。
HSET key field value
设置 key 指定的哈希集中指定字段的值。
如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。
如果字段在哈希集中存在,它将被重写。
HGET key field
返回 key 指定的哈希集中该字段所关联的值
127.0.0.1:6379[3]> hset stu name zs age 18 weight 60
(integer) 3
127.0.0.1:6379[3]> hget stu name
"zs"
ZCOUNT
ZCOUNT
三种特殊数据类型
一、Geo(地理位置)
127.0.0.1:6379> geoadd city 116.408 39.904 beijing # 新增地理位置(经度、纬度、名称)到key中
(integer) 1
127.0.0.1:6379> geoadd city 121.445 31.213 shanghai
(integer) 1
127.0.0.1:6379> geoadd city 117.246 39.117 tianjin
(integer) 1
127.0.0.1:6379> geoadd city 104.071 30.67 chengdu
(integer) 1
127.0.0.1:6379> GEODIST city beijing chengdu km # 查询两个成员的直线距离
"1516.9099"
127.0.0.1:6379> GEORADIUS city 116.408 39.904 500 km # 查询给定位置指定半径内的城市
1) "tianjin"
2) "beijing"
127.0.0.1:6379> GEORADIUSBYMEMBER city beijing 500 km withdist # 查询给定城市指定半径内的程时及直线距离
1) 1) "tianjin"
2) "113.2837"
2) 1) "beijing"
2) "0.0000"
127.0.0.1:6379> geopos city beijing shanghai # 查询key中指定城市的经纬度
1) 1) "116.40800267457962036"
2) "39.90399988166036138"
2) 1) "121.44499808549880981"
2) "31.213001199663303"
127.0.0.1:6379> geohash city beijing shanghai # 查询key中指定城市的11位hash值
1) "wx4g0bm9xh0"
2) "wtw3ed1sct0"
二、HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。
缺点:pfcount 存在0.81%的误差
127.0.0.1:6379> pfadd name zs ls # 新增HyperLogLog结构的key与值
(integer) 1
127.0.0.1:6379> pfadd name zs ww
(integer) 1
127.0.0.1:6379> pfadd name ww zl
(integer) 1
127.0.0.1:6379> pfcount name # 统计key中的参数数量
(integer) 4
127.0.0.1:6379> pfadd city beijing shanghai chengdu
(integer) 1
127.0.0.1:6379> pfcount name city # 统计name和city中一共的数量
(integer) 7
127.0.0.1:6379> pfmerge coll name city # 合并name和city到coll中,coll不存在则先创建
OK
127.0.0.1:6379> pfcount coll
(integer) 7
三、Bitmap(位)
如是否、正确/不正确、打卡/未打卡等非黑即白的场景可使用。
127.0.0.1:6379> setbit sure 1 1
(integer) 0
127.0.0.1:6379> setbit sure 2 0
(integer) 0
127.0.0.1:6379> getbit sure 1
(integer) 1
127.0.0.1:6379> getbit sure 2
(integer) 0
其他
上面的类型并没有涵盖redis所有的命令类型。如官网的介绍
可见还有很多没有讲到,这部分的,大家在使用的时候就查一查官方字典,其实,上面说到的一些命令都掌握了,很多场景就够了,不够的查查字典也能搞定。
那这一篇就说到这里吧~