这篇文章详细介绍redis中不同数据类型的命令及其用法,通用的命令将归纳到string类型中。
注意:文章中涉及的下标index、start、end等都是是从0开始的。
学习redis,建议安装redis和redis的可视化工具Another Redis Desktop Manager,使用起来非常简单。
一、string类型命令
get
用法:get key
功能:获取key的值
示例:获取redis中key为name的值
get name
mget
用法:mget key1 key2 ...
功能:获取多个key的值
示例:获取redis中key分别为name、age、phone的值
mget name age phone
set
用法:set key value
功能:设置key的值
示例:设置name的值
set name heyunlin
mset
用法:mset key1 vaue1 key2 value2 ...
功能:设置多个key的值
示例:设置name、age的值
mset name tom age 18
setnx
用法:setnx key value
功能:和set命令的用法一样,只有当key不存在时才设置,SETNX表示的是"SET if Not eXists"
msetnx
用法:msetnx key1 value1 key2 value2 ... ...
功能:和mset命令的用法一样,只有当key不存在时才设置,一次设置多个key的值
setex
用法:setex key seconds value
功能:作用相当于set+expire命名,设置key的值的同时设置过期时间
getset
用法:getset key vaue
功能:设置并获取key的值
del
用法:del key...
功能:删除key,del命令后面可以跟1个或多个key
示例:删除多个key(name、age和gender)
del name age gender
keys
用法:keys pattern
功能:根据正则查找key
keys *:返回所有key
keys a*:返回字母a开头的key
randomkey
用法:randomkey
功能:返回当前数据库中随机的一个key(默认DB0,可以通过select命令切换数据库)
rename
用法:rename key newKey
功能:对key重命名
示例:重命名gender为sex
rename gender sex
renamenx
用法:rename key newKey
功能:对key重命名,只有当newKey不存在时,如果newKey已经存在,则不会做任何操作
expire
用法:expire key seconds
功能:设置key的过期时间,单位:秒(设置相对时间)
示例:设置gender过期时间为1分钟
set gender 0
expire gender 60
expireat
用法:expireat key timestamp
功能:设置key的过期时间,timestamp表示一个unix时间戳。
java中获取当前时间的时间戳的方法
/**
* @author heyunlin
* @version 1.0
*/
public class SystemExample {
public static void main(String[] args) {
long timestamp = System.currentTimeMillis();
System.out.println(timestamp);
}
}
示例:设置name的有效时间为7天,也就是60*60*24*7=604800秒,通过以上的代码获取当前的时间戳,然后加上604800(假设获取到当前的时间为:1689433078591)
set name heyunlin
expireat name 1689433078711
persist
用法:persist key
功能:删除key的过期时间,使其永不过期。
示例:设置name的有效时间为120秒,然后删除其过期时间
set name heyunlin
expire name 120
persist name
ttl name # 结果:-1,永不过期
ttl
用法:ttl key
功能:获取key的有效时间,单位:秒
如果key没有设置过期时间,返回-1;
如果key已过期或不存在,返回-2;
设置了key的过期时间,且key没有过期,返回过期时间,单位/秒;
示例:设置并获取gender的过期时间
set gender 0
expire gender 60
ttl gender # 60或者59,根据个人的手速获取的值不一样
incr
用法:incr key
功能:key的值自增1
示例:对年龄自增1
set age 17
incr age
get age # 结果:18
increby
用法:increby key increment
功能:key的值自增指定的值
示例:对年龄增加2
set age 16
incrby age 2
get age # 结果:18
incrbyfloat
用法:incrbyfloat key floatIncrement
功能:key的值自增指定小数,用法和increby类似
decr
用法:decr key
功能:key的值自减1,用法和incr类似
decrby
用法:decrby key decrement
功能:key的值自减指定的值,用法和incrby类似
type
用法:type key
功能:获取key的类型,可能的返回值有none、string、list、hash,当key不存在时返回none
exists
用法:exists key...
功能:判断key是否存在,exist命令后面可以跟1个或多个key
strlen
用法:strlen key
功能:获取key的值的长度
示例:获取名字的长度
set name heyunlin
strlen name # 结果:8
echo
用法:echo message
功能:输出信息
substr
用法:substr key start end
功能:截取指定key从下标start到end的值
示例:截取名字的前4个字母
set name heyunlin
substr name 0 3 # 结果:heyu
append
用法:append key value
功能:往指定key的值后面追加值
示例:hello后面追加world
set message hello
append message world # 往message的值后面追加字符串world
get message # 结果:helloworld
move
用法:move key dbIndex
功能:移动key到指定的数据库,dbIndex的范围为[0, 15]
示例:移动name到db1
set name heyunlin
move name 1
select
用法:select dbIndex
功能:切换到第dbIndex+1个数据库
示例:切换到DB9
select 9
flushdb
用法:flushdb index
功能:清空当前数据库的数据
redis默认下标为0-15个数据库,默认为0,flushdb会删除当前为0的数据库
flushall
用法:flushall
功能:删除所有数据库(DB0~DB15)。
二、list类型命令
lpush
用法:lpush key value...
功能:在链表到的左边插值
rpush
用法:rpush key value...
功能:在链表的右边插值
lpop
用法:lpop key
功能:从链表的左边取值
rpop
用法:rpop key
功能:在链表的右边取值
rpoplpush
用法:rpoplpush srckey deskey
功能:从srckey的右边取出一个值,放到deskey中
llen
用法:llen key
功能:获取链表总长度
lrange
用法:lrange key start end
功能:获取链表指定范围的值
ltrim
用法:ltrim key start end
功能:删除[start, end]以外的值
示例:现在我们有一个list
现在只需要保留最后面4个a,其他全删除。
因为index从0开始,第一个a的index为5,同理最后一个a的index为8
ltrim 5 8
执行以上命令之后,list只剩下了4个a
lset
用法:lset key index value
功能:设置链表指定位置的值
lindex
用法:lindex key index
功能:获取链表指定位置的值
lrem
用法:lrem key count value
功能:从链表中删除count个值为value的元素
三、hash类型命令
hash类型用来保存对象,只能把对象分为多个字段保存,假设有一个User类
public class User {
String name = "Tom";
Integer age = Integer.MAX_VALUE;
Integer gender = 0;
}
hset
用法:hset key field value
功能:设置key指定字段的值
示例:使用hset保存user对象的全部字段值
hset user name Tom
hset user age 2147483647
hset user gender 0
hmset
用法:hmset key1 field1 key2 field2 ... ...
功能:批量设置key的字段值;
示例:批量设置用户信息
hmset user name Tom age 2147483647 gender 0
hsetnx
用法:hsetnx key field value
功能:设置key指定字段的值当且仅当字段field不存在
hget
用法:hget key field
功能:获取key指定字段的值
示例:获取用户名
hget user name
hmget
用法:hmget key field...
功能:批量获取key的字段值
示例:批量获取用户信息
hmget user name age gender
hincrby
用法:hincrby key field
功能:让key的字段值自增1
示例:设置年龄+1
hset user age 17
hincrby user age # 结果:18
hincrbyfloat
用法:hincrbyfloat key field
功能:让key的字段值自增指定小数
hexists
用法:hexists key field
功能:判断key的字段是否存在;
示例:判断用户的名字字段是否存在
hexists user name
hdel
用法:hdel key field...
功能:删除key的字段,可以一次删除多个字段
示例:删除用户的名字字段
hdel user name gender
hlen
用法:hlen key
功能:获取key的总字段数
示例:删除用户的字段数
hmset user name Tom age 2147483647 gender 0
hlen user # 结果:3
hkeys
用法:hkeys key
功能:获取key的所有字段
hvals
用法:hvals key
功能:获取key所有字段的值
hgetall
用法:hgetall key
功能:获取key所有字段和值
四、set类型命令
sadd
用法:sadd key member...
功能:往集合里添加多个元素,可以一次添加多个
smembers
用法:smembers key
功能:获取集合所有的元素
srem
用法:srem key member...
功能:从集合中删除指定的元素,可以一次删除多个
spop
用法:spop key
功能:从集合中删除一个元素(随机删除,因为集合无序)
smove
用法:smove srcKey desKey member
功能:把集合srcKey的member元素移动到目标集合desKey
scard
用法:scard key
功能:获取集合中元素的个数
sismember
用法: sismember key member
功能:判断member在不在集合key中
以下命令用于对集合取交集、并集、差集。
注意:
- 使用xxxstore命令时,如果目标集合已经存在,则不会保存;
- 如果目标集合不存在,则新建集合,并保存数据。
sinter
用法: sinter key...
功能:获取多个集合的交集
sinterstore
用法: sinterstore destKey key...
功能:获取多个集合的交集,并保存到目标集合destKey中,如果目标集合已经存在,则不会保存;
sunion
用法: sunion key...
功能:获取多个集合的并集
sunionstore
用法: sunionstore destKey key...
功能:获取多个元素的并集,并保存到目标集合destKey中,如果目标集合已经存在,则不会保存;
sdiff
用法: sdiff key...
功能:获取多个集合的差集
sdiffstore
用法: sdiffstore destKey key...
功能:获取多个元素的差集,并保存到目标集合destKey中,如果目标集合已经存在,则不会保存;
srandmember
用法: srandmember key [count]
功能:随机获取集合中的1个[或count个]元素
五、sorted set类型命令
zadd
用法:zadd score key...
功能:添加多条数据到有序集合中
示例:往集合userlist里添加3条数据,分别指定分数为1、2、3
zadd userlist 1 tom 2 marry 3 lisa
zrem
用法:zrem key member...
功能:删除集合中指定的一个或多个元素
示例:删除了userlist中的tom和marry,然后userlist中只剩下lisa了
zadd userlist 1 tom 2 marry 3 lisa
zrem userlist tom marry
zrank
用法:zrank key member
功能:获取集合指定元素的升序排行,从0开始
示例:获取排名
zadd userlist 1 tom 2 marry 3 lisa 4 john
zrank userlist john // 3
zrank userlist marry // 1
zincrby
用法:zincrby key score member
功能:给集合中的元素member增加指定的分数,如果集合不存在,会创建该集合并设置分数为指定的score;
示例:在集合userlist中创建了一个分数为4的john
zincrby userlist 4 john
zrank
用法:zrank key member
功能:获取集合指定元素的升序排行,从0开始
示例:获取排名
zadd userlist 1 tom 2 marry 3 lisa 4 john
zrank userlist john // 3
zrank userlist marry // 1
zrevrank
用法:zrevrank key member:
功能:获取集合指定元素的降序排行;(这里是按照分数降序排序)
示例:获取倒数的排名
zadd userlist 1 tom 2 marry 3 lisa 4 john
zrank userlist john // 0
zrank userlist marry // 2
zrange
用法:zrange key start end [withscores]
功能:获取集合中指定范围的元素,如果加上withscores,则也会显示分数
示例:获取userlist中前两个元素tom、marry
zadd userlist 1 tom 2 marry 3 lisa
zrange userlist 0 1
zrevrange
用法:zrevrange key start end [withscores]
功能:获取集合中指定范围的元素(从最后一个元素开始),如果加上withscores,则也会显示分数;(这里是按照分数降序排序)
示例:获取userlist中最后两个元素lisa、marry
zadd userlist 1 tom 2 marry 3 lisa
zrevrange userlist 0 1 withscores
zrangebyscore
用法:zrangebyscore key min max [withscores] [limit offset count]
功能:获取集合中指定范围的元素(从最后一个元素开始),如果加上withscores,则也会显示分数;
示例:获取userlist中分数为1~4的元素,并限制返回的数据
zadd userlist 1 tom 2 marry 3 lisa 4 john
# 获取集合userlist中分数1~4的全部元素:1 tom 2 marry 3 lisa 4 john
zrangebyscore userlist 1 4 withscores
# 获取集合userlist中分数1~4的前三个元素:1 tom 2 marry 3 lisa
zrangebyscore userlist 1 4 withscores limit 0 3
# 获取集合userlist中分数1~4的后两个元素:3 lisa 4 john
zrangebyscore userlist 1 4 withscores limit 2 2
zrevrangebyscore
用法:zrevrangebyscore key min max [withscores] [limit offset count]
功能:获取集合中指定范围的元素,如果加上withscores,则也会显示分数;(这里是按照分数降序排序)
zcard
用法:zcard key
功能:获取集合中元素个数
示例:在集合userlist中元素个数,结果为3
zadd userlist 1 tom 2 marry 3 lisa
zcard userlist
zscore
用法:zscore key member
功能:获取元素的分数
示例:获取tom的分数
zadd userlist 1 tom 2 marry 3 lisa 4 john
zscore userlist tom // 1
zsort
用法:zsort key
功能:
zwatch
用法:zwatch key
功能:
zcount
用法:zcount key min max
功能:获取集合中分数在指定范围内的元素个数
示例:获取分数在1~2、1~3、1~4的元素个数
zadd userlist 1 tom 2 marry 3 lisa 4 john
zcount userlist 1 2 // 2
zcount userlist 1 3 // 3
zcount userlist 1 4 // 4
六、bitmap类型命令
getbit
用法:getbit key offset
功能:获取key在指定偏移量的值
setbit
用法:setbit key offset value
功能:设置key在指定偏移量的值
bitcount
用法:bitcount key [start end]
功能:获取key[指定下标范围]中值为1的个数
setrange
用法:setrange key offset value
功能:和setbit命令作用一样,但是用的是16进制表示
getrange
用法:getrange key start end
功能:获取指定范围的值
示例:获取一个bitmap前4位的值
特别说明:16进制用0-9、a~f表示,a~f分别表示10~15
bitmap前四位的二进制为11010000,1101转为16进制为8+4+1=13,也就是字母d,所以这里结果为\xd0(\x表示是16进制)。
setbit bitmap 0 1
setbit bitmap 1 1
setbit bitmap 2 0
setbit bitmap 3 1
setbit bitmap 4 0
setbit bitmap 5 0
setbit bitmap 6 0
setbit bitmap 7 0
getrange bitmap 0 3 # 结果:\xd0
bitop
bitop operation destKey key...
对多个key进行位运算,与/或/非/异或。operation的可选值有:AND、OR、XOR、NOT
示例:我们创建两个位图sign:20230707和sign:20230708。
设置sign:20230707为11111000
setbit sign:20230707 0 1
setbit sign:20230707 1 1
setbit sign:20230707 2 1
setbit sign:20230707 3 1
setbit sign:20230707 4 1
设置sign:20230708为00000111
setbit sign:20230708 5 1
setbit sign:20230708 6 1
setbit sign:20230708 7 1
然后对两个bitmap进行位运算。为了区分结果的名字,我们使用operation + ResultMap作为目标key。
与运算
bitop and andResultMap sign:20230707 sign:20230708
或运算:
bitop or orResultMap sign:20230707 sign:20230708
非运算:非运算(取反运算)是单目操作符,所以只能对一个key操作。
bitop not notResultMap sign:20230707
异或运算:
bitop xor xorResultMap sign:20230707 sign:20230708
可以大胆地对几个结果key进行猜测,学习过java位运算的都知道,上面几个key的值应该为:
andResultMap:00000000
orResultMap:11111111
notResultMap:00000111
xorResultMap:11111111
我们复制上面创建bitmap的命令执行一遍,执行完之后
sign:20230707
sign:20230708
接下来执行四个位运算的命令。最后得到的结果的结果:
andResultMap:00000000
orResultMap:11111111
notResultMap:00000111
xorResultMap:11111111