redis命令与数据结构

90 阅读6分钟

一、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自付出后存储,当需要修改时很不方便。

image.png

hash就是将对象中的每个字段单独存储,可针对单个字段进行CRUD

image.png

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 并集

image.png

练习:

将下列数据用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分一下的同学