redis基本数据结构(之前的命令不再重复):
一、String 字符串类型
是redis中最基本的数据类型,一个key对应一个value。
字符串命令:
1.INCR、将键存储的值加上1
2.DECR、将键存储的值减去1
3.INCRBY、将键存储的值加上整数amount(需要传参amount)
4.DECRBY、将键存储的值减去整数amount(需要传参amount)
5.INCRBYFLOAT、将键存储的值加上浮点数amount(需要传参amount,这个命令在2.6及以上的版本可用)
6.APPEND、将值value追加到给定键当前储存值的末尾
7.GETRANGE、获取一个由偏移量start到end范围内的字符串
8.SETRANGE、将从start开始的字串设置为给定值
9.GETBIT、将字节串看为二进制位串,并返回位串中偏移量为offset的二进制位值
10.SETBIT、将字节串看为二进制串,并将串中偏移量为offset的二进制位值设置为value
11.BITCOUNT、统计二进制位串里面值为1的二进制位的数量
12.BITOP、位运算
13.GETRANGE,SUBSTR、两者功能一样,GETRANGE是由SUBSTR演变来的
127.0.0.1:6379> set test 80
OK
127.0.0.1:6379> get test
"80"
127.0.0.1:6379> incr test
(integer) 81
127.0.0.1:6379> decr test
(integer) 80
127.0.0.1:6379> incrby test 100
(integer) 180
127.0.0.1:6379> decrby test 60
(integer) 120
127.0.0.1:6379> incrbyfloat test 30.2
"150.2"
127.0.0.1:6379> set test abc
OK
127.0.0.1:6379> get test
"abc"
127.0.0.1:6379> append test def
(integer) 6
127.0.0.1:6379> get test
"abcdef"
127.0.0.1:6379> getrange test 2 4
"cde"
127.0.0.1:6379> getrange test 2 200 # 可以看到超出范围并不会报错,且包含了起点和终点
"cdef"
127.0.0.1:6379> setrange test 2 opq
(integer) 6
127.0.0.1:6379> get test
"abopqf"
127.0.0.1:6379> getbit test 0
(integer) 0
127.0.0.1:6379> getbit test 1
(integer) 1
127.0.0.1:6379> setbit test 5 1
(integer) 0
127.0.0.1:6379> get test
"ebopqf"
127.0.0.1:6379> setbit test 5 2
(error) ERR bit is not an integer or out of range # 因为二进制只有0和1
127.0.0.1:6379> bitcount test
(integer) 24
127.0.0.1:6379> set ta a
OK
127.0.0.1:6379> set tb b
OK
127.0.0.1:6379> bitop and ta tb
(integer) 1
127.0.0.1:6379> bitop or ta tb
(integer) 1
127.0.0.1:6379> bitop xor ta tb
(integer) 1
二、列表(list)
一个链表结构可以有序的存储多个字符串。
列表命令:
1.ltrim、对列表进行修剪,只保留从start偏移量到end偏移量内的元素
2.blpop、从第一个非空列表中弹出最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现
3.brpop、从第一个非空列表中弹出最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现
4.rpoplpush、从a列表中弹出最右端元素,然后将这个元素推入b列表的最左端,并向用户返回这个元素
5.brpoplpush、从a列表中弹出最右端元素,然后将这个元素推入b列表的最左端,并向用户返回这个元素,如果a列表为空,那么在timeout秒之内阻塞并等待可弹出的元素出现
127.0.0.1:6379> ltrim list-test 0 1
OK
127.0.0.1:6379> lrange list-test 0 -1
1) "test"
2) "test2"
127.0.0.1:6379> blpop list-test 2
1) "list-test"
2) "test"
127.0.0.1:6379> lrange list-test 0 -1
1) "test2"
127.0.0.1:6379> blpop list-test 2
1) "list-test"
2) "test2"
127.0.0.1:6379> lrange list-test 0 -1
(empty array)
127.0.0.1:6379> blpop list-test 2
(nil)
(2.06s) # 这块要注意下执行耗时,空列表阻塞了两秒
127.0.0.1:6379> brpop list-test 3
(nil)
(3.10s)
127.0.0.1:6379> lrange list-a 0 -1
1) "a1"
2) "a2"
3) "a3"
127.0.0.1:6379> lrange list-b 0 -1
1) "b1"
2) "b2"
3) "b3"
127.0.0.1:6379> rpoplpush list-a list-b
"a3"
127.0.0.1:6379> lrange list-a 0 -1
1) "a1"
2) "a2"
127.0.0.1:6379> lrange list-b 0 -1
1) "a3"
2) "b1"
3) "b2"
4) "b3"
127.0.0.1:6379> brpoplpush list-a list-b 4
"a2"
127.0.0.1:6379> brpoplpush list-a list-b 4
"a1"
127.0.0.1:6379> brpoplpush list-a list-b 4
(nil)
(4.15s)
3.集合(set)
集合和列表都可以存储多个字符串,不同之处在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是各不相同的
集合命令:
1.scard、返回集合包含的元素的数量
2.srandmember、从集合里随机返回一个或多个元素,当count位正数时,命令返回的随机元素不会重复,为负数时,命令返回的随机元素可能重复
3.spop、随机移除集合中的一个元素,并返回被移除元素
4.smove、如果集合a包含元素item,那么从集合a中移除元素item,并将item添加到b键里面,如果item被成功移除,返回1,否则返回0
5.sdiff、返回存在于第一个集合,但不存在于其他集合中的元素
6.sdiffstore、将那些存在于第一个集合但不存在于其他集合中的元素存储到b键里面
7.sinter、返回那些同时存在于所有集合中的元素
8.sinterstore、将那些同时存在于所有集合中的元素存储到b键里面
9.sunion、返回那些至少存储在一个集合中的元素
10.sunionstore、将那些至少存储在一个集合中的元素存储到b键里面
127.0.0.1:6379> smembers set-test
1) "test3"
2) "test2"
3) "test"
4) "test1"
127.0.0.1:6379> scard set-test
(integer) 4
127.0.0.1:6379> srandmember set-test 1
1) "test3"
127.0.0.1:6379> srandmember set-test 1
1) "test2"
127.0.0.1:6379> srandmember set-test -2
1) "test"
2) "test3"
127.0.0.1:6379> srandmember set-test -2
1) "test3"
2) "test3"
127.0.0.1:6379> spop set-test
"test"
127.0.0.1:6379> smembers set-a
1) "a1"
2) "a3"
3) "a2"
127.0.0.1:6379> smembers set-b
1) "b2"
2) "b1"
3) "b3"
127.0.0.1:6379> smove set-a set-b a1
(integer) 1
127.0.0.1:6379> smembers set-a
1) "a3"
2) "a2"
127.0.0.1:6379> smembers set-b
1) "b2"
2) "a1"
3) "b1"
4) "b3"
127.0.0.1:6379> smove set-a set-b b1
(integer) 0
127.0.0.1:6379> smembers set-a
1) "a1"
2) "a3"
3) "a2"
127.0.0.1:6379> smembers set-b
1) "b2"
2) "a1"
3) "b1"
4) "b3"
127.0.0.1:6379> sunion set-a set-b
1) "a2"
2) "a3"
3) "b2"
4) "a1"
5) "b3"
6) "b1"
127.0.0.1:6379> sdiff set-a set-b
1) "a2"
2) "a3"
127.0.0.1:6379> sinter set-a set-b
1) "a1"
127.0.0.1:6379> sdiffstore res-test set-a set-b
(integer) 2
127.0.0.1:6379> smembers res-test
1) "a2"
2) "a3"
127.0.0.1:6379> del res-test
(integer) 1
127.0.0.1:6379> sunionstore res-test set-a set-b
(integer) 6
127.0.0.1:6379> smembers res-test
1) "a2"
2) "a3"
3) "b2"
4) "a1"
5) "b3"
6) "b1"
127.0.0.1:6379> del res-test
(integer) 1
127.0.0.1:6379> sinterstore res-test set-a set-b
(integer) 1
127.0.0.1:6379> smembers res-test
1) "a1"
4、散列(hash)
散列可以存储多个键值对之间的映射,和字符串一样,散列存储的值既可以是字符串,又可以是数字值,并且用户同样可以对散列存储的数字值进行自增操作或者自减操作
散列命令:
1.hmset、为散列里面一个或多个键设置值
2.hmget、从散列里面获取一个或多个键的值
3.hlen、返回散列包含的键值对的数量
4.hexists、检查给定键是否存在于散列中
5.hkeys、获取散列包含的所有键
6.hvals、读取散列中指定键的值
7.hincrby、将键key保存的值加上整数num
8.hincrbyfloat、将键key保存的值加上浮点数num
127.0.0.1:6379> hmset hash-test key1 value1 key2 value2
OK
127.0.0.1:6379> hmget hash-test key1 key2
1) "value1"
2) "value2"
127.0.0.1:6379> hlen hash-test
(integer) 2
127.0.0.1:6379> hexists hash-test key1
(integer) 1
127.0.0.1:6379> hexists hash-test key3
(integer) 0
127.0.0.1:6379> hkeys hash-test
1) "key1"
2) "key2"
127.0.0.1:6379> hvals hash-test
1) "value1"
2) "value2"
127.0.0.1:6379> hset hash-test key3 10
(integer) 1
127.0.0.1:6379> hincrby hash-test key3 5
(integer) 15
127.0.0.1:6379> hincrbyfloat hash-test key3 3.5
"18.5"
5、有序集合(zset)
有序集合和散列一样,都用于存储键值对,有序集合的键被称为成员,每个成员都是独一无二的,而有序集合的值被称为分值,分值必须为浮点数。有序集合是redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序来访问元素的结构
有序集合命令:
1.zcard、返回有序集合包含的成员数量
2.zincrby、将member成员的分值加上num
3.zrank、返回指定成员在有序集合中的排名
4.zscore、返回指定成员的分值
5.zrevrank、返回在有序集合中的排名,按照分值从大到小排
6.zrevrange、返回在有序集合中给定排名范围内的成员,按照分值从大到小排
7.zrevrangebyscore、跟zrangebyscore类似,按照分值从大到小排
8.zremrangebyrank、移除有序集合中排名介于start和end之间的所有成员
9.zremrangebyscore、移除有序集合中分值介于min和max之间的所有成员
10.zinterstore、对给定有序集合执行交集运算
11.zunionstore、对给定有序集合执行并集运算
127.0.0.1:6379> zrange zset-test 0 -1 withscores
1) "test2"
2) "75"
3) "test"
4) "663"
5) "test1"
6) "728"
7) "test3"
8) "821"
127.0.0.1:6379> zcard zset-test
(integer) 4
127.0.0.1:6379> zincrby zset-test 10 test
"673"
127.0.0.1:6379> zrank zset-test test2
(integer) 0
127.0.0.1:6379> zrank zset-test test1
(integer) 2
127.0.0.1:6379> zrank zset-test test
(integer) 1
127.0.0.1:6379> zscore zset-test test1
"728"
127.0.0.1:6379> zrevrank zset-test test2
(integer) 3
127.0.0.1:6379> zrevrange zset-test 1 3
1) "test1"
2) "test"
3) "test2"
127.0.0.1:6379> zrevrange zset-test 1 3 withscores
1) "test1"
2) "728"
3) "test"
4) "673"
5) "test2"
6) "75"
127.0.0.1:6379> zrevrangebyscore zset-test 800 90
1) "test1"
2) "test"
127.0.0.1:6379> zremrangebyrank zset-test 0 1
(integer) 2
127.0.0.1:6379> zrange zset-test 0 -1 withscores
1) "test1"
2) "728"
3) "test3"
4) "821"
127.0.0.1:6379> zremrangebyscore zset-test 728 821
(integer) 2
127.0.0.1:6379> zrange zset-test 0 -1 withscores
(empty array)
127.0.0.1:6379> zrange zset-a 0 -1 withscores
1) "a1"
2) "10"
3) "a2"
4) "10"
5) "a3"
6) "10"
127.0.0.1:6379> zrange zset-b 0 -1 withscores
1) "a1"
2) "20"
3) "a2"
4) "20"
5) "b3"
6) "20"
127.0.0.1:6379> zunionstore zset-res 2 zset-a zset-b # 其中2是指后面跟的集合的数量,不一致则会报错(比如填写3,4,5等等)
(integer) 4
127.0.0.1:6379> zrange zset-res 0 -1 withscores
1) "a3"
2) "10"
3) "b3"
4) "20"
5) "a1"
6) "30"
7) "a2"
8) "30"
127.0.0.1:6379> del zset-res
(integer) 1
127.0.0.1:6379> zinterstore zset-res 2 zset-a zset-b
(integer) 2
127.0.0.1:6379> zrange zset-res 0 -1 withscores
1) "a1"
2) "30"
3) "a2"
4) "30"
以上就是对redis五种数据结构的介绍和使用,后续文章会补充其他的命令