数据库redis是一个开源的kv数据库,与传统数据库不同的是,它的数据存在内存中,因而速度非常之快,ops可达10w+,常用于缓存等领域。基本上每一个应用都会使用redis,redis与mysql数据库等一样已经成为了服务端开发中不可或缺的组件。由于内存是非常昂贵的资源,ops要求低的资源不应放在redis中,应该存储到硬盘中,在实际应用中应该有针对性的对部分热点数据进行缓存。本文以下说明针对的是redis4.x版本。
redis命令
以下只列了常用的命令,全部命令请查看redis命令列表。
string
string是redis中的基础数据类型,也是其他值的元素的基础类型,string不仅可以存储字符串,也可以存储数字和二进制等。
set
set key value,设置key的值为value,设置成功后返回OK
redis> set a "a"
OK
redis> get a
"a"
set key value nx,设置key的值为value,当key不存在时,与setnx命令相同,setnx命令后续可能被废弃
redis> set anx "a" nx
OK # key不存在,设置成功
redis> set anx "b" nx
(nil) # key已经存在,设置失败
redis> get axn
"a" # 维持原值
set key value xx,设置key的值为value,当key存在时
redis> set axx "a" xx
(nil) # key不存在,设置失败
redis> set axx "a"
OK
redis> set axx "b" xx
OK # key存在,设置成功
redis> get axx
"b"
set key value ex seconds,设置key的值为value,设置过期时间为seconds秒,过期时间到自动删除key,命令与setex相同,setex后续可能被废弃
redis> set aex "a" ex 5
OK
redis> get aex
"a" # 未过期,返回值
redis> get aex
(nil) # 5秒后执行,已被删除
set key value milliseconds,设置key的值为value,设置过期时间为milliseconds毫秒,过期时间到自动删除key
redis> set apx "a" px 5000
OK
redis> get apx
"a" # 未过期,返回值
redis> get aex
(nil) # 5000毫秒后执行,已被删除
get
get key,返回key的值,字符串格式,如果不存在key,返回(nil)
redis> set a "a"
redis> get a
"a"
redis> get a1
(nil)
setnx
setnx key value,设置key的值为value,当key不存在时
redis> setnx anx "a"
OK # 设置成功
redis> setnx anx "b"
(nil) # key存在,设置失败
redis> get anx
"a" # 返回旧值
setex
setex key value seconds,设置key的值为value,设置过期时间为seconds秒,过期时间到自动删除key
redis> setex aex "a" 5000
OK
redis> get aex
"a" # 未过期,返回值
redis> get aex
(nil) # 5秒后执行,已被删除
mset
mset key value [key value…],设置多个key的值
redis> mset a "a" b "b" c "c"
OK
redis> get a
"a"
redis> get b
"b"
redis> get c
"c"
mget
mget key [key…],获取多个key的值
redis> mset a "a" b "b" c "c"
redis> mget a b c
1) "a"
2) "b"
3) "c"
hash
hash为键值类型,而且其中的键是不能重复的,值是字符串或者数字。
hset
hset hash field value,设置hash的field值,如果不存在hash则自动创建
redis> hset h f1 "a"
(integer) 1 # field f1不存在,设置成功返回1
redis> hset h f1 "b"
(integer) 0 # field f1存在,设置成功返回0
hget
hget hash field,获取hash的field值,如果不存在hash或者field则返回nil
redis> hset h f1 "a"
(integer) 1
redis> hget h f1
"a"
redis> hget h1
(nil) # hash不存在
redis> hget h ff
(nil) # field不存在
hexists
hexists hash field,判断hash的field存不存在,如果存在返回1,不存在返回0
redis> hexists he f
(integer) 0 # hash不存在,返回0
redis> hset he f "a"
(integer) 1
redis> hexists he f
(integer) 1 # hash的field存在,返回1
redis> hexists he f1
(integer) 0 # hash的field不存在,返回0
hdel
hdel hash field [field…],删除hash的field,可以是一个或者多个,如果不存在的field则忽略
redis> hset h f "a"
(integer 1)
redis> hdel h f
(integer 1) # 删除成功,返回删除field的数量
hlen
hlen hash,返回hash的field数量,不存在的hash返回0
redis> hset hl f1 "a"
(integer 1)
redis> hset h1 f2 "b"
(integer 1)
redis> hlen h1
(integer 2)
hincrby
hincrby hash field increment,给hash的field加上增量increment,increment也可以为负数,如果值不存在则初始化为0后再进行操作
redis> hset hi f 1
(integer 1)
redis> hincrby hi f 2
(integer 3) # 返回1+2结果3
redis> hset hi f1 "a"
(integer 1)
redis> hincrby hi f1 1
(error) ERR hash value is not an integer # 不是整型,抛出异常
hkeys
hkeys hash,返回hash全部的field
redis> hmset hm f1 "a" f2 "b" f3 "c"
OK
redis> hkeys hm
1) "f1"
2) "f2"
3) "f3"
hvals
hvals hash,返回hash全部的值
redis> hmset hm f1 "a" f2 "b" f3 "c"
OK
redis> hvals hm
1) "a"
2) "b"
3) "c"
list
list类型与数组类似,存储多个元素,其中元素可以是相同的值。redis的list命令有左操作和右操作,左操作是从表头开始,右操作是从表尾部开始
lpush
lpush key value [value…],插入一个或者多个值到list的表头,返回list的长度
reids> lpush lp "a" "b" "c"
(integer) 3 # 列表值为["c", "b", "a"]
lpop
lpop key,移除并返回list表头元素
redis> lpush lp1 "a" "b" "c"
(integer) 3 # 列表值为["c", "b", "a"]
redis> lpop lp1
"c"
redis> lpop lp1
"b"
redis> lpop lp1
"a"
redis> lpop lp1
(nil) # 没有元素,返回nil
rpush
rpush key value [value…],插入元素到表尾
redis> rpush rp "a" "b" "c"
(integer) 3 # 列表值为["a", "b", "c"]
rpop
rpop key,移除并返回表尾元素
redis> rpush rp1 "a" "b" "c"
(integer) 3 # 列表值为["a", "b", "c"]
redis> rpop rp1
"c"
redis> rpop rp1
"b"
redis> rpop rp1
"a"
redis> rpop rp1
(nil) # 没有元素,返回nil
llen
llen key,返回list的元素个数
redis> lpush ll "a" "b"
(integer) 2
redis> llen ll
(integer) 2
redis> llen ll1
(integer) 0 # 不存在返回0
lset
lset key index value,设置list下标index的值
redis> rpush ls "a" "b" "c"
(integer 3) # 列表值为["a", "b", "c"]
redis> lset ls 1 "1"
OK # 设置成功
redis> lrange ls 0 -1
1) "a"
2) "1" # 设置成了"1"
3) "c"
lrange
lrange key start stop,获取list指定区间的全部元素,stop也可以是负数,如-1表示倒数第一个元素,-2表示倒数第二个元素,lrange key 0 -1获取全部元素
redis> rpush lr "a" "b" "c"
(integer) 3
redis> lrange lr 0 -1
1) "a"
2) "b"
3) "c"
redis> lrange lr 0 1
1) "a"
2) "b"
set
set与list类似,但是其只存储值不同的元素,即一个set中没有两个相同的元素
sadd
sadd key value [member…],添加一个或多个元素到set中
redis> sadd s "a" "b" "c"
(integer) 3 # 返回添加的元素数量
redis> sadd s "a"
(integer) 0 # 添加失败,已经有"a"在set中
sismember
sismember key member,判断是不是set的元素,是则返回1,否则返回0
redis> sadd sis "a" "b" "c"
(integer) 3
redis> sismember sis "a"
(integer) 1 # "a"存在sis中
redis> sismember sis "d"
(integer) 0 # "d"不存在sis中
smembers
smembers key,获取set全部元素
redis> sadd sm "a" "b" "c"
(integer) 3
redis> smembers sm
1) "c"
2) "b"
3) "a"
spop
spop key,随机移除一个原生并返回
redis> sadd sp "a" "b" "c"
(integer) 3
redis> spop sp
"a"
redis> spop sp
"c"
redis> spop sp
"b"
redis> spop sp
(nil) # 没有元素,返回nil
scard
scard key,返回set元素个数
redis> sadd sc "a" "b" "c"
(integer) 3
reids> scard sc
(integer) 3
sorted set
sorted set是有序集合,与set类似也不可以存在相同的元素,有序集合通过分数对集合进行排序,分数可以有相同的
zadd
zadd key score member [score member…],添加一个或者多个元素以及它们的分数到集合中
redis> zadd z 1 "a" 2 "b" 3 "c"
(integer) 3 # 添加的元素个数
zscore
zscore key member,返回元素的分数
redis> zadd zm 1 "a" 2 "b" 3 "c"
(integer) 3
redis> zscord zm "b"
"2" # 返回"b"的分数
zcount
zcount key min max,返回分数在[min, max]区间的元素个数
redis> zadd zc 1 "a" 2 "b" 3 "c"
(integer) 3
redis> zcount zc 1 3
(integer) 3
redis> zcount zc 1 2
(integer) 2
zrange
zrange key start stop,返回下标在start到stop的元素集合,stop可以为负数,-1代表倒数第一个,-2代表倒数第二个
redis> zadd zr 1 "a" 2 "b" 3 "c"
(integer) 3
redis > zrange zr 0 -1 # 返回全部
1) "a"
2) "b"
3) "c"
redis> zrange zr 0 1
1) "a"
2) "b"
zrank
zrank key member,返回元素在集合中的排名,按分数从低到高排序,从0开始
redis> zadd zrk 1 "a" 2 "b" 3 "c"
(integer) 3
redis> zrank zrk "a"
(integer) 0
redis> zrank zrk "b"
(integer) 1
zrem
zrem key member [member…],移除一个或多个成员,不存在的忽略
redis> zadd zrm 1 "a" 2 "b" 3 "c"
(integer) 3
redis> zrem zrm "a"
(integer) 1 # 移除成功
redis> zrem zrm "d"
(integer) 0 # 移除失败
zincrby
zincrby key increment member,修改member的分数,不存在的member将分数设为increment
redis> zadd zi 1 "a"
(integer) 1
redis> zadd zi 1 "a"
"2" # a + 1 = 2
redis> zadd zi 10 "b"
"10" # 初始化为10
database
del
del key [key…],删除一个或多个key,如不存在则忽略
redis> mset a "a" b "b" c "c"
OK
redis> del a
(integer) 1 # 删除成功
redis> del a b c
(integer) 2 # 删除了2个
select
select index,选择db,redis一共有16个db,默认为db0
redis> select 1
OK # 切换到db1