Redis-常用操作详解
Redis连接
Redis安装配置,参考上一篇博文
进入目录
cd /usr/local/redis/bin/
连接redis
./redis-cli
,出现127.0.0.1:6379>
则连接成功默认有16个数据库,db0~15
切换数据库select index
select 1
索引从0开始显示所有的key键
keys *
,可以用tab键补全命令,补全命令为大写
Redis基本命令 String
set,设置键
set name test1
get,获取键值
get name
exist,判断键是否存在,返回1存在和0不存在
exist name
append,如果键不存在则创建该键,返回键的值长度;如果键存在则追加,返回追加后值长度
append name test1
如果值有空格,则需要加引号
append name "zhang san"
strlen,获取key的长度
strlen name
EX、PX表示失效时间,单位为秒和毫秒,不能同时使用,NX表示数据库中不存在时才能设置,XX表示存在时才能设置
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
ttl查看过期剩余时间,-2表示过期
127.0.0.1:6379> set job tester1 EX 10 NX
OK
127.0.0.1:6379> ttl job
(integer) 6
127.0.0.1:6379> ttl job
(integer) 5
127.0.0.1:6379> ttl job
(integer) 4
127.0.0.1:6379> ttl job
(integer) 3
127.0.0.1:6379> ttl job
(integer) 2
127.0.0.1:6379> ttl job
(integer) 2
127.0.0.1:6379> ttl job
(integer) 1
127.0.0.1:6379> ttl job
(integer) -2
127.0.0.1:6379> ttl job
进行第二次set设置,ttl值会显示-1
127.0.0.1:6379> set job tester1
OK
127.0.0.1:6379> set job tester1 EX 10 NX
(nil)
127.0.0.1:6379> ttl job
(integer) -1flushdb,清空数据库
flushdb
查看所有key键则会显示(empty list or set)
incr,递增1
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> incr age
(integer) 23
127.0.0.1:6379> get age
"23"
decr,递减1
127.0.0.1:6379> get age
"23"
127.0.0.1:6379> decr age
(integer) 22
127.0.0.1:6379> get age
"22"del,删除键,删除后还可以用incr递增、decr递减进行操作,但是基于默认值0
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> incr age
(integer) 1
127.0.0.1:6379> get age
"1"
127.0.0.1:6379> decr age
(integer) 0
127.0.0.1:6379> get age
"0"下面字符串能转换为整型
127.0.0.1:6379> set age "22"
OK
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> incr age
(integer) 23
127.0.0.1:6379> get age
"23"下面字符串不能转换为整型
127.0.0.1:6379> set age "hello"
OK
127.0.0.1:6379> incr age
(error) ERR value is not an integer or out of rangeincrby,递增,可以设置步长
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> incrby age 5
(integer) 25
127.0.0.1:6379> get age
"25"不加步长会报错
127.0.0.1:6379> incrby age
(error) ERR wrong number of arguments for 'incrby' commanddecrby,递减,可以设置步长
getset,获取值并设置新的值
127.0.0.1:6379> get age
"25"
127.0.0.1:6379>
127.0.0.1:6379> getset age 30
"25"
127.0.0.1:6379> get age
"30"setex,设置过期时间
setex key seconds value
,等同于set key value ex seconds
setnx,当key不存在时,才能设置,等同于
set key value nx
,key存在则不能设置setrange,设置指定索引位置的字符,索引0开始
从索引为6的位置开始替换
setrange key offset value
127.0.0.1:6379> set age "hello world"
OK
127.0.0.1:6379> get age
"hello world"
127.0.0.1:6379> setrange age 6 job
(integer) 11
127.0.0.1:6379> get age
"hello jobld"超过的长度使用0代替
127.0.0.1:6379> setrange age 20 job
(integer) 23
127.0.0.1:6379> get age
"hello jobld\x00\x00\x00\x00\x00\x00\x00\x00\x00job"getrange,获取指定索引位置的字符,索引0开始
getrange key start end
获取闭合区间里的值,[1,3]
127.0.0.1:6379> set age "hello world"
OK
127.0.0.1:6379> getrange age 1 3
"ell"mset,批量设置key
mset key value [key value ...]
mget,批量获取key
mget key [key ...]
127.0.0.1:6379> mset job1 1 job2 2 job3 3
OK
127.0.0.1:6379> mget job1 job2 job3
1) "1"
2) "2"
3) "3"msetnx,批量设置key,如果key都不存在则成功返回1,若有一个存在则失败返回0
msetnx j 1 k 2 l 3 [key
Redis基本命令 List
lpush,创建键及其关联的List,然后将参数values从左到右排序
lrange获取从位置0到位置2的元素,
0 -1
获取全部元素,-3 -2
获取倒数第3个到第2个元素,0 0
获取第一个元素127.0.0.1:6379> lpush age 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange age 0 2
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> lrange age 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lrange age -3 -2
1) "3"
2) "2"
127.0.0.1:6379> lrange age 0 0
1) "4"type,查看数据类型
type age
lpushx,键存在时才能插入,不存在返回0
127.0.0.1:6379> lpushx age123 1 2
(integer) 0
127.0.0.1:6379> lpushx age 1 2
(integer) 6
127.0.0.1:6379> lrange age 0 -1
1) "2"
2) "1"
3) "4"
4) "3"
5) "2"
6) "1"lpop,却出链表头部的元素,相当于删除
127.0.0.1:6379> lrange age 0 -1
1) "1"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop age
"1"
127.0.0.1:6379> lrange age 0 -1
1) "4"
2) "3"
3) "2"
4) "1"llen,返回列表长度
127.0.0.1:6379> lrange age 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> llen age
(integer) 4lrem,删除几个值等于x的元素,并返回个数
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush age 1 1 2 3 3 4 5
(integer) 7
127.0.0.1:6379> lrem age 2 1
(integer) 2
127.0.0.1:6379> lrange age 0 -1
1) "5"
2) "4"
3) "3"
4) "3"
5) "2"lindex,获取索引对应的值
127.0.0.1:6379> lrange age 0 -1
1) "5"
2) "4"
3) "3"
4) "3"
5) "2"
127.0.0.1:6379> lindex age 1
"4"
127.0.0.1:6379> lindex age 0
"5"索引值超过链表中元素数量,则返回nil
lset,修改索引对应的元素值
127.0.0.1:6379> lrange age 0 -1
1) "5"
2) "4"
3) "3"
4) "3"
5) "2"
127.0.0.1:6379> lset age 0 a
OK
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "4"
3) "3"
4) "3"
5) "2"设置的索引值超过链表中的元素数量,则返回error
ltrim,仅保留索引之间的元素,索引值俩边也被保留
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "4"
3) "3"
4) "3"
5) "2"
127.0.0.1:6379> ltrim age 0 2
OK
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "4"
3) "3"linset,在具体值前面插入新元素或者后面插入新元素
linsert key BEFORE|AFTER pivot value
127.0.0.1:6379> lrange age 0 -1
1) "c"
2) "b"
3) "a"
4) "a"
5) "4"
6) "3"
127.0.0.1:6379> linsert age before c d
(integer) 7
127.0.0.1:6379> lrange age 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "a"
6) "4"
7) "3"
127.0.0.1:6379> linsert age after c ff
(integer) 8
127.0.0.1:6379> lrange age 0 -1
1) "d"
2) "c"
3) "ff"
4) "b"
5) "a"
6) "a"
7) "4"
8) "3"rpush,从链表尾部插入参数,顺序是从右到左依次插入
127.0.0.1:6379> rpush age a b c d e
(integer) 5
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"rpushx,将元素插入链表尾部
127.0.0.1:6379> rpushx age f
(integer) 6
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"rpop,从链表尾部取出元素,相当于删除
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> rpop age
"f"
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"rpoplpush,将一个链表的元素最后一位取出,添加到另外一个链表的头部
127.0.0.1:6379> lrange age 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lrange age1 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpoplpush age age1
"e"
127.0.0.1:6379> lrange age1 0 -1
1) "e"
2) "3"
3) "2"
4) "1"将source和destination设为同一键,将链表中的尾部元素移到其头部
127.0.0.1:6379> lrange age 0 -1
1) "d"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> rpoplpush age age
"c"
127.0.0.1:6379> lrange age 0 -1
1) "c"
2) "d"
3) "a"
4) "b"
Redis基本命令 Set
sadd,当键不存在,才能成功插入多个元素
sadd age 1 2 3
不能插入重复数据
127.0.0.1:6379> smembers age
1) "1"
2) "2"
3) "3"
4) "123"
127.0.0.1:6379> sadd age 1 4 5
(integer) 2
127.0.0.1:6379> smembers age
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "123"smembers,查看集合中的元素
smembers age
sismember,判断元素是否存在,存在返回1,不存在返回0
127.0.0.1:6379> sismember age 9
(integer) 0
127.0.0.1:6379> sismember age 1
(integer) 1scard,获取集合元素数量
scard age
srandmember,随机返回一个成员,但还是存在集合中
srandmember age
spop,随机取出一个成员,集合中就被删除了
spop age
srem,从集合中取出元素,只会提取存在的元素
127.0.0.1:6379> sadd age 1 2 3 4 5
(integer) 5
127.0.0.1:6379> srem age 1 2 a
(integer) 2
127.0.0.1:6379> smembers age
1) "3"
2) "4"
3) "5"smove,将一个集合元素移动到另外一个集合中
127.0.0.1:6379> smembers age
1) "3"
2) "4"
3) "5"
127.0.0.1:6379> sadd age1 a b c
(integer) 3
127.0.0.1:6379> smembers age1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> smove age age1 3
(integer) 1
127.0.0.1:6379> smembers age1
1) "3"
2) "c"
3) "a"
4) "b"sdiff,比较几个集合中存在差异的元素
其中4、5是age3中没有的元素
127.0.0.1:6379> smembers age
1) "4"
2) "5"
127.0.0.1:6379> smembers age1
1) "3"
2) "c"
3) "a"
4) "b"
127.0.0.1:6379> smembers age3
1) "u"
2) "i"
127.0.0.1:6379> sdiff age age1
1) "4"
2) "5"
127.0.0.1:6379> sdiff age age1 age3
1) "4"
2) "5"sdiffstore,将三个集合的差异元素存储在destination关联的Set中,并返回插入的元素数量
127.0.0.1:6379> sdiffstore destination age age1 age3
(integer) 2
127.0.0.1:6379> smembers destination
1) "4"
2) "5"sinter,获取多个集合直接的交集
sinter age age1 age3
sinterstore,将三个集合的交集元素存储在destination关联的Set中,并返回交集的数量
sinterstore age age1 age3
sunion,获取多个集合之间的并集
sunion age age1 age3
sunionstore,将三个集合的并集元素存储在destination关联的Set中,并返回并集的数量
sunionstore age age1 age3
Redis基本命令 Sorted Set
也称为Zset,Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,但分数(score)却可以重复,redis正是通过分数来为集合中的成员进行从小到大的排序。
zadd
添加1个分数为10的成员
zadd age 10 a
添加2个分数为20,30的成员
zadd age 20 b 30 c
zrange
通过索引获取元素,
0 -1
表示全部元素zrange age 0 -1
加WITHSCORES表示返回结果带分数
zrange age 0 -1 WITHSCORES
zcard,获取test键中成员数量
zcard age
zrank,获取成员在集合中的索引,从0开始
zrank age a
zcount,获取符合条件的成员数量,分数满足10-20的成员数量
zcount age 10 20
zrem,删除成员并返回删除的数量
zrem age a b
zscore,获取成员的分数,返回的是字符串形式
zscore age c
zincrby,增加或减少(-)成员的分数,返回增加后的分数
zincrby age 10 c
zrangebyscore,通过分数获取满足条件的成员
zrangebyscore age 10 20
inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的数量, limit 2 2,2表示从位置索引(0-based)等于2的成员开始,取后面2个成员,成员不足就有多少显示多少,类似于MySQL中的limit
zrangebyscore age -inf +inf
zrangebyscore age -inf +inf withscores
zrangebyscore age -inf +inf limit 2 2
zrangebyscore age -inf +inf withscores limit 2 2
zrangebyscore age 10 20 withscores limit 2 2
zremrangebyscore,根据分数条件删除成员并返回删除数量
zremrangebyscore age 10 20
zremrangebyrank,根据索引条件删除成员
zremrangebyrank age 0 1
zrevrange,按索引高到低获取成员
zrevrange age
获取前10,
zrevange age 0 9
zrevrangebyscore,根据索引从高到低根据分数获取成员
zrevrangebyscore age 30 10
zrevrank,索引由高到低的排序,获取成员在集合中的索引
zrevrank age a
Redis基本命令 Hash
hset,给键设置字段
hset me name zhangsan
hget,获取字段
hget me name
hlen,获取字段数量
hlen me
hexists,判断字段是否存在,存在返回1
hexists me height
hdel,删除字段,成功返回1,重复删除返回0
hdel me name
hsetnx,添加新字段,并设置值
hsetnx me age 22
hincrby,给字段的值加1、或者减-1
hincrby me age 1
hmset,设置多个字段
hmset me height 177 weight 140
hmget,获取多个字段
hmget me height age
hgetall,返回所有字段及值
hgetall me
hkeys,获取所有字段的名字
hkeys me
hvals,获取所有字段的值
hvals me
Redis基本命令 Key
keys * ,显示所有的键
del ,删除一个或多个键
批量删除
exists,判断key是否存在,不存在返回0
move,将当前数据库的键移动到其它db1数据库
127.0.0.1:6379> exists age
(integer) 1
127.0.0.1:6379> move age 1
(integer) 1
127.0.0.1:6379> EXISTS age
(integer) 0
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> EXISTS age
(integer) 1rename,修改键的名称
rename age newage
renamenx,当新名称不存在时才执行
127.0.0.1:6379[1]> set city shanghai
OK
127.0.0.1:6379[1]> set newcity hangzhou
OK
127.0.0.1:6379[1]> renamenx city newcity
(integer) 0
127.0.0.1:6379[1]> get city
"shanghai"
127.0.0.1:6379[1]> get newcity
"hangzhou"ttl,给键设置超时时间,单位秒
set age ex 100
ttl age
查看剩余多久persist,将设置超时的键改为永久键
persist age 100
ttl age
查看剩余时间,返回-1
代表该键已经变为永久expire,更新键超时时间
expire age 200
expireat,unix时间戳格式设置键超时时间
expireat age 1588918492
不同类型的测试数据,用type来查看数据类型
127.0.0.1:6379[1]> set name katy
OK
127.0.0.1:6379[1]> lpush testlist a b c
(integer) 3
127.0.0.1:6379[1]> sadd testset 1 2 3
(integer) 3
127.0.0.1:6379[1]> zadd testzset 10 a 20 b
(integer) 2
127.0.0.1:6379[1]> hset testhash name zhangsan age 20
(integer) 2
127.0.0.1:6379[1]> type name
string
127.0.0.1:6379[1]> type testlist
listrandomkey,返回任意键
flushdb,清空当前数据库
dbsize,返回当前数据库key的数量
Redis基本命令 事务
事务中如果有一条命令执行失败,其后命令仍然会被执行
multi,添加新事务,标记事务的开始
exec,执行一个事务命令队列内的所有命令
discard,回滚事务队命令列内的所有命令。discard只能在exec前执行
执行第一条命令,但命令是存在事务命令队列的,没有立即执行
127.0.0.1:6379[1]> incr age
QUEUED执行第二条命令,命令也被存在事务命令队列的,没有立即执行
127.0.0.1:6379[1]> incr age2
QUEUED执行所有事务命令队列中所有命令
127.0.0.1:6379[1]> exec
1) (integer) 1
2) (integer) 1
127.0.0.1:6379[1]> get age
"1"
127.0.0.1:6379[1]> get age2
"1"开启新事务,设置键及string类型的值
set name zhangsan
从键name所关联的值的头部弹出元素,由于该值是字符串类型,而lpop命令仅能用于List类型,因此在执行exec命令时,该命令将会失败
127.0.0.1:6379[1]> lpop name
(error) WRONGTYPE Operation against a key holding the wrong kind of value再次设置键name的值为字符串,获取键name的值,以便确认该值是否被事务中的第二个set命令设置成功
127.0.0.1:6379[1]> set name lisi
OK
127.0.0.1:6379[1]> get name
"lisi"从结果中可以看出,事务中的第二条命令lpop执行失败,而其后的set和get命令均执行成功,这一点是Redis的事务与关系型数据库中的事务之间最为重要的差别
为键city设置一个事务执行前的值;开启一个事务;在事务内为该键设置一个新值;放弃事务;查看键city的值,从结果中可以看出该键的值仍为事务开始之前的值
127.0.0.1:6379[1]> set name lisi
OK
127.0.0.1:6379[1]> get name
"lisi"
127.0.0.1:6379[1]> set city shanghai
OK
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> set city hangzhou
QUEUED
127.0.0.1:6379[1]> discard
OK
127.0.0.1:6379[1]> get city
"shanghai"discard只能在exec前执行
127.0.0.1:6379[1]> discard
(error) ERR DISCARD without MULI