暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

简简单单入个Redis的门

code随笔 2021-06-21
146

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随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论