一、Redis数据结构介绍
1.1 数据类型
redis是一个键值数据库(key-value),key一般是字符串,不过value的类型多种多样:
- String hello word
- Hash {name:"bob",age:"11"}
- List [A->B->C-C]
- Set {A,B,C}
- SortedSet{A:1,B:2,C:3}
- GEO {A:{120.3,30.5}}
- BitMap 01101101010100111
- HyperLog 01101101011101011
1.2 通用命令
查询官方文档即可使用一些通用命令
- KEYS: 查看符合模版的所有key 后面跟类似正则的表达式,不建议生产使用
127.0.0.1:6379> keys **
(empty array)
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> help keys
KEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic
127.0.0.1:6379> keys a*
(empty array)
127.0.0.1:6379>
- DEL 删除KEY
127.0.0.1:6379> mset k1 k2 k3 k4
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys
(error) ERR wrong number of arguments for 'keys' command
127.0.0.1:6379> keys *
1) "k3"
127.0.0.1:6379> help del
DEL key [key ...]
summary: Delete a key
since: 1.0.0
group: generic
- EXISTS 判断key 是否存在
- EXPIRE 给一个key设置有效期,到期会自动删除key
- TTL 查看key的存在时间
127.0.0.1:6379> expire k1 20
(integer) 0
#返回值-2表示已经超过有效期
127.0.0.1:6379> ttl k1
(integer) -2
#返回值-1 表示永久有效
127.0.0.1:6379> ttl k3
(integer) -1
1.3 String类型
1.3.1 介绍
字符串,最简单的存储类型。 其value是字符串,不过根据字符串格式的不同,又可以分3类:
- String 普通字符串 helloword
- int 整数类型,可以做自增、自减操作 10
- float 浮点形,可以做自增、自减操作 92.5
不管是哪种格式,底层都是字节数组形式存储,知识编码方式不同,字符串的最大空间不能超过512m。
1.3.2 String类型常见的命令
String的常见命令有:
- SET 添加或修改 k-v
- GET 获取value
- MSET 批量添加k-v
- MGET 批量获取
- INCR 整型自增1
- INCRBY 指定整型的key自增步长
- INCRBYFLOAT 浮点型指定步长
- SETNX 添加不存在的k-v,存在不执行
- SETEX 添加kv并指定有效期
1.3.3 层级结构
key的结构
redis的key允许有多个单词形成层级结构,单词之间用":"隔开
如:项目名:业务名:类型:id
存储一个对象
key value
com:user:1 {"id":1,"name":"Bob"}
#实验存入用户信息
1.4 Hash类型
1.4.1 介绍
也叫做散列,其value是一个无序字典。 String结构将对象序列化为json自付出后存储,当需要修改时很不方便。
hash就是将对象中的每个字段单独存储,可针对单个字段进行CRUD
1.4.2 常见命令
- HSET key field value 添加或修改hash类型key的filed的值
- HGET key field 获取一个hash类型的key的field的值
- HMSET 批量添加
- HMGET 批量获取
- HGETALL 获取一个hash类型的key中的所有field和value
- HKEYS 获取所有一个key中的filed
- HVALS 获取所有一个key中的value
- HINCRBY 让一个hash类型的key的字段值自增并指定步长
- HSETNX 添加一个hash类型的key的field值,前提是不存在
127.0.0.1:6379> hset com:user:1 name Bob
(integer) 1
127.0.0.1:6379> hset com:user:1 age 14
(integer) 1
127.0.0.1:6379> hget com:user:1 name
"Bob"
127.0.0.1:6379> hget com:user:1 age
"14"
127.0.0.1:6379> hmset com:user:2 name Liu age 15
OK
127.0.0.1:6379> hmget com:user:2
(error) ERR wrong number of arguments for 'hmget' command
127.0.0.1:6379> hmget com:user:2 name
1) "Liu"
127.0.0.1:6379> hmget com:user:2 agee
1) (nil)
127.0.0.1:6379> hmget com:user:2 age
1) "15"
127.0.0.1:6379> hgetall com:user:1
1) "name"
2) "Bob"
3) "age"
4) "14"
127.0.0.1:6379> hkeys com:user:1
1) "name"
2) "age"
127.0.0.1:6379> hvals com:user:1
1) "Bob"
2) "14"
127.0.0.1:6379> hincrby com:user:1 age 2
(integer) 16
127.0.0.1:6379> hincrby com:user:1 age 2
(integer) 18
127.0.0.1:6379> hincrby com:user:1 age 2
(integer) 20
127.0.0.1:6379> hsetnx com:user:1 sex 0
(integer) 1
127.0.0.1:6379> hkeys com:user:1
1) "name"
2) "age"
3)"sex"
127.0.0.1:6379>
1.5 List类型
1.5.1 介绍
redis中的List与java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索也可以支持反向检索。 特征:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,如朋友圈点赞列表,评论列表等。
1.5.2 常见命令
- LPUSH key element 向列表左侧插入一个或多个元素
- LPOP key 移除并返回列表左侧的第一个元素,没有则返回nil
- RPUSH key element 向右侧插入一个或多个元素
- RPOP key 移除并返回列表右侧的第一个元素
- LRANGE key start end 返回一段角标范围内的所有元素
- BLOPO和BRPOP 与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
1.6 Set 类型
1.6.1 介绍
redis中的set类似于java中的hashset,可以看作是一个value为null的hashmap。因为也是一个hash表,因此具备HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
1.6.2常见命令
- SADD key member ...向set中添加一个或多个元素
- SREM key member ... 移除指定的元素
- SCARD key 返回set中元素的个数
- SISMEMBER key member 判断元素是否存在
- SMEMBERS 获取所有元素
- SINTR key1 key2 求key1和key2的交集
- SDIFF key1 key2 求差集
- SUNION KEY1 KEY2 并集
练习:
将下列数据用redis的Set集合来存储:
- 张三的好友有李四、王五、赵六
- 李四的好友有王五、麻子、二狗
利用Set命令实现下列功能
- 计算张三的好友有几人
- 计算张三和李四的共同好友
- 查询哪些人是张三的好友不是李四的好友
- 查询张三和李四的好友总共有哪些人
- 判断李四是否是张三的好友
- 判断张三是否是李四的好友
- 将李四从张三的好友列表中移除
1.7 SortedSet 类型
1.7.1 介绍
redis的Sorted是一个可排序的set集合,与java中的TreeSet有些类似,但底层数据结构差别很大。SortedSet中的每一个元素都带有score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加Hash表。 特性:
- 可排序
- 元素不重复
- 查询速度快
常用来做排行榜等功能。
1.7.2 常见命令
- ZADD key score member 添加一个或多个元素到sortedset,如果已存在则更新score的值
- ZREM key member 删除指定元素
- ZSCORE key member 获取指定元素的score值
- ZRANK key member 获取指定元素的排名
- ZCARD key 获取元素个数
- ZINCRBY key 统计score值在给定范围内的个数
- ZRANGE key min max
- ZRANGEBYSCORE key min max 按照score排序后,获取指定score范围内的元素
- ZDIFF、ZINTER、ZUNION 求差集、交集、并集
降序排名在Z后面加REV
练习 将班级的下列学生得分存入redis的SortedSet中 jack 85,Lucy 89,Tom 96,Jerry 76,Amy 92,Milees 75
- 删除Tom同学
- 获取 Amy同学的分数
- 获取Rose同学的排名
- 查询80分以下有几个学生
- 给Amy同学加2分
- 查出成绩前3名的同学
- 查出成绩80分一下的同学