redis-3.redis的list、set、hash、sorted_set、skiplist

redis

list

首先看图,感知一波。

在这里插入图片描述

BLPOP key [key ...] timeout (阻塞,单播队列)删除并获取列表中的第一个元素,或块中的第一个元素,直到有一个可用
BRPOP key [key ...] timeout 删除并获取列表中的最后一个元素,或块,直到有一个可用
BRPOPLPUSH source destination timeout 从列表中弹出一个值,推送到另一个列表并返回;或阻塞,直到可用为止
LINDEX key index 通过索引从列表中获取元素
LINSERT key BEFORE|AFTER pivot value 在列表的另一个元素之前或之后插入一个元素
LLEN key 获取列表的长度
LPOP key 删除并获取列表中的第一个元素
LPUSH key value [value ...] 在列表前添加一个或多个值
LPUSHX key value 仅当列表存在时,在列表前添加一个值
LRANGE key start stop 从列表中获取元素的范围
LREM key count value 从列表中删除元素
LSET key index value 通过索引设置列表中元素的值
LTRIM key start stop 将列表修剪到指定范围
RPOP key 删除并获取列表中的最后一个元素
RPOPLPUSH source destination 删除列表中的最后一个元素,将其添加到另一个列表并返回
RPUSH key value [value ...] 向列表追加一个或多个值
RPUSHX key value 仅当列表存在时,向列表追加一个值

list里面第一个压得是a 最后一个是 f   
127.0.0.1:16379> LPUSH k1 a b c d e f
(integer) 6
127.0.0.1:16379> 
list里面第一个压得是f 最后一个是 a
127.0.0.1:16379> RPush k2 a b c d e f
(integer) 6
127.0.0.1:16379> lpop k1
"f"

LPUSH,RPush,lpop,RPOP

L 代表左
R 代表右
栈:后进先出(LIFO-last in first out):最后插入的元素最先出来。
队列:先进先出(FIFO-first in first out):最先插入的元素最先出来

LRANGE redis有正负索引

127.0.0.1:16379> help LRANGE

  LRANGE key start stop
  summary: Get a range of elements from a list
  since: 1.0.0
  group: list

127.0.0.1:16379> LPUSH k1 a b c d e f
(integer) 6
127.0.0.1:16379> RPush k2 a b c d e f
(integer) 6
127.0.0.1:16379> LRANGE k2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:16379> LRANGE k1 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"

LINDEX,lset 这个时候又像java里面得数组


127.0.0.1:16379> LINDEX k1 2
"d"
127.0.0.1:16379> LINDEX k1 -1
"a"

127.0.0.1:16379> lset k1 3 xxxx
OK
127.0.0.1:16379> LRANGE k1 0 -1
1) "f"
2) "e"
3) "d"
4) "xxxx"
5) "b"
6) "a"

LREM 移除,分正反向索引 1与-1

127.0.0.1:16379> lpush k3 1 a  2 b 3 a 4 c 5 a 6 d
(integer) 12
127.0.0.1:16379> LRANGE k3 0 -1
 1) "d"
 2) "6"
 3) "a"
 4) "5"
 5) "c"
 6) "4"
 7) "a"
 8) "3"
 9) "b"
10) "2"
11) "a"
12) "1"
127.0.0.1:16379> LREM k3 2 a 
 这个时候remove的是正向索引 1 a  3 a

LINSERT 在list 前后插入数据

127.0.0.1:16379> help LINSERT

  LINSERT key BEFORE|AFTER pivot element
  summary: Insert an element before or after another element in a list
  since: 2.2.0
  group: list

127.0.0.1:16379> LINSERT k3 after 6  a
(integer) 13
127.0.0.1:16379> LINSERT k3 before 3 a
(integer) 14

BLPOP BRPOP

LTRIM 删除前后两端

127.0.0.1:16379> LPUSH k4 a b c d e f g h i
(integer) 9
127.0.0.1:16379> LTRIM k4 1 -2
OK
127.0.0.1:16379> LRANGE k4 0 -1
1) "h"
2) "g"
3) "f"
4) "e"
5) "d"
6) "c"
7) "b"

在这里插入图片描述

hash

对field进行数值计算场景:点赞,收藏,详情页

HDEL key field [field ...] 删除一个或多个散列字段
HEXISTS key field 确定散列字段是否存在
HGET key field 获取散列字段的值
HGETALL key 获取散列中的所有字段和值
HINCRBY key field increment 将哈希字段的整数值按给定的数字递增
HINCRBYFLOAT key field increment 将哈希字段的浮点值按给定的量递增
HKEYS key 获取散列中的所有字段
HLEN key 获取散列中的字段数
HMGET key field [field ...] 获取所有给定哈希字段的值
HMSET key field value [field value ...] 将多个哈希字段设置为多个值
HSCAN key cursor [MATCH pattern] [COUNT count]  递增迭代哈希字段和关联值
HSET key field value 设置散列字段的字符串值
HSETNX key field value 设置散列字段的值,仅当该字段不存在时
HSTRLEN key field 获取散列字段值的长度
HVALS key 获取散列中的所有值

127.0.0.1:16379> set sean::name 'zjj'
OK
127.0.0.1:16379> set sean::age 18
OK
127.0.0.1:16379> keys sean*
1) "sean::age"
2) "sean::name"
127.0.0.1:16379> hset sean name zjj
(integer) 1
127.0.0.1:16379> hmset sean age 18 adress shanghai
OK
127.0.0.1:16379> HGET sean name
"zjj"
127.0.0.1:16379> HGET sean age
"18"
127.0.0.1:16379> HGET sean adress
"shanghai"
hget 根据key 获取
127.0.0.1:16379> HMGET sean name age
1) "zjj"
2) "18"
hkeys 获取所有key
127.0.0.1:16379> hkeys sean
1) "name"
2) "age"
3) "adress"
hvalue 获取所有value
127.0.0.1:16379> HVALS sean
1) "zjj"
2) "18"
3) "shanghai"
获取所有参数
127.0.0.1:16379> HGETALL sean
1) "name"
2) "zjj"
3) "age"
4) "18"
5) "adress"
6) "shanghai"

127.0.0.1:16379> HINCRBYFLOAT sean age 0.5
"18.5"
127.0.0.1:16379> HGET sean age
"18.5"
这里报错是因为前面已经是float,无法进行整数加减
127.0.0.1:16379> HINCRBY sean age -1
(error) ERR hash value is not an integer
127.0.0.1:16379> HINCRBYFLOAT sean age -1
"17.5"

Set

set 无序,去重
list 是有序的,可以有重复的

参考java
redis 里面使用set SMEMBERS 会消耗redis 所在主机的网卡吞吐量

SADD key member [member ...] 向集合中添加一个或多个成员
SPOP key [count] 从集合中移除并返回一个或多个随机成员
SREM key member [member ...] 从集合中删除一个或多个成员
SDIFF key [key ...] 方向性地求差集
SUNION key [key ...] 多个set求并集
SINTER key [key ...] 多个set取交集
SDIFFSTORE destination key [key ...] 减去多个集合并将结果集存储在一个键中
SINTERSTORE destination key [key ...] 交叉多个集合并将结果集存储在一个键中
SISMEMBER key member 确定给定值是否是集合的成员
SMEMBERS key 获取集合中的所有成员   
SCARD key 获取集合中的成员数
SMOVE source destination member 将成员从一个集合移动到另一个集合
SRANDMEMBER key [count] 从集合中随机获取一个或多个成员
						count是正数:取出一个不重复的结果集(不能超过已有集)
						count是负数:取出一个有可能重复的结果集(一定满足你要求的数量)
						人多于奖品/奖品多于人/可以重复/不能重复 不同的场景
		
SSCAN key cursor [MATCH pattern] [COUNT count]
SUNIONSTORE destination key [key ...] 添加多个集合并将结果集存储在一个键中

                   对tom 进行去重
127.0.0.1:16379> sadd k1 tom sean peter ooxx tom xxoo
(integer) 5
127.0.0.1:16379> SMEMBERS k1
1) "ooxx"
2) "tom"
3) "xxoo"
4) "sean"
5) "peter"
                   删除
127.0.0.1:16379> sadd k1 tom sean peter ooxx tom xxoo
(integer) 5
127.0.0.1:16379> SMEMBERS k1
1) "ooxx"
2) "tom"
3) "xxoo"
4) "sean"
5) "peter"
                 取出交集
127.0.0.1:16379> sadd k2 1 2 3 4 5
(integer) 5
127.0.0.1:16379> sadd k3 4 5 6 7 8
(integer) 5
127.0.0.1:16379> SINTER k2 k3
1) "4"
2) "5"
                 新生成数据集
127.0.0.1:16379> SINTERSTORE dest k2 k3
(integer) 2
127.0.0.1:16379> SMEMBERS dest
1) "4"
2) "5"
127.0.0.1:16379> SUNION k2 k3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
               去除并集 他也有SUNIONSTORE
127.0.0.1:16379> SUNION k2 k3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
               方向性地求差集
127.0.0.1:16379> SDIFF k2 k3
1) "1"
2) "2"
3) "3"
127.0.0.1:16379> SDIFF k3 k2
1) "6"
2) "7"
3) "8"

127.0.0.1:16379> sadd k1 tom ooxx xxoo xoxo oxox xoox oxxo
(integer) 7
127.0.0.1:16379> SRANDMEMBER k1 3
1) "xxoo"
2) "ooxx"
3) "tom"
127.0.0.1:16379> SRANDMEMBER k1 -3
1) "xoox"
2) "ooxx"
3) "ooxx"
                   弹出一个随机成员
127.0.0.1:16379> SPOP k1
"oxxo"
127.0.0.1:16379> SPOP k1
"xoxo"
127.0.0.1:16379> SPOP k1
"tom"
127.0.0.1:16379> SPOP k1
"oxox"
127.0.0.1:16379> SPOP k1
"xoox"
127.0.0.1:16379> SPOP k1
"ooxx"
127.0.0.1:16379> SPOP k1
"xxoo"
127.0.0.1:16379> SPOP k1

在这里插入图片描述

sorted_set

help @sorted_set

BZPOPMAX key [key ...] timeout 删除并返回得分最高的成员从一个或多个sorted set,或阻塞,直到一个是可用的
BZPOPMIN key [key ...] timeout 删除并返回分数最低的成员从一个或多个sorted set,或阻塞,直到一个是可用的
ZADD key [NX|XX] [CH] [INCR] score member [score member ...] 向sorted set中添加一个或多个成员,如果已经存在,则更新其分数
ZCARD key 获取sorted set中的成员数
ZCOUNT key min max 在给定值内对sorted set中的成员进行计数
ZINCRBY key increment member 递增sorted set中成员的分数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] 交叉多个sorted set,并将结果sorted set存储在一个新的键中
ZLEXCOUNT key min max 计算给定字典法范围之间sorted set中的成员数
ZPOPMAX key [count] 删除并返回sorted set中得分最高的成员
ZPOPMIN key [count] 删除并返回sorted set中得分最低的成员
ZRANGE key start stop [WITHSCORES] Return a range of members in a sorted set, by index 按索引返回sorted set中成员的范围
ZRANGEBYLEX key min max [LIMIT offset count] 按分数返回sorted set中的成员范围
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 按分数返回sorted set中的成员范围
ZRANK key member 确定sorted set中成员的索引
ZREM key member [member ...] 从sorted set中移除一个或多个成员
ZREMRANGEBYLEX key min max 删除给定字典排序范围之间sorted set中的所有成员
ZREMRANGEBYRANK key start stop 删除给定索引内sorted set中的所有成员
ZREMRANGEBYSCORE key min max 删除sorted set中给定分数内的所有成员
ZREVRANGE key start stop [WITHSCORES] 按索引返回sorted set中成员的范围,分数从高到低排序
ZREVRANGEBYLEX key max min [LIMIT offset count] 按字典顺序从较高的字符串到较低的字符串,返回sorted set中的成员的范围。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 按分数返回sorted set中的成员范围,分数从高到低排序
ZREVRANK key member 确定sorted set中成员的索引,分数从高到低排序
ZSCAN key cursor [MATCH pattern] [COUNT count] 递增迭代sorted set元素和相关分数
ZSCORE key member 获取sorted set中与给定成员相关的分数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] 多个sorted set求并集,分数相同时,将分数取最大/最小/平均,并将结果sorted set存储到一个新键中

基本操作

127.0.0.1:16379> zadd k1 8 apple 2 banana 3 orange
(integer) 3
127.0.0.1:16379> Zrange k1 0 -1
1) "banana"
2) "orange"
3) "apple"
127.0.0.1:16379> Zrange k1 0 -1 withscores
1) "banana"
2) "2"
3) "orange"
4) "3"
5) "apple"
6) "8"
127.0.0.1:16379> 
127.0.0.1:16379> ZRANGEBYSCORE k1 3 8
1) "orange"
2) "apple"
                  前两位
127.0.0.1:16379> ZREVRANGE k1 0 1
1) "apple"
2) "orange"
                 后两位
127.0.0.1:16379> ZREVRANGE k1 -2 -1
1) "orange"
2) "banana"
                     峰值
127.0.0.1:16379> ZSCORE k1 apple
"8"
                      排名
127.0.0.1:16379> Zrank k1 apple
(integer) 2
                      增加2。5数值
127.0.0.1:16379> ZINCRBY k1 2.5 banana
"4.5"
127.0.0.1:16379> ZRANGE k1 0 -1
1) "orange"
2) "banana"
3) "apple"
127.0.0.1:16379> ZRANGE k1 0 -1 withscores
1) "orange"
2) "3"
3) "banana"
4) "4.5"
5) "apple"
6) "8"

127.0.0.1:16379> zadd k1 80 tom  60 sean 70 baby
(integer) 3
127.0.0.1:16379> zadd k2 60 tom 100 sean 40 yiming
(integer) 3
                 两个sorted_set合并
127.0.0.1:16379> ZUNIONSTORE unkey 2 k1 k2
(integer) 4
127.0.0.1:16379> 
                  两个sorted_set合并
127.0.0.1:16379> ZRANge unkey 0 -1 withscores
1) "yiming"
2) "40"
3) "baby"
4) "70"
5) "tom"
6) "140"
7) "sean"
8) "160"
                  两个sorted_set合并,后面的0.5 是k2 乘上0.5
127.0.0.1:16379> ZUNIONSTORE unkey1 2 k1 k2 weights 1 0.5
(integer) 4
127.0.0.1:16379> ZRANGE unkey1 0 -1 withscores
1) "yiming"
2) "20"
3) "baby"
4) "70"
5) "sean"
6) "110"
7) "tom"
8) "110"
           
127.0.0.1:16379> ZUNIONSTORE unkey1 2 k1 k2 aggregate max
(integer) 4
127.0.0.1:16379> ZRANGE unkey 0 -1
1) "yiming"
2) "baby"
3) "tom"
4) "sean"
                带上峰值查看
127.0.0.1:16379> ZRANGE unkey 0 -1 withscores
1) "yiming"
2) "40"
3) "baby"
4) "70"
5) "tom"
6) "140"
7) "sean"
8) "160"

在这里插入图片描述

跳跃表

排序是怎么实现的,增删改查的速度为什么这么快?
答:使用skiplist跳跃表。

对比链表,从前往后依次查询,随着数据量增大,性能下降。
跳跃表,是多层的链表。一个元素可能出现在多层中。从高层往低层查,牺牲空间换性能。
插入后,随机造层,为后来的查询加速。
平衡树。
数据量少的时候,可能没有链表速度快,也可能量少的时候不用跳跃表。数量到一定程度再从链表换成跳跃表。跳跃表在数量不断增大的情况下,可以保持速度比较平衡稳定。而链表在数量不断增大时,速度会下降。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值