数据库redis是一个开源的kv数据库,与传统数据库不同的是,它的数据存在内存中,因而速度非常之快,ops可达10w+,常用于缓存等领域。基本上每一个应用都会使用redis,redis与mysql数据库等一样已经成为了服务端开发中不可或缺的组件。由于内存是非常昂贵的资源,ops要求低的资源不应放在redis中,应该存储到硬盘中,在实际应用中应该有针对性的对部分热点数据进行缓存。本文以下说明针对的是redis4.x版本。

redis命令

以下只列了常用的命令,全部命令请查看redis命令列表

string

string是redis中的基础数据类型,也是其他值的元素的基础类型,string不仅可以存储字符串,也可以存储数字和二进制等。

set

set key value,设置key的值为value,设置成功后返回OK

  1. redis> set a "a"
  2. OK
  3. redis> get a
  4. "a"

set key value nx,设置key的值为value,当key不存在时,与setnx命令相同,setnx命令后续可能被废弃

  1. redis> set anx "a" nx
  2. OK # key不存在,设置成功
  3. redis> set anx "b" nx
  4. (nil) # key已经存在,设置失败
  5. redis> get axn
  6. "a" # 维持原值

set key value xx,设置key的值为value,当key存在时

  1. redis> set axx "a" xx
  2. (nil) # key不存在,设置失败
  3. redis> set axx "a"
  4. OK
  5. redis> set axx "b" xx
  6. OK # key存在,设置成功
  7. redis> get axx
  8. "b"

set key value ex seconds,设置key的值为value,设置过期时间为seconds秒,过期时间到自动删除key,命令与setex相同,setex后续可能被废弃

  1. redis> set aex "a" ex 5
  2. OK
  3. redis> get aex
  4. "a" # 未过期,返回值
  5. redis> get aex
  6. (nil) # 5秒后执行,已被删除

set key value milliseconds,设置key的值为value,设置过期时间为milliseconds毫秒,过期时间到自动删除key

  1. redis> set apx "a" px 5000
  2. OK
  3. redis> get apx
  4. "a" # 未过期,返回值
  5. redis> get aex
  6. (nil) # 5000毫秒后执行,已被删除

get

get key,返回key的值,字符串格式,如果不存在key,返回(nil)

  1. redis> set a "a"
  2. redis> get a
  3. "a"
  4. redis> get a1
  5. (nil)

setnx

setnx key value,设置key的值为value,当key不存在时

  1. redis> setnx anx "a"
  2. OK # 设置成功
  3. redis> setnx anx "b"
  4. (nil) # key存在,设置失败
  5. redis> get anx
  6. "a" # 返回旧值

setex

setex key value seconds,设置key的值为value,设置过期时间为seconds秒,过期时间到自动删除key

  1. redis> setex aex "a" 5000
  2. OK
  3. redis> get aex
  4. "a" # 未过期,返回值
  5. redis> get aex
  6. (nil) # 5秒后执行,已被删除

mset

mset key value [key value…],设置多个key的值

  1. redis> mset a "a" b "b" c "c"
  2. OK
  3. redis> get a
  4. "a"
  5. redis> get b
  6. "b"
  7. redis> get c
  8. "c"

mget

mget key [key…],获取多个key的值

  1. redis> mset a "a" b "b" c "c"
  2. redis> mget a b c
  3. 1) "a"
  4. 2) "b"
  5. 3) "c"

hash

hash为键值类型,而且其中的键是不能重复的,值是字符串或者数字。

hset

hset hash field value,设置hash的field值,如果不存在hash则自动创建

  1. redis> hset h f1 "a"
  2. (integer) 1 # field f1不存在,设置成功返回1
  3. redis> hset h f1 "b"
  4. (integer) 0 # field f1存在,设置成功返回0

hget

hget hash field,获取hash的field值,如果不存在hash或者field则返回nil

  1. redis> hset h f1 "a"
  2. (integer) 1
  3. redis> hget h f1
  4. "a"
  5. redis> hget h1
  6. (nil) # hash不存在
  7. redis> hget h ff
  8. (nil) # field不存在

hexists

hexists hash field,判断hash的field存不存在,如果存在返回1,不存在返回0

  1. redis> hexists he f
  2. (integer) 0 # hash不存在,返回0
  3. redis> hset he f "a"
  4. (integer) 1
  5. redis> hexists he f
  6. (integer) 1 # hash的field存在,返回1
  7. redis> hexists he f1
  8. (integer) 0 # hash的field不存在,返回0

hdel

hdel hash field [field…],删除hash的field,可以是一个或者多个,如果不存在的field则忽略

  1. redis> hset h f "a"
  2. (integer 1)
  3. redis> hdel h f
  4. (integer 1) # 删除成功,返回删除field的数量

hlen

hlen hash,返回hash的field数量,不存在的hash返回0

  1. redis> hset hl f1 "a"
  2. (integer 1)
  3. redis> hset h1 f2 "b"
  4. (integer 1)
  5. redis> hlen h1
  6. (integer 2)

hincrby

hincrby hash field increment,给hash的field加上增量increment,increment也可以为负数,如果值不存在则初始化为0后再进行操作

  1. redis> hset hi f 1
  2. (integer 1)
  3. redis> hincrby hi f 2
  4. (integer 3) # 返回1+2结果3
  5. redis> hset hi f1 "a"
  6. (integer 1)
  7. redis> hincrby hi f1 1
  8. (error) ERR hash value is not an integer # 不是整型,抛出异常

hkeys

hkeys hash,返回hash全部的field

  1. redis> hmset hm f1 "a" f2 "b" f3 "c"
  2. OK
  3. redis> hkeys hm
  4. 1) "f1"
  5. 2) "f2"
  6. 3) "f3"

hvals

hvals hash,返回hash全部的值

  1. redis> hmset hm f1 "a" f2 "b" f3 "c"
  2. OK
  3. redis> hvals hm
  4. 1) "a"
  5. 2) "b"
  6. 3) "c"

list

list类型与数组类似,存储多个元素,其中元素可以是相同的值。redis的list命令有左操作和右操作,左操作是从表头开始,右操作是从表尾部开始

lpush

lpush key value [value…],插入一个或者多个值到list的表头,返回list的长度

  1. reids> lpush lp "a" "b" "c"
  2. (integer) 3 # 列表值为["c", "b", "a"]

lpop

lpop key,移除并返回list表头元素

  1. redis> lpush lp1 "a" "b" "c"
  2. (integer) 3 # 列表值为["c", "b", "a"]
  3. redis> lpop lp1
  4. "c"
  5. redis> lpop lp1
  6. "b"
  7. redis> lpop lp1
  8. "a"
  9. redis> lpop lp1
  10. (nil) # 没有元素,返回nil

rpush

rpush key value [value…],插入元素到表尾

  1. redis> rpush rp "a" "b" "c"
  2. (integer) 3 # 列表值为["a", "b", "c"]

rpop

rpop key,移除并返回表尾元素

  1. redis> rpush rp1 "a" "b" "c"
  2. (integer) 3 # 列表值为["a", "b", "c"]
  3. redis> rpop rp1
  4. "c"
  5. redis> rpop rp1
  6. "b"
  7. redis> rpop rp1
  8. "a"
  9. redis> rpop rp1
  10. (nil) # 没有元素,返回nil

llen

llen key,返回list的元素个数

  1. redis> lpush ll "a" "b"
  2. (integer) 2
  3. redis> llen ll
  4. (integer) 2
  5. redis> llen ll1
  6. (integer) 0 # 不存在返回0

lset

lset key index value,设置list下标index的值

  1. redis> rpush ls "a" "b" "c"
  2. (integer 3) # 列表值为["a", "b", "c"]
  3. redis> lset ls 1 "1"
  4. OK # 设置成功
  5. redis> lrange ls 0 -1
  6. 1) "a"
  7. 2) "1" # 设置成了"1"
  8. 3) "c"

lrange

lrange key start stop,获取list指定区间的全部元素,stop也可以是负数,如-1表示倒数第一个元素,-2表示倒数第二个元素,lrange key 0 -1获取全部元素

  1. redis> rpush lr "a" "b" "c"
  2. (integer) 3
  3. redis> lrange lr 0 -1
  4. 1) "a"
  5. 2) "b"
  6. 3) "c"
  7. redis> lrange lr 0 1
  8. 1) "a"
  9. 2) "b"

set

set与list类似,但是其只存储值不同的元素,即一个set中没有两个相同的元素

sadd

sadd key value [member…],添加一个或多个元素到set中

  1. redis> sadd s "a" "b" "c"
  2. (integer) 3 # 返回添加的元素数量
  3. redis> sadd s "a"
  4. (integer) 0 # 添加失败,已经有"a"在set中

sismember

sismember key member,判断是不是set的元素,是则返回1,否则返回0

  1. redis> sadd sis "a" "b" "c"
  2. (integer) 3
  3. redis> sismember sis "a"
  4. (integer) 1 # "a"存在sis中
  5. redis> sismember sis "d"
  6. (integer) 0 # "d"不存在sis中

smembers

smembers key,获取set全部元素

  1. redis> sadd sm "a" "b" "c"
  2. (integer) 3
  3. redis> smembers sm
  4. 1) "c"
  5. 2) "b"
  6. 3) "a"

spop

spop key,随机移除一个原生并返回

  1. redis> sadd sp "a" "b" "c"
  2. (integer) 3
  3. redis> spop sp
  4. "a"
  5. redis> spop sp
  6. "c"
  7. redis> spop sp
  8. "b"
  9. redis> spop sp
  10. (nil) # 没有元素,返回nil

scard

scard key,返回set元素个数

  1. redis> sadd sc "a" "b" "c"
  2. (integer) 3
  3. reids> scard sc
  4. (integer) 3

sorted set

sorted set是有序集合,与set类似也不可以存在相同的元素,有序集合通过分数对集合进行排序,分数可以有相同的

zadd

zadd key score member [score member…],添加一个或者多个元素以及它们的分数到集合中

  1. redis> zadd z 1 "a" 2 "b" 3 "c"
  2. (integer) 3 # 添加的元素个数

zscore

zscore key member,返回元素的分数

  1. redis> zadd zm 1 "a" 2 "b" 3 "c"
  2. (integer) 3
  3. redis> zscord zm "b"
  4. "2" # 返回"b"的分数

zcount

zcount key min max,返回分数在[min, max]区间的元素个数

  1. redis> zadd zc 1 "a" 2 "b" 3 "c"
  2. (integer) 3
  3. redis> zcount zc 1 3
  4. (integer) 3
  5. redis> zcount zc 1 2
  6. (integer) 2

zrange

zrange key start stop,返回下标在start到stop的元素集合,stop可以为负数,-1代表倒数第一个,-2代表倒数第二个

  1. redis> zadd zr 1 "a" 2 "b" 3 "c"
  2. (integer) 3
  3. redis > zrange zr 0 -1 # 返回全部
  4. 1) "a"
  5. 2) "b"
  6. 3) "c"
  7. redis> zrange zr 0 1
  8. 1) "a"
  9. 2) "b"

zrank

zrank key member,返回元素在集合中的排名,按分数从低到高排序,从0开始

  1. redis> zadd zrk 1 "a" 2 "b" 3 "c"
  2. (integer) 3
  3. redis> zrank zrk "a"
  4. (integer) 0
  5. redis> zrank zrk "b"
  6. (integer) 1

zrem

zrem key member [member…],移除一个或多个成员,不存在的忽略

  1. redis> zadd zrm 1 "a" 2 "b" 3 "c"
  2. (integer) 3
  3. redis> zrem zrm "a"
  4. (integer) 1 # 移除成功
  5. redis> zrem zrm "d"
  6. (integer) 0 # 移除失败

zincrby

zincrby key increment member,修改member的分数,不存在的member将分数设为increment

  1. redis> zadd zi 1 "a"
  2. (integer) 1
  3. redis> zadd zi 1 "a"
  4. "2" # a + 1 = 2
  5. redis> zadd zi 10 "b"
  6. "10" # 初始化为10

database

del

del key [key…],删除一个或多个key,如不存在则忽略

  1. redis> mset a "a" b "b" c "c"
  2. OK
  3. redis> del a
  4. (integer) 1 # 删除成功
  5. redis> del a b c
  6. (integer) 2 # 删除了2个

select

select index,选择db,redis一共有16个db,默认为db0

  1. redis> select 1
  2. OK # 切换到db1