前言
Redis是一款基于键值对的数据结构存储系统,它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等
本篇文章作为深入浅出Redis(一):对象与数据结构的基础篇,将深入浅出的介绍Redis中常用命令,如果想了解底层实现可以去观看那篇文章
Redis中的命令分为两种,一种则是所有对象通用的,另一种是专门为对象使用的
本篇文章将先简单说明通用命令,再说明五大对象(string、hash、list、set、zset)专用命令
通用命令
keys *查看所有keysort key对key进行排序,key只能是list、set、zset对象
exists key查看这个key是否存在,存在为1,不存在为0127.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) 0move key db把这个key移动到编号为几的数据库,成功为1,失败为0127.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 key127.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) 12incr key让key自增1decr key让key自减1127.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) 18incrby 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) 8getrange 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再set127.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重命名key127.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...删除一个或多个Key127.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) 3hexists key field判断该hash中是否存在field该字段,在返回1,不在返回0127.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) 0hkeys 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) -10hsetnx 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) 4lrem 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超出范围返回error127.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) 3srandmember 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
最后(一键三连求求拉~)
本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~
有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~
关注菜菜,分享更多干货,公众号:菜菜的后端私房菜
本文由博客一文多发平台 OpenWrite 发布!



















