1. 1. Redis入门
  2. 2. 常用命令
  3. 3. Redis数据结构
    1. 3.0.1. Redis的层级格式
    2. 3.0.2. String类型
    3. 3.0.3. Hash类型
    4. 3.0.4. List类型
    5. 3.0.5. Set类型
    6. 3.0.6. SortedSet 可排序集合

喔,R!

Redis入门

  • redis是键值数据库(非关系型/K-V/NoSql数据库)
    因此,可以用复杂数据类型包装value来存储复杂数据
    Remote Dictionary Server-RE DI S
  • NoSQL特性
    • 非结构化(通过K-V)
    • 无关联的(智能通过业务逻辑维护表间关系)
    • 非SQL(没有通用的语法标准)
    • 无事务,BASE理论(基本可用(Basically Available)、软状态(Soft-state)、最终一致性(Eventually Consistency)),难以满足ACID
    • 内存存储
    • 水平扩展
  • 适用场景:
    • 数据结构不固定
    • 对一致性、安全性要求不高
    • 对性能要求较高
  • Redis特征
    • K-V,支持数据结构较多
    • 单线程,每个命令具备原子性
    • 低延迟、速度快(基于内存、IO多路复用,编码良好)
    • 支持数据持久化
    • 支持主从集群、分片集群
    • 支持多语言客户端

常用命令

  • Expire Key [time(s)] 设置某键有效期(-1为永久存在,-2为已经过期)
  • TTL Key 查看某键剩余有效期
  • Keys Model 查看符合模板的所有key
  • Del Key 删除一个指定的key
  • Exists Key 查看key是否存在

Redis数据结构

Name Example
String hello
Hash {name:”jack”,age:21}
List [A->B->C->D]
Set {A,B,C}
SortedSet {A:1,B:2,C:3}
GEO {A:(120.3,36.2)}
BitMap 11011
HyperLog 11011

Redis的层级格式

key允许使用多个词条形成层级结构,多个词条之间使用”:”隔开
层级在redis内部是真实存在的,不是通过业务分割的

String类型

字符串类型,可以根据内容不同分为三类(仍然为字符串类型)

  • string 普通字符串
  • int 整数
  • float 浮点数
    其中int和float可以进行自加/自减操作
    如果要让一个key的value有很多属性,需要打包成json

常见命令:

  • set 设置键值对
  • get 获得键值对
  • mset 批量设置键值对
  • mget 批量获得键值对
  • incr 让一个整型的key自增1
  • incrby 让一个整型的key自增并指定步长
  • incrbyfloat 让一个浮点型的key自增并指定步长
  • 存在decr,但是一般都用incr加负数步长
  • setnx 添加一个键值对,前提是不存在,否则不执行
  • setex 添加键值对并指定有效期
    键值对有效期的场景:获取短信验证码/二维码登录等

Hash类型

如果要让一个key的value有很多属性,可以分别存储
KEY (key1 value1 key2 value2…)

常见命令

  • hset key field value 参考string
  • hget 参考string
  • hmset 参考string
  • hmset 参考string(4.0后已被禁用)
  • hgetall 获取一个key中的所有field和value
  • hkeys 获取一个key中的所有field
  • hvals 获取一个key中的所有value
  • hincrby 让一个hash的key字段自增并指定步长(只能指定integer)
  • hsetnx 添加一个hash类型的key的field值,前提是不存在,否则不执行

List类型

可以看作是双向链表,支持正向检索和反向检索
特征:

  1. 有序
  2. 元素可以重复
  3. 插入和删除较快
  4. 查询速度一般

常见命令:

  • (L/R)PUSH key element… 向链表(左/右)侧插入一个元素
  • (L/R)POP key 移除并返回(左/右)侧的第一个元素,没有则返回nil
  • LRANGE key star end 返回一段角标范围内的所有元素
  • B(L/R)POP 与普通类似,没有的时候会等待指定时间,不会返回nil

Set类型

底层类似Java中的HashMap

  • 无序
  • 数据不可重复
  • 查找较快
  • 支持交/并/差等功能

常用命令:

  • SADD key member 添加一个或多个元素
  • SREM key member 移除指定元素
  • SCARD key 返回元素个数
  • SISMEMBET key member 判断是否存在
  • SMSMBERS 获取set中的所有元素
  • SINTER set1 set2 求交集
  • SDIFF set1 set2 求差集
  • SUNION set1 set2 求并集

SortedSet 可排序集合

底层数据结构为跳表+hash表
每一个元素都带有score属性,根据score进行排序

  • 有序
  • 数据不重复
  • 查询较快

常用命令:
SortedSet的常见命令有:

  • ZADD key score member:添加元素,如果已经存在则更新其score值
    在一个命令中添加多个元素时:
    1
    ZADD Key score1 member1 score2 member2
  • ZREM key member:删除集合中的一个指定元素
  • ZSCORE key member:获取集合中的指定元素的score值
  • ZRANK key member:获取集合中的指定元素的排名
  • ZCARD key:获取集合中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member: 让集合中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
    计数器从0开始
  • ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

所有的查询默认为升序,如果需要降序则将命令改为ZREVxxx