Redis学习总结 | 青训营

61 阅读6分钟

Redis基础

常见非关系型(NoSQL)数据库类型

  • key-value型
  • document:JSON型
  • Graph型:node+edge

数据结构

redis的key一般是String类型,但是value有很多类型

帮助文档

  • 官网的“COMMAND”目录下包含所有命令,可以分组查询相关命令
  • redis-cli客户端,通过help命令进行相关查询

通用命令

  • KEYS:查看符合模板的所有key,“模板”类似于正则表达式

    由于Redis是单线程的,而生产环境中key的数量非常多,使用该查找命令会阻塞线程。因此不建议在生产环境设备上使用

  • DEL:删除指定的key,可以一次接受多个key批量删除

    • 如果没有对应的key,则无事发生
    • 返回值为成功删除的key的个数
  • EXISTS:判断指定key是否存在,可以一次接受多个key批量判断

    返回值代表给出的key列表中,存在的个数

  • EXPIRE:给一个key设置有效期(单位是秒),有效期到期时,该key会被自动删除

    用法:expire key seconds

  • TTL:查看一个key的有效期

    • 查询结果的单位为秒
    • 返回值为-1,代表永久有效
    • 返回值为-2,代表该key不存在或已被删除

key的层级结构

Redis允许多个单词形成层级结构,多个单词间用:隔开

好处:

  • 允许不同类别中有相同id的存在
  • :使得名称有天然的层级结构,用可视化工具打开的时候会自动分包
  • 是Redis命名的一种最佳实践

1. String

  • 底层都是以字节数组的形式存储,只不过根据格式,有不同的编码方式
    • string
    • int
    • float
  • 字符串类型最大空间不能超过512M

String类型常用命令

  • SET:添加或修改String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:如果某个value是整型,可以用INCR key语句使其对应的value自增1,返回自增后的结果值
  • INCRBY:如果某个value是整型,可以用INCRBY key num语句使其对应的value自增num,返回自增后的结果值
  • INCRBYFLOAT:如果某个value是浮点数,可以用INCRBYFLOAT key num语句使其对应的value自增num,返回自增后的结果值

虽然有DECRDECRBY自减指令,但是可以用自增+负数的写法实现自减

浮点数的自增必须指定步长,浮点数也没有自减指令

  • SETNX:添加一个String类型的键值对,只有当key不存在时才会执行。即这是一个纯用来“新增”的指令,无法修改存在的键值对

    这其实是一个组合命令,与SET key value NX指令效果一样

  • SETEX:添加一个String类型的键值对,并指定有效期,语法为:SETEX key seconds value

    这也是一个组合命令,与SET key value EX seconds指令效果一样

2. Hash

又叫散列,是一个无序字典,与Java中的HashMap类似

Hash类型常用命令

  • HSET:添加或修改Hash类型的数据

    可以针对一个key,一次性批量添加或修改多个field(哈希字段名),因此HMSET已被弃用

  • HGET:根据key和field获取对应的字段值

  • HMGET:根据key和多个field获取多个对应字段值

  • HGETALL:根据key获取所有的field以及对应的字段值

  • HKEYS:根据key获取所有字段名

  • HVALS:根据key获取所有字段值

  • HINCRBY:根据key和field使对应的整型值自增指定步长,语法:HINCRBY key field num

  • HSETNX:只有当field不存在时,才能执行set操作。即只能添加不能修改字段值。

3. List

简单理解:可以看作一个双向链表,既可以正向检索,也可以反向检索

特征

常用来实现评论、留言等功能

  • 有序
  • 元素可重复
  • 插入和删除快
  • 查询速度一般

List类型常用命令

  • LPUSH:向列表左侧插入一个或多个元素

  • LPOP:移除并返回列表左侧的一个或多个元素,没有则返回nil。语法:LPOP key count

  • RPUSH:向列表右侧插入一个或多个元素

  • RPOP:移除并返回列表右侧的一个或多个元素,没有则返回nil。语法:RPOP key count

  • LRANGE:返回一段角标范围内的所有元素(左闭右闭)。语法:LRANGE key start end

    List的角标从0开始

  • BLPOPBRPOP:与LPOPRPOP类似,只不过在没有元素时,等待指定时间,而不是直接返回nil

    该指令只能取一个元素,不能批量获取(防止count和timeout两个数字产生歧义)

用List结构模拟栈和队列

  • 栈:入口和出口在同一边
  • 队列:入口和出口不在同一边
  • 阻塞队列:
    1. 入口和出口不在同一边
    2. 出队时采用BLPOPBRPOP

4. Set

与Java中的HashSet类似,可以看作一个value为null的HashMap

特征

常用来实现共同好友等功能

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

Set类型常用命令

单个Set:

  • SADD:向Set中添加一个或多个元素
  • SREM:移除Set中一个或多个元素
  • SCARD:返回Set中元素的个数
  • SISMEMBER:判断一个元素是否存在于Set中
  • SMEMBERS:根据key获取Set中的所有元素

多个Set:

  • SINTER:求两个集合的交集
  • SDIFF:求两个集合的差集
  • SUNION:求两个集合的并集

5. SortedSet

SortedSet是一个可排序的Set集合,与Java的TreeSet有些类似,但底层数据结构差别很大

Java的TreeSet底层使用红黑树;但是Redis的SortedSet中,每个元素带一个score属性,Redis基于score对元素排序,底层实现是一个跳表+hash表

特征

常用来实现排行榜等功能

  • 可排序
  • 元素不重复
  • 查询速度快

SortedSet常用命令

  • ZADD:添加一个或多个元素到SortedSet中,如果已经存在则更新score。语法:ZADD key score member
  • ZREM:根据key删除指定的一个或多个元素
  • ZSCORE:获取指定元素的score
  • ZRANK:获取指定元素在SortedSet中的排名
  • ZCARD:根据key获取元素个数
  • ZCOUNT:统计指定score范围内(左闭右闭)的所有元素个数。语法:ZCOUNT key min max
  • ZRANGE:返回指定rank范围内(左闭右闭)的元素。语法:ZRANGE key min max
  • ZRANGEBYSCORE:返回指定score范围内(左闭右闭)的元素。语法:ZRANGEBYSCORE key min max
  • ZINCRBY:将指定元素的score自增指定步长。语法:ZINCRBY key increment member
  • ZINTERZDIFFZUNION:求交集、差集、并集

注意:所有排名都是默认根据score升序,排名序号从0开始,如果要降序则在命令的Z后面加上REV,相应的范围也应该变成max min