redis数据结构
五种数据类型:
- 字符串<String>
- 哈希<Hash>
- 字符串列表<List>
- 字符串集合<Set>
- 有序字符串集合<Sorted Set>
[redis数据结构--String]
存储String
- 二进制安全的,存入和获取的数据相同
- value最多可以容纳的数据长度时512M
存储String常用命令
赋值 set key value
取值 get key
删除 del key
数值增减 incr key | decr key | incrby key num | decrby key num
扩展命令 append key str(拼接字符串)
示例
# 赋值
127.0.0.1:6379> set name zhangsan
OK
# 取值
127.0.0.1:6379> get name
"zhangsan"
# 取值后重新赋值
127.0.0.1:6379> getset name lisi
"zhangsan"
127.0.0.1:6379> get name
"lisi"
# 删除
127.0.0.1:6379> del name
(integer) 1
# 指定key的数值增加1,若key不存在,初始化为0,再做加操作
127.0.0.1:6379> incr num1
(integer) 1
127.0.0.1:6379> get num1
"1"
# 指定key的值减少1,若key不存在,初始化为0,再做减操作
127.0.0.1:6379> decr num2
(integer) -1
127.0.0.1:6379> get num2
"-1"
# 指定key的值增加指定的数值,若key不存在,初始化为0,再做加操作
127.0.0.1:6379> incrby num 5
(integer) 6
# 指定key的值减少指定的数值,若key不存在,初始化为0,再做再做减操作
127.0.0.1:6379> decrby num 3
(integer) 3
# 拼接字符串,返回字符串的长度
127.0.0.1:6379> append num 5
(integer) 2
127.0.0.1:6379> get num
"35"
[redis数据结构--Hash]
存储Hash
- String key和String value的map容器
- 每一个Hash可以存储4294967295个键值对
示例
# 给指定key赋值一个键值对
127.0.0.1:6379> hset myhash username jack
(integer) 1
127.0.0.1:6379> hset myhash age 18
(integer) 1
# 给指定key赋值多个键值对
127.0.0.1:6379> hmset myhash2 username jim age 20
OK
# 获取myhash里username的值
127.0.0.1:6379> hget myhash username
"jack"
# 获取myhash里多个键值对的值
127.0.0.1:6379> hmget myhash2 username age
1) "jim"
2) "20"
# 获取myhash里所有属性以及属性的值
127.0.0.1:6379> hgetall myhash
1) "username"
2) "jack"
3) "age"
4) "18"
# 删除myhash里的username和age属性
127.0.0.1:6379> hdel myhash username age
(integer) 2
# 删除myhash2整体
127.0.0.1:6379> del myhash2
(integer) 1
127.0.0.1:6379> hset hash age 18
(integer) 1
# hash里的age数值增加5
127.0.0.1:6379> hincrby hash age 5
(integer) 23
# 判断hash中username是否存在,1为存在,0为不存在
127.0.0.1:6379> hexists hash username
(integer) 0
# 获取hash内属性的数量
127.0.0.1:6379> hlen hash
(integer) 1
#获取hash内所有的key
127.0.0.1:6379> hkeys hash
1) "age"
# 获取hash内所有的值
127.0.0.1:6379> hvals hash
1) "23"
[redis数据结构--List]
存储list
- ArrayLis使用数组方式
- LinkedList使用双向链接方式
- 双向链表中增加数据
- 双向链表中删除数据
示例
# 往链表左侧添加元素
127.0.0.1:6379> lpush list a b c
(integer) 3
# 往链表右侧添加元素
127.0.0.1:6379> rpush list 1 2 3
(integer) 6
# 查看list中所有的元素
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
# 弹出最左侧元素,弹出后该元素从list中移除
127.0.0.1:6379> lpop list
"c"
# 弹出最右侧元素,弹出后该元素从list中移除
127.0.0.1:6379> rpop list
"3"
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "a"
3) "1"
4) "2"
# 获取list中元素的个数
127.0.0.1:6379> llen list
(integer) 4
# key存在才插入,往链表左侧添加元素
127.0.0.1:6379> lpushx list x
(integer) 5
# key存在才插入,往链表右侧添加元素
127.0.0.1:6379> rpushx list y
(integer) 6
# 从左往右删除2个3
127.0.0.1:6379> lrem list2 2 3
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "2"
2) "1"
3) "2"
4) "1"
5) "3"
6) "2"
7) "1"
# 从右往左删除2个1
127.0.0.1:6379> lrem list2 -2 1
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "2"
2) "1"
3) "2"
4) "3"
5) "2"
# 删除list2里所有的2
127.0.0.1:6379> lrem list2 0 2
(integer) 3
其他命令
127.0.0.1:6379> lpush mylist a b c a b c
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
4) "c"
5) "b"
6) "a"
# 在mylist第三个角标处插入mmm
127.0.0.1:6379> lset mylist 3 mmm
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
4) "mmm"
5) "b"
6) "a"
# 在第一个b前插入11
127.0.0.1:6379> linsert mylist before b 11
(integer) 7
# 在第一个b后插入22
127.0.0.1:6379> linsert mylist after b 22
(integer) 8
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "11"
3) "b"
4) "22"
5) "a"
6) "mmm"
7) "b"
8) "a"
127.0.0.1:6379> lpush mylist2 1 2 3
(integer) 6
# 弹出mylist右侧元素,插入到mylist2左侧
127.0.0.1:6379> rpoplpush mylist mylist2
"a"
[redis数据结构--Set]
存储Set
- 和List类型不同的是,Set集合中不允许出现重复的元素
- Set可包含的最大元素数量是4294967295
使用场景
- 跟踪一些唯一性数据
- 用于维护数据对象之间的关联关系
常用命令
添加/删除/元素
# 往set1中添加元素a,b,c
127.0.0.1:6379> sadd set1 a b c
(integer) 3
# 删除set1中的a,b元素
127.0.0.1:6379> srem set1 a b
(integer) 2
获得集合中的元素
# 获取set1中的元素
127.0.0.1:6379> smembers set1
1) "c"
# 判断是否为set1中的元素,1为是,0为否
127.0.0.1:6379> sismember set1 a
(integer) 0
127.0.0.1:6379> sismember set1 c
(integer) 1
集合中的差集运算
# 差集运算,与元素顺序有关
127.0.0.1:6379> sadd mya1 a b c
(integer) 3
127.0.0.1:6379> sadd myb1 a c 1 2
(integer) 4
127.0.0.1:6379> sdiff mya1 myb1
1) "b"
# 把差集运算所得集合存到 my1中
127.0.0.1:6379> sdiffstore my1 mya1 myb1
(integer) 1
集合中的交集运算
# 交集运算,返回两个集合都有的元素
127.0.0.1:6379> sadd mya2 a b c
(integer) 3
127.0.0.1:6379> sadd myb2 a c 1 2
(integer) 4
127.0.0.1:6379> sinter mya2 myb2
1) "a"
2) "c"
# 交集运算所得存到 my2中
127.0.0.1:6379> sinterstore my2 mya2 myb2
(integer) 2
集合中的并集运算
# 合拼集合
127.0.0.1:6379> sadd mya3 a b c
(integer) 3
127.0.0.1:6379> sadd myb3 a c 1 2
(integer) 4
127.0.0.1:6379> sunion mya3 myb3
1) "2"
2) "c"
3) "a"
4) "b"
5) "1"
# 并集运算所得存到 my3中
127.0.0.1:6379> sunionstore my3 mya3 myb3
(integer) 5
其他命令
127.0.0.1:6379> sadd myset a b c 1 2 3
(integer) 6
# 返回集合中元素的数量
127.0.0.1:6379> scard myset
(integer) 6
# 随机返回集合中某个元素
127.0.0.1:6379> srandmember myset
"2"
[redis数据结构--Sorted-Set]
存储Sorted-Set
- Sorted-Set 和 Set的区别:Sorted Set中的每个元素都关联一个可重复的分数(score),这便是排序的依据。
- Sorter-Set中的成员在集合中的位置是有序的
使用场景
- 如大型在线游戏积分排行榜
- 构建索引数据
常用命令
添加元素
# 70 80 90 是score
127.0.0.1:6379> zadd mysort 70 zhangsan 80 lisi 90 wangwu
(integer) 3
# 添加时,若元素已存在,则更新分数
127.0.0.1:6379> zadd mysort 100 zhangsan
(integer) 0
获得元素
# 获得zhangsan的分数
127.0.0.1:6379> zscore mysort zhangsan
"100"
# 获得集合中元素的数量
127.0.0.1:6379> zcard mysort
(integer) 3
删除元素
# 删除元素zhangsan
127.0.0.1:6379> zrem mysort zhangsan
(integer) 1
范围查询
127.0.0.1:6379> zadd mysort 85 jack 95 jim 100 rose
(integer) 3
# 范围查询,分数升序排列
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "jack"
3) "wangwu"
4) "jim"
5) "rose"
# 带分数范围查询,分数升序排列
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "lisi"
2) "80"
3) "jack"
4) "85"
5) "wangwu"
6) "90"
7) "jim"
8) "95"
9) "rose"
10) "100"
# 带分数范围查询,分数降序排列
127.0.0.1:6379> zrevrange mysort 0 -1 withscores
1) "rose"
2) "100"
3) "jim"
4) "95"
5) "wangwu"
6) "90"
7) "jack"
8) "85"
9) "lisi"
10) "80"
# 范围删除
127.0.0.1:6379> zremrangebyrank mysort 0 4
(integer) 5
127.0.0.1:6379> zadd mysort 80 zs 90 ls 100 ws
(integer) 3
# 分数范围删除
127.0.0.1:6379> zremrangebyscore mysort 80 100
(integer) 3
其他命令
127.0.0.1:6379> zadd mysort 70 zs 80 li 90 ww
(integer) 3
# 范围查询0到100分
127.0.0.1:6379> zrangebyscore mysort 0 100
1) "zs"
2) "li"
3) "ww"
# 带分数范围查询0到100分
127.0.0.1:6379> zrangebyscore mysort 0 100 withscores
1) "zs"
2) "70"
3) "li"
4) "80"
5) "ww"
6) "90"
# 带分数范围查询0到100分,角标范围为0到2
127.0.0.1:6379> zrangebyscore mysort 0 100 withscores limit 0 2
1) "zs"
2) "70"
3) "li"
4) "80"
# 指定成员li分数增加3
127.0.0.1:6379> zincrby mysort 3 li
"83"
# 返回集合中分数范围在80到90的成员个数
127.0.0.1:6379> zcount mysort 80 90
(integer) 2