Redis笔记-5种数据结构与操作
- Redis 支持5种数据结构与操作
- 示例操作
- 一:String
- 二:LIST
- 1) 左边(头)添加值 (lpush [list] [value] [value] [value] )
- 2) 右边(尾)添加值 (rpush [list] [value] )
- 3)获取值 (lindex [list] [index] )
- 4)移出并获取列表的第一个元素 (lpop [list [index] )
- 5)移出并获取列表的最后一个元素 (rpop [list] [index] )
- 6)获取长度 (llen [list] [index] )
- 7)移除值 (lrem [list] [count] [value] )
- 8)移除列表的最后一个元素,并将该元素添加到另一个列表并返回 ( rpoplpush [source] [destination] )
- 9)从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 ( brpoplpush [source] [destination] [expire(秒)])
- 10)赋值 ( lset [list] [index] [value])
- 三:SET
- 1)赋值 ( sadd [set] [value1] [value2] [value3]) ,多个值 以空格隔开
- 2)随机弹出 ( spop [set] [count])
- 2)获取集合数量 (scard [set])
- 3)获取所有元素 ( smembers [set] )
- 4)获取集差( sdiff [set1] [set2] )
- 5)获取指定所有集合的交集 (sinter [set] [set2] [set3] )
- 6)获取并集( sunion [set] [set] [set] )
- 7)获取并集 并存到目标集合 (sunion [destination set] [set1] [set2] )
- 8)移动(smove [source][destination] [value] )
- 9)删除( srem [source] [destination] [value] )
- 四:HASH
- 1)赋值 (hset [table] [key] [value] )
- 2)多个赋值 ( hmset [table] [col1] [value1] [col2] [value2] )
- 3)获取表指定字段 (hget [table] [col])
- 4)获取表多个指定字段 (hmget [表] [col1] [col2] [col3] )
- 5)获取所有字段与值 (hgetall [table] )
- 6)获取所有字段名 ( hkeys [table] )
- 7)获取所有值 ( hvals [table] )
- 8)获取长度 ( hlen [table] )
- 9)删除值 ( hdel [table] [col1] [col2] )
- 10)字段自增( hincrby [table] [col] [num] )
- 五:ZSET
- 1)新增 (zadd [set] [score] [member] )
- 2)获取成员数 ( zcard [member] )
- 3)获取区间成员数量 ( zcount [set] [start score] [end score])
- 4)返回指定区间成员 zrange[set] [num] [member]
- 5)自增 ( zrange [set ] [index start] [index end] )
- 6)通过字典区间返回有序集合的成员 ( zrangebylex [set] [min] [max] )
- 7)通过分数区间返回有序集合的成员 ( zrangebyscore [set] [score start] [score end] )
- 8) 获取成员索引 zrank ( [set] [member] )
- 9) 删除成员 ( zrem [set] [member] )
- 10) 删除成员 ( zrem [set] [member] )
- 11) 移除有序集合中给定的排名区间的所有成员 ( zremrangebyscore [set] [start score] [end score] )
- 12) 移除有序集合中给定的排名区间的所有成员 (zremrangerank [set] [star] [end])
- 13) 获取指定排序的成员 ( zrevrange [set] [start index] [end index])
- 总结
Redis 支持5种数据结构与操作
结构类型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
String | 可以是字符串、整数或者是字符串 | 对字符串操作,整数自增,自减 |
LIST | 链表,链表的每个节点都包含一个字符串 | 链表两端推入节点插入,删除; 根据偏移量进行修剪(trim); 读取单个或多个元素; 根据值查找或移除节点; |
SET | 集合,无序,唯一 。对应: List < String > | 添加,删除,获取,判断是否存在; 计算交集、并集、差集; 随机获取一元素; |
HASH | 键值对,无序,key唯一 对应 HashMap<String,String> | 添加,获取,移除单个键值; 获取整个键值对 |
ZSET | 键(member)值(score)对,有序,根据 值(score)的大小进行排序 | 添加,获取,删除; 根据范围(Range)获取成员 |
示例操作
一:String
1)添加(set [key] [值] ,key存在时,则更新)
127.0.0.1:6379> set name1 richy
OK
2)查看(get [key] )
127.0.0.1:6379> get name1
“richy”
3)删除(del [key])
127.0.0.1:6379> del name1
(integer) 1
4)更改 (getset [key] )
127.0.0.1:6379> getset name1 richyliu
“richy”
PS:key不存在时,自动创建,并返回旧值感觉跟set实际是一个样。。
5)获取多个值(mget)
127.0.0.1:6379> mget name1 name2
- “richyliu2”
- “wa”
6)将值加到后面 (append [key] [value])
127.0.0.1:6379> append name2 liu
(integer) 5
7)获取字符长度 (strlen [key])
127.0.0.1:6379> strlen name1
(integer) 9
PS:返回值为最终字符串长度
8)数值加 (incr [key])
127.0.0.1:6379> incr age1
(integer) 11
PS:返回值为最终值
9)数值加 (decr [key])
127.0.0.1:6379> decr age1
(integer) 10
PS:返回值为最终值
PS: 还有不少不怎么常用的,比如:字符偏移量(getbit),浮点自增(减),所有值自增(减)等,想得到的基本上都有对应的命令。下面类型也是一样,不再复述
二:LIST
1) 左边(头)添加值 (lpush [list] [value] [value] [value] )
127.0.0.1:6379> lpush l1 richy
(integer) 1
PS:LIST不存在时创建,如果有多个值 ,以空格隔开 ,多个值时 index 排在最后的最靠前,如下:
127.0.0.1:6379> lpush l3 a b c d e f
(integer) 6
127.0.0.1:6379> lindex l3 0
“f”
2) 右边(尾)添加值 (rpush [list] [value] )
127.0.0.1:6379> rpush l8 richy
(integer) 3
127.0.0.1:6379> lindex l8 2
“richy”
127.0.0.1:6379>
3)获取值 (lindex [list] [index] )
127.0.0.1:6379> lindex l1 0
“richy”
4)移出并获取列表的第一个元素 (lpop [list [index] )
127.0.0.1:6379> lpop l1
“richy”
5)移出并获取列表的最后一个元素 (rpop [list] [index] )
127.0.0.1:6379> rpop l1
“richy”
6)获取长度 (llen [list] [index] )
127.0.0.1:6379> llen l3
(integer) 6
7)移除值 (lrem [list] [count] [value] )
127.0.0.1:6379> lpush l3 e e e e e e e e
(integer) 8
127.0.0.1:6379> lrem l3 3 e
(integer) 3
127.0.0.1:6379> lrem l3 3 e
(integer) 3
127.0.0.1:6379> lrem l3 3 e
(integer) 2
PS:返回值为移除掉的数量
8)移除列表的最后一个元素,并将该元素添加到另一个列表并返回 ( rpoplpush [source] [destination] )
127.0.0.1:6379> lpush l4 1 2 3 4 5
(插入后实际顺序是:5 4 3 2 1 )前面有讲到
(integer) 5
127.0.0.1:6379> rpoplpush l4 l5(第一次)
“1”
127.0.0.1:6379> llen l4
(integer) 4
127.0.0.1:6379> llen l5
(integer) 1
127.0.0.1:6379> rpoplpush l4 l5(第二次)
“2”
127.0.0.1:6379> llen l4
(integer) 3
127.0.0.1:6379> llen l5
(integer) 2
127.0.0.1:6379> lindex l5 0
“2”
127.0.0.1:6379>
PS:通过两次的插入实践证明这个逻辑:从l4取出第1个值 插入l5的最后。 l4数量减少,l5数量增加
9)从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 ( brpoplpush [source] [destination] [expire(秒)])
127.0.0.1:6379> lpush l6 1 2 3
#插入3个元素, 顺序为 3 2 1
(integer) 3
127.0.0.1:6379> brpoplpush l6 l7 10第一次,取l6最后一元素,插入l7头部
“1”
127.0.0.1:6379> brpoplpush l6 l7 10第二次
“2”
127.0.0.1:6379> lindex l7 0
“2”
127.0.0.1:6379> brpoplpush l6 l7 10第三次
“3”
127.0.0.1:6379> brpoplpush l6 l7 10第四次,因为没有元素,进入等待
(nil)
(10.03s)
10)赋值 ( lset [list] [index] [value])
127.0.0.1:6379> lset l8 0 abc
OK
三:SET
1)赋值 ( sadd [set] [value1] [value2] [value3]) ,多个值 以空格隔开
127.0.0.1:6379> sadd s1 1 2 3
(integer) 3
2)随机弹出 ( spop [set] [count])
127.0.0.1:6379> spop s1 2
“2”
“3”
127.0.0.1:6379> spop s1 1
“1”
127.0.0.1:6379> spop s1 1
(empty list or set)
2)获取集合数量 (scard [set])
127.0.0.1:6379> scard s1
(integer) 3
3)获取所有元素 ( smembers [set] )
127.0.0.1:6379> smembers s1
1 ) “c”
2 ) “b”
3 ) “a”
4)获取集差( sdiff [set1] [set2] )
127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> sadd s2 c d e f
(integer) 4
127.0.0.1:6379> sdiff s1 s2
1 ) “b”
2 ) “a”
5)获取指定所有集合的交集 (sinter [set] [set2] [set3] )
127.0.0.1:6379> sinter s1 s2
1 ) “c”
6)获取并集( sunion [set] [set] [set] )
127.0.0.1:6379> sunion s1 s2
1 ) “a”
2 ) “f”
3 ) “e”
4 ) “c”
5 ) “d”
6 ) “b”
7)获取并集 并存到目标集合 (sunion [destination set] [set1] [set2] )
127.0.0.1:6379> 127.0.0.1:6379> sunionstore s3 s1 s2
(integer) 6
127.0.0.1:6379> smembers s3
1 ) “a”
2 ) “f”
3 ) “e”
4 ) “c”
5 ) “d”
6 ) “b”
8)移动(smove [source][destination] [value] )
127.0.0.1:6379> smove s3 s4 a
(integer) 1PS:1 移动个数
9)删除( srem [source] [destination] [value] )
127.0.0.1:6379> srem s1 g
(integer) 1删除个数
四:HASH
1)赋值 (hset [table] [key] [value] )
127.0.0.1:6379> hset h1 name richy
#当集合不存在时则创建集合再赋值
(integer) 1
127.0.0.1:6379> hset h1 age 18
(integer) 1
127.0.0.1:6379> hset h1 addr guanzhou
(integer) 1
2)多个赋值 ( hmset [table] [col1] [value1] [col2] [value2] )
127.0.0.1:6379> hmset h2 name wa age 17 addr guangzhou
OK
3)获取表指定字段 (hget [table] [col])
127.0.0.1:6379> hget h2 name
“wa”
4)获取表多个指定字段 (hmget [表] [col1] [col2] [col3] )
127.0.0.1:6379> hmget h1 name age
1 ) “richy”
2 ) “18”
5)获取所有字段与值 (hgetall [table] )
127.0.0.1:6379> hgetall h1
1 ) “name”
2 ) “richy”
3 ) “age”
4 ) “18”
5 ) “addr”
6 ) “guanzhou”
6)获取所有字段名 ( hkeys [table] )
127.0.0.1:6379> hkeys h1
1 ) “name”
2 ) “age”
3 ) “addr”
7)获取所有值 ( hvals [table] )
127.0.0.1:6379> hvals h2
1 ) “wa”
2 ) “17”
3 ) “guangzhou”
8)获取长度 ( hlen [table] )
127.0.0.1:6379> hlen h1
(integer) 3
9)删除值 ( hdel [table] [col1] [col2] )
127.0.0.1:6379> hdel h1 age name
(integer) 2
10)字段自增( hincrby [table] [col] [num] )
127.0.0.1:6379> hincrby h2 age 1
(integer) 18
127.0.0.1:6379> hincrby h2 age 1
(integer) 19
127.0.0.1:6379> hincrby h2 age 2
(integer) 21
127.0.0.1:6379> hincrby h2 age -2
(integer) 19
五:ZSET
1)新增 (zadd [set] [score] [member] )
127.0.0.1:6379> zadd z1 100 richy
(integer) 1
127.0.0.1:6379> zadd z1 90 wa
(integer) 1
2)获取成员数 ( zcard [member] )
127.0.0.1:6379> zcard z1
(integer) 2
3)获取区间成员数量 ( zcount [set] [start score] [end score])
127.0.0.1:6379> zcount z1 1 100
(integer) 2
4)返回指定区间成员 zrange[set] [num] [member]
127.0.0.1:6379> zrange z1 1 100
1 ) “richy”
5)自增 ( zrange [set ] [index start] [index end] )
127.0.0.1:6379> zrange z1 0 10
1 ) “wa”
2 ) “richy”
6)通过字典区间返回有序集合的成员 ( zrangebylex [set] [min] [max] )
127.0.0.1:6379> zrangebylex z1 - [wa
# [ 表示 闭区间 ,( 表示开区间
1 ) “wa”
2 ) “richy”
7)通过分数区间返回有序集合的成员 ( zrangebyscore [set] [score start] [score end] )
127.0.0.1:6379> zrangebyscore z1 200 400
1 ) “rui”
8) 获取成员索引 zrank ( [set] [member] )
127.0.0.1:6379> zrank z1 richy
(integer) 1
9) 删除成员 ( zrem [set] [member] )
127.0.0.1:6379> zrem z1 rui
(integer) 1
10) 删除成员 ( zrem [set] [member] )
127.0.0.1:6379> zrem z1 rui
(integer) 1
11) 移除有序集合中给定的排名区间的所有成员 ( zremrangebyscore [set] [start score] [end score] )
先插入点数据先
127.0.0.1:6379> zadd z1 120 a 110 b 130 c 140 d
(integer) 4
127.0.0.1:6379> zcard z1
(integer) 6
127.0.0.1:6379> zrangebyscore z1 0 1000
1 ) “wa”
2 ) “b”
3 ) “a”
4 ) “richy”
5 ) “c”
6 ) “d”
测试
127.0.0.1:6379> zremrangebyscore z1 100 120
(integer) 3
12) 移除有序集合中给定的排名区间的所有成员 (zremrangerank [set] [star] [end])
127.0.0.1:6379> zadd z2 120 a 110 b 130 c 140 d
(integer) 4
127.0.0.1:6379> zremrangebyrank z2 0 1
(integer) 2
PS: 如果 [end] 是负数,即表示删除 排名在【end】之外的成员
, 见以下示例
127.0.0.1:6379> zscan z1 0
# 列出所有元素
1 ) “0”
2 ) 1) “k5”
2) “6”
3) “k2”
4) “10”
5) “k3”
6) “10”
7) “k4”
8) “10”
9) “k1”
10 ) “99”
127.0.0.1:6379> zremrangebyrank z1 0 -4#删除最后排名在 4之后(包括4)
(integer) 2
127.0.0.1:6379> zscan z1 0#操作后结果
1 ) “0”
2 ) 1) “k3”
2 ) “10”
3 ) “k4”
4 ) “10”
5 ) “k1”
6 ) “99”
13) 获取指定排序的成员 ( zrevrange [set] [start index] [end index])
127.0.0.1:6379> zadd z3 120 a 110 b 130 c 140 d 50 f
(integer) 5
127.0.0.1:6379> zrevrange z3 0 10
1 ) “d”
2 ) “c”
3 ) “a”
4 ) “b”
5 ) “f”
总结
五种结构的常用操作都一 一试过。实际上每一种结构都有各自特定的使用场景,不同的结构对应的指令侧重点也不同。
STRING 侧重于字符的操作。
LIST 侧重于插入的顺序,使用起来更像是队列
SET 侧试重于集合的计算,交集,并集,差集
HASH 侧试重于 键值对 使用,可以当成二维表的一段记录来用。
ZSET 侧重于排序。