简简单单入个Redis的门

Redis介绍

Redis是一种key-value的存储系统,它是一种nosql(Not Only [SQL])非关系型的数据库,它支持string(字符串)、list(链表)、set(集合)、hash(哈希类型)和zset(sorted set --有序集合)数据类型,这些数据类型有着丰富的操作,且均具有原子性。

Redis基本指令

keys *

前面已经介绍,Redis是一种key-value的存储系统,** keys * ** 便是查看当前库里有何键;
当前库中无任何键,所以输入** keys * **则返回(empty list or set);

127.0.0.1:6379> keys *
(empty list or set)

输入set k1 v1(设置k1的键对应的value值为v1)
set k2 v2(设置k2的键对应的value值为v2)

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK

此时再输入** keys * ** 则返回k2和k1两个键

127.0.0.1:6379> keys *
1) "k2"
2) "k1"

exists < key >

exists < key > 用来判断某个键是否存在;
刚才已经设置了k1和k2两个键;
我们先输入一下exists k1试试看;

127.0.0.1:6379> exists k1
(integer) 1

我们输入exists k3试试看

127.0.0.1:6379> exists k3
(integer) 0

我们发现,当存在这个键时返回1,当不存在时返回0;

type < key >

type < key > 用来查看某个键的类型;
后面介绍了五大数据类型后,一一尝试此指令;

del < key >

del < key >用来删除某个键;
此时当前库中有k1和k2两个键,如输入del k1

127.0.0.1:6379> del k1
(integer) 1

再来查看库中的键,只剩k2了

127.0.0.1:6379> keys *
1) "k2"

如果输入一个不存在的键呢?

127.0.0.1:6379> del k3
(integer) 0

会返回0

expire < key > < seconds >

expire < key > < seconds > 为已经存在的键设置过期时间(单位秒)
如输入expire k2 10,那么k2键将会在10秒后过期;

127.0.0.1:6379> expire k2 10
(integer) 1

10秒后再查看当前库中的键

127.0.0.1:6379> keys *
(empty list or set)

当前库已经空了;

ttl < key >

ttl < key > 用来查看某个键还有多长时间过期:
-1表示永不过期;
-2表示已过期;
依次输入
set test1 1
set test2 2

127.0.0.1:6379> set test1 1
OK
127.0.0.1:6379> set test2 2
OK

此时库中有test1和test2两个键
输入
expire test1 20
意味着给test1设置20秒的过期时间

127.0.0.1:6379> expire test1 20
(integer) 1

一直输入ttl test1

127.0.0.1:6379> ttl test1
(integer) 16
127.0.0.1:6379> ttl test1
(integer) 12
127.0.0.1:6379> ttl test1
(integer) 8
127.0.0.1:6379> ttl test1
(integer) 2
127.0.0.1:6379> ttl test1
(integer) -2
127.0.0.1:6379> 

可以看到其过期时间,为-2则为已过期
输入ttl test2查看test2的过期时间

127.0.0.1:6379> ttl test2
(integer) -1

-1表示永不过期

dbsize

此指令用来查看当前redis库中的key的数量;
目前库中只有test2一个键

127.0.0.1:6379> dbsize
(integer) 1

返回1

flushdb

flushdb用来清空当前库,将当前库中所有键删掉

127.0.0.1:6379> flushdb
OK

再输入dbsize

127.0.0.1:6379> dbsize
(integer) 0

数量已经为0

flushall

此指令用来通杀全部库;
当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),我们只用了16个库中的一个,使用此命令会清空所有库中的键,慎用。

可存储的五大数据类型

在介绍前,先输入flushdb清空下当前redis库

127.0.0.1:6379> flushdb
OK

String——字符串

redis的键可以存储字符串String类型的值;下面介绍其相关指令:

set < key > < value >

set < key > < value >用来设置键值对;
如我依次输入
set keyString1 abc
set keyString2 123

127.0.0.1:6379> set keyString1 abc
OK
127.0.0.1:6379> set keyString2 123
OK

用type < key >指令查看类型

127.0.0.1:6379> type keyString1
string
127.0.0.1:6379> type keyString2
string

get < key >

此指令用来查询key对应的值;
如输入get keyString1

127.0.0.1:6379> get keyString1      
"abc"

append < key > < tailvalue >

此指令用于将给定的< tailvalue >增加到原来< key >对应的value之后;
目前keyString2 对应 "123";
如输入append keyString2 xyz

127.0.0.1:6379> append keyString2 xyz
(integer) 6

返回其长度6;
再输入get keyString2如下

127.0.0.1:6379> get keyString2
"123xyz"

strlen < key >

此指令获取< key >对应的值的长度;
如下:

127.0.0.1:6379> strlen keyString1
(integer) 3
127.0.0.1:6379> strlen keyString2
(integer) 6

setnx < key > < value >

此指令的用法是:
只有当< key >不存在时才设置键值对;

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString2"

此时当前库中有两个键;
如输入 setnx keyString3 mnopq

127.0.0.1:6379> setnx keyString3 mnopq
(integer) 1

返回1;
查看当前库中键,查看keyString3对应的值

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> get keyString3
"mnopq"

如输入 setnx keyString1 mnopq

127.0.0.1:6379> setnx keyString1 mnopq
(integer) 0
127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> get keyString1
"abc"

由此可见,未改变keyString1的值。

incr < key >

此指令用于将key中储存的数字字符串值增加1 (只能对数字字符串值操作,如果为空,新增值为1);
如输入以下内容:

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> set keyString4 123456
OK
127.0.0.1:6379> incr keyString4
(integer) 123457
127.0.0.1:6379> get keyString1
"abc"
127.0.0.1:6379> incr keyString1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incr keyString5
(integer) 1
127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString4"
3) "keyString3"
4) "keyString5"
5) "keyString2"
127.0.0.1:6379> get keyString5
"1"

decr < key >

将key中储存的数字值字符串减去1 (只能对数字字符串值操作,如果为空,新增值为-1);
与incr < key > 类似

incrby / decrby < key > < 步长 >

将key中存储的数字值字符串增加/减去自定义步长(只能对数字字符串值操作,如果为空,新增值为步长或者负步长);

mset < key1 > < value1 > < key2 > < value2 > .....

此指令用于同时设置一个或多个 key-value对 ,与set < key > < value >类似,不过是多设置几个;

mget < key1 > < key2 > < key3 > .....

同时获取一个或多个 value ;与get < key >类似,不过是获取多个值;

msetnx < key1 > < value1 > < key2 > < value2 > .....

当且仅当所有给定 key 都不存在时,同时设置一个或多个 key-value 对 ;
与setnx < key > < value >类似;

getrange < key > < 起始位置 > < 结束位置 >

此指令获得值的范围(包前也包后)

127.0.0.1:6379> set keyString6 123456abcdef
OK
127.0.0.1:6379> getrange keyString6 0 6
"123456a"
127.0.0.1:6379> getrange keyString6 1 5
"23456"

如想获取从开始到结束的字符串,结束位置用-1即可;

127.0.0.1:6379> getrange keyString6 0 -1
"123456abcdef"

setrange < key > < 起始位置 > < value2 >

从< 起始位置 >用< value2>开始覆写< key > 所储存的字符串值;
如下所示:

127.0.0.1:6379> get keyString6
"123456abcdef"
127.0.0.1:6379> setrange keyString6 2 xyz
(integer) 12
127.0.0.1:6379> get keyString6
"12xyz6abcdef"

setex < key > < 过期时间 > < value >

设置键值的同时,设置过期时间,单位秒

127.0.0.1:6379> setex kkk 20 123
OK
127.0.0.1:6379> ttl kkk
(integer) 17
127.0.0.1:6379> ttl kkk
(integer) 12
127.0.0.1:6379> ttl kkk
(integer) 9
127.0.0.1:6379> ttl kkk
(integer) 4
127.0.0.1:6379> ttl kkk
(integer) 1
127.0.0.1:6379> ttl kkk
(integer) -2

getset < key > < value >

以新换旧,设置了新值同时获得旧值;
如:

127.0.0.1:6379> get keyString1
"abc"
127.0.0.1:6379> getset keyString1 123
"abc"
127.0.0.1:6379> get keyString1
"123"

list——字符串列表

其底层是双向链表,两端操作性能高,通过索引下标操作中间节点性能较差,下面介绍其指令:

lpush/rpush < key > < value1 > < value2 > < value3 > ....

该指令用于从左边/右边插入一个或多个值;
输入如下:

127.0.0.1:6379> lpush myList1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> rpush myList2 a b c d e f
(integer) 6
127.0.0.1:6379> lpush myList3 7 8 9
(integer) 3
127.0.0.1:6379> rpush myList3 x y z
(integer) 6

用type查看类型

127.0.0.1:6379> type myList2
list

myList1从左边插入,1先进入,2后进入...所以6在最左边,1在最右边;
myList2从右边插入,a先进入,b后进入...a在最左边,f在最右边;
myList3先从左边插入,7先进入,8后进入,9最后进入,所以从左到右依次时,9,8,7;
myList3再从右边插入,插入后,从左到右依次是,9,8,7,x,y,z;

lrange < key > < start > < stop >

按照索引下标获得元素(从左到右);

127.0.0.1:6379> lrange myList1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lrange myList3 0 -1
1) "9"
2) "8"
3) "7"
4) "x"
5) "y"
6) "z"
127.0.0.1:6379> lrange myList1 0 2
1) "6"
2) "5"
3) "4"
127.0.0.1:6379> 

lpop/rpop < key >

从左边/右边吐出一个值 值在键在,值光键亡;

127.0.0.1:6379> lpop myList1
"6"
127.0.0.1:6379> lrange myList1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpop myList1
"1"
127.0.0.1:6379> lrange myList1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> lpop myList1
"5"
127.0.0.1:6379> lpop myList1
"4"
127.0.0.1:6379> lpop myList1
"3"
127.0.0.1:6379> lpop myList1
"2"
127.0.0.1:6379> lpop myList1
(nil)
127.0.0.1:6379> exists myList1
(integer) 0

rpoplpush < key1 > < key2 >

从< key1 >列表右边吐出一个值,插到< key2 >列表左边;
如:

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lrange myList3 0 -1
1) "9"
2) "8"
3) "7"
4) "x"
5) "y"
6) "z"
127.0.0.1:6379> rpoplpush myList2 myList3
"f"
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lrange myList3 0 -1
1) "f"
2) "9"
3) "8"
4) "7"
5) "x"
6) "y"
7) "z"

lindex < key > < index >

按照索引下标获得元素(从左到右)

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lindex myList2 2
"c"

llen < key > 获得列表长度

127.0.0.1:6379> llen myList2
(integer) 5
127.0.0.1:6379> llen myList3
(integer) 7

linsert < key > before(after) < value > < newvalue >

此命令为在< key >对应的< value >的前(后)面插入< newvalue >

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert myList2 before b 123
(integer) 6
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "123"
3) "b"
4) "c"
5) "d"
6) "e"

lrem < key > < n > < value >

从左边删除n个value(从左到右)
n为正数表示从左往右删除几个
n为负数表示从右往左删几个
n为0表示删除所有
如:

127.0.0.1:6379> rpush myList4 1 a 2 b c a 2 1
(integer) 8
127.0.0.1:6379> lrange myList4 0 -1
1) "1"
2) "a"
3) "2"
4) "b"
5) "c"
6) "a"
7) "2"
8) "1"
127.0.0.1:6379> lrem myList4 1 1
(integer) 1
127.0.0.1:6379> lrange myList4 0 -1
1) "a"
2) "2"
3) "b"
4) "c"
5) "a"
6) "2"
7) "1"
127.0.0.1:6379> lrem myList4 1 2
(integer) 1
127.0.0.1:6379> lrange myList4 0 -1
1) "a"
2) "b"
3) "c"
4) "a"
5) "2"
6) "1"
127.0.0.1:6379> lrem myList4 0 a
(integer) 2
127.0.0.1:6379> lrange myList4 0 -1
1) "b"
2) "c"
3) "2"
4) "1"

set——字符串无序集合

底层其实是一个value为null的 hash表,添加,删除,查找的复杂度都是O(1);
其指令如下:

sadd < key > < value1 > < value2 > .....

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
如:

127.0.0.1:6379> sadd mySet1 1 2 3 a b c 2 3
(integer) 6
127.0.0.1:6379> sadd mySet2 x y z m n 
(integer) 5

用type查看类型

127.0.0.1:6379> type mySet1
set

smembers < key >

取出该集合的所有值,如:

127.0.0.1:6379> smembers mySet1
1) "1"
2) "3"
3) "2"
4) "b"
5) "c"
6) "a"
127.0.0.1:6379> smembers mySet2
1) "y"
2) "m"
3) "z"
4) "x"
5) "n"

sismember < key > < value >

判断集合< key >是否为含有该< value >值,有返回1,没有返回0;
如:

127.0.0.1:6379> sismember mySet1 a
(integer) 1
127.0.0.1:6379> sismember mySet1 123456
(integer) 0

scard < key >

返回该集合的元素个数

127.0.0.1:6379> scard mySet1
(integer) 6
127.0.0.1:6379> scard mySet2
(integer) 5

srem < key > < value1 > < value2 > ....

删除集合中的某(几)个元素;

127.0.0.1:6379> smembers mySet2
1) "y"
2) "m"
3) "z"
4) "x"
5) "n"
127.0.0.1:6379> srem mySet2 m
(integer) 1
127.0.0.1:6379> smembers mySet2
1) "z"
2) "x"
3) "y"
4) "n"
127.0.0.1:6379> srem mySet2 x n
(integer) 2
127.0.0.1:6379> smembers mySet2
1) "y"
2) "z"
127.0.0.1:6379> srem mySet2 1 2
(integer) 0

删除几个返回几;

spop < key >

随机从该集合中吐出一个元素,会从集合中删除 ;

127.0.0.1:6379> spop mySet1
"3"
127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"

srandmember < key > < n >

随机从该集合中取出n个值,不会从集合中删除

127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"
127.0.0.1:6379> srandmember mySet1 2
1) "1"
2) "b"
127.0.0.1:6379> srandmember mySet1 10
1) "c"
2) "1"
3) "b"
4) "2"
5) "a"
127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"

如果超过集合中的个数,则全部返回;

sinter < key1 > < key2 >

返回两个集合的交集元素;

sunion < key1 > < key2 >

返回两个集合的并集元素;

sdiff < key1 > < key2 >

返回两个集合的差集元素;
如:

127.0.0.1:6379> sadd testSet1 a 1 2 x y
(integer) 5
127.0.0.1:6379> sadd testSet2 a b 2 x z
(integer) 5
127.0.0.1:6379> sinter testSet1 testSet2
1) "a"
2) "x"
3) "2"
127.0.0.1:6379> sunion testSet1 testSet2
1) "1"
2) "y"
3) "x"
4) "2"
5) "b"
6) "a"
7) "z"
127.0.0.1:6379> sdiff testSet1 testSet2
1) "y"
2) "1"

hash——string类型的field和value的映射表

hset < key > < field > < value >

给< key >集合中的 < field >键赋值< value >

127.0.0.1:6379> hset studentInfo student:001:name testName1
(integer) 1

用type查看类型

127.0.0.1:6379> type studentInfo
hash

hget < key1 > < field >

从< key1 >集合< field > 取出 value

127.0.0.1:6379> hget studentInfo student:001:name
"testName1"

hmset < key1 > < field1 > < value1 > < field2 > < value2 >...

批量设置hash的值;
如:

127.0.0.1:6379> hmset studentInfo student:001:stuid 001 student:001:stuname testName1 student:001:stuage 16
OK

hexists < key > < field >

此命令用来查看哈希表 key 中,给定域 field 是否存在

127.0.0.1:6379> hexists studentInfo student:001:stuname
(integer) 1
127.0.0.1:6379> hexists studentInfo student:001:stusex
(integer) 0

hkeys < key >

此命令用于列出该hash集合的所有field ;

hvals < key >

此命令用于列出该hash集合的所有value;

hgetall < key >

此命令用于列出该hash集合所有的key和value;
如:

127.0.0.1:6379> hkeys studentInfo
1) "student:001:name"
2) "student:001:stuid"
3) "student:001:stuname"
4) "student:001:stuage"
127.0.0.1:6379> hvals studentInfo
1) "testName1"
2) "001"
3) "testName1"
4) "16"
127.0.0.1:6379> hgetall studentInfo
1) "student:001:name"
2) "testName1"
3) "student:001:stuid"
4) "001"
5) "student:001:stuname"
6) "testName1"
7) "student:001:stuage"
8) "16"

hincrby < key > < field > < increment >

为哈希表 key 中的域 field 的值加上增量 increment (需为数值型字符串类型);

127.0.0.1:6379> hget studentInfo student:001:stuage
"16"
127.0.0.1:6379> hincrby studentInfo student:001:stuage 2
(integer) 18

hsetnx < key > < field > < value >

当域 field 不存在时将哈希表 key 中的域 field 的值设置为 value ;

127.0.0.1:6379> hsetnx studentInfo student:001:stuage 36
(integer) 0
127.0.0.1:6379> hsetnx studentInfo student:001:stusex male
(integer) 1
127.0.0.1:6379> hget studentInfo student:001:stusex
"male"

zset——字符串有序集合

它是没有重复元素的字符串集合。每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。

zadd < key > < score1 > < value1 > < score2 > < value2 >...

此命令用于将一个或多个 member 元素及其 score 值加入到有序集 key 当中;

127.0.0.1:6379> zadd myZset 10 a 100 b 20 c 1000 d 500 e
(integer) 5

用type命令查看

127.0.0.1:6379> type myZset
zset

如果添加相同元素,相同分数肯定是添加不进去的;
如果添加相同元素,不同分数将分数更改为最新的分数;
如果添加不同元素,相同分数 可以添加进去;

127.0.0.1:6379> zadd myZset 10 a
(integer) 0
127.0.0.1:6379> zadd myZset 10000 a
(integer) 0
127.0.0.1:6379> zadd myZset 6 m 6 n
(integer) 2

zrange < key > < start > < stop > [WITHSCORES]

返回有序集 key 中,下标在< start > < stop >之间的元素,带WITHSCORES,可以让分数一起和值返回到结果集。

127.0.0.1:6379> zadd myZset2 10 x 100 y 1000 z
(integer) 3
127.0.0.1:6379> zrange myZset 0 -1
1) "m"
2) "n"
3) "c"
4) "b"
5) "e"
6) "d"
7) "a"
127.0.0.1:6379> zrange myZset 0 -1 WITHSCORES
 1) "m"
 2) "6"
 3) "n"
 4) "6"
 5) "c"
 6) "20"
 7) "b"
 8) "100"
 9) "e"
10) "500"
11) "d"
12) "1000"
13) "a"
14) "10000"

zvrange < key > < start > < stop > [WITHSCORES]

同上,改为从大到小排列。

zrangebyscore key min max [ withscores ] [ limit offset count ]

返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。

127.0.0.1:6379> zrangebyscore myZset 100 1000
1) "b"
2) "e"
3) "d"
127.0.0.1:6379> zrangebyscore myZset 1000 1000
1) "d"

如果知道一个值的分数,min和max均写此分数即可;

zrevrangebyscore key max min [ withscores ] [ limit offset count ]

同上,改为从大到小排列。

zincrby < key > < increment > < value >

此指令用于为元素的score加上增量;

127.0.0.1:6379> zadd myZset2 10 x 100 y 1000 z
(integer) 3
127.0.0.1:6379> zincrby myZset2 20 x
"30"
127.0.0.1:6379> zrange myZset2 0 -1 WITHSCORES
1) "x"
2) "30"
3) "y"
4) "100"
5) "z"
6) "1000"

zrem < key > < value >

删除该集合下,指定值的元素;
如:

127.0.0.1:6379> zrem myZset2 x
(integer) 1
127.0.0.1:6379> zrange myZset2 0 -1 WITHSCORES
1) "y"
2) "100"
3) "z"
4) "1000"

zcount < key > < min > < max >

统计该集合,分数区间内的元素个数;

127.0.0.1:6379> zrange myZset 0 -1 WITHSCORES
 1) "m"
 2) "6"
 3) "n"
 4) "6"
 5) "c"
 6) "20"
 7) "b"
 8) "100"
 9) "e"
10) "500"
11) "d"
12) "1000"
13) "a"
14) "10000"
127.0.0.1:6379> zcount myZset 100 1000
(integer) 3

zrank < key > < value >

返回该值在集合中的排名,从0开始

127.0.0.1:6379> zrank myZset e
(integer) 4

最后

本文介绍了Redis基本指令、可存储的五大数据类型和这五大数据类型的指令,希望大家可以通过此篇入门Redis.。

欢迎关注

扫下方二维码即可关注:
微信公众号:code随笔

分类:

技术点:

Redis