Redis (Remote Dictionary Server 远程字典服务)是一种支持 Key-Value 等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用 C 语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。Redis 能读的速度是110000次/s,写的速度是81000次/s。

1、Redis 是什么

  • redis 是一种支持 Key-Value 等多种数据结构的存储系统
  • 可用于缓存,事件发布或订阅,高速队列等场景
  • 使用 C 语言编写,基于内存,可持久化
  • redis 能读的速度是 110000次/s,写的速度是 81000次/s

1.jpg

2、Redis 与 MySQL的区别


mysql redis
类型 关系型 非关系型
作用 持久化层、数据存储在硬盘 一般做缓存、数据存储在内存
速度 较慢 很快
运行机制 每次请求都要访问数据库,存在IO操作,容易高负载 先查缓存,查不到再查数据库

3、Redis 在业务中的位置

2.jpg

4、Redis 的特点

  • 高性能的内存缓存服务 (10W QPS 左右)
  • 核心模块是单线程
  • API 具备原子性
  • 提供持久化能力(AOF 和 RDB)
  • 丰富的数据结构

    5、Redis 的单线程

    Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

    6、Redis 的数据结构

    6.1 String

    String 类型是 Redis 最基本的数据类型,一个键最大能存储 512MB。
    String 类型是二进制安全的。意思是 redis 的 String 可以包含任何数据。比如 jpg 图片或者序列化的对象

    赋值

    语法:set key value
    说明:设定 key 持有指定的字符串 value,如果该 key 存在则进行覆盖,总是返回 OK

    取值

    语法:get key
    说明:获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息(nil),因为 get 命令只能用于获取 String value

    删除

    语法:del key
    说明:删除,删除指定的 key

    数值增加

    语法:incr key
    说明:

  • 将指定key的value原子性的递增 1

  • 如果key不存在,在incr之后,该key的值为1。如果该key的值不能转成整型,如 hello,incr后将返回错误信息

    数值减少

    语法:decr key
    说明:

  • 将指定key的value原子性的递减 1

  • 如果key不存在,在incr之后,该key的值为-1。如果该key的值不能转成整型,如 hello,incr后将返回错误信息

    6.2 Hash(哈希)

    hash 是一个键值对集合,hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

    赋值一

    语法:hset key field value
    说明:为指定的 key 设置 field/value 对(键值对)。如:

    1. hset myhash username zhangsan
    2. hset myhash age 18

    赋值二

    语法:hmset key field value[field2 value2 …]
    说明:设置 key 中多个 filed/value。如:

    1. hmset myhash2 username zhangsan age 21

    取值

    语法:hget key field
    说明:返回指定的 key 中的 field。如:

    1. hget myhash username
    2. # 结果为:"zhangsan"

    删除

    语法:hdel key field[field]
    说明:可以删除一个或多个字段,返回值是被删除的字段个数

    6.3 List(列表)

    List 类型是按照插入顺序排序的双向链表。可以添加一个元素到列表的头部或者尾部
    在 key 对应 list 的头部添加字符串元素:lpush key value
    在 key 对应 list 的尾部添加字符串元素:rpush key value
    返回 key 对应 list 的长度:llen key

    6.4 Set(集合)

    Redis 的 Set 是 string 类型的无序集合,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1),Set集合中不允许出现重复的元素

    添加元素

    语法:sadd key value[value1、value2]
    说明:向 set 中添加数据,如果该key的值已有,则不会重复添加

    删除元素

    语法:srem key members[member1、members2]
    说明:删除 set 中指定的成员

    获取集合元素

    语法:smembers key

    集合的差集运算 A-B

    语法:sdiff key1 key2
    说明:返回 key1 和key2 中相差的成员,而且与key的顺序有关,即返回差集

    集合的交集运算A∩B

    语法:sinter key1 key2

    集合的并集运算A∪B

    语法:sunion key1 key2

    6.5 sorted set(有序集合)

    有序集合和 Set 类型极为相似,都不允许重复的成员出现在一个 Set 中。它们之间的主要差别是有序集合中的每一个成员都会有一个 score 与之关联,通过 score 来为集合中的成员进行从小到大的排序

    6.6 HyperLoglog

    HyperLoglog 是 redis 新支持的类型,主要适用场景是海量数据的计算。特点是速度快。占用空间小。时间复杂度:O(1)
    Redis命令:https://redis.io/commands

    7、高危的命令

  • keys

  • hgetall
  • sdiff/sunion等
  • ZRANGE 0 -1
  • flush
  • config

    8、Key的规范

  • 不建议太长,太长查询性能会很糟糕

  • 不建议太短,太短可读性比较差
  • 建议采用类似格式 business:object-type:id:field
    • userid_111
    • userid:111
    • iot:login:userid:111
  • 一级的Key不要超过千万
  • 控制单个key的大小
  • 避免所有的数据都放在一个key里面
  • 尽量加入TTL

    9、不推荐 Redis 作为消息队列

  • 消息一旦消费完就从 redis 中删除了

  • redis本身的持久化机制决定了可能会丢数据
  • 性能有限
  • 功能比较简单,没有延迟消息、指定位点消费等功能

测试redis时要注意点,可以查看这篇:Redis之常见风险与应对措施