Redis (Remote Dictionary Server 远程字典服务)是一种支持 Key-Value 等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用 C 语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。Redis 能读的速度是110000次/s,写的速度是81000次/s。
1、Redis 是什么
- redis 是一种支持 Key-Value 等多种数据结构的存储系统
- 可用于缓存,事件发布或订阅,高速队列等场景
- 使用 C 语言编写,基于内存,可持久化
- redis 能读的速度是 110000次/s,写的速度是 81000次/s
2、Redis 与 MySQL的区别
| mysql | redis | |
|---|---|---|
| 类型 | 关系型 | 非关系型 |
| 作用 | 持久化层、数据存储在硬盘 | 一般做缓存、数据存储在内存 |
| 速度 | 较慢 | 很快 |
| 运行机制 | 每次请求都要访问数据库,存在IO操作,容易高负载 | 先查缓存,查不到再查数据库 |
3、Redis 在业务中的位置
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删除
数值增加
语法: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 对(键值对)。如:hset myhash username zhangsanhset myhash age 18
赋值二
语法:hmset key field value[field2 value2 …]
说明:设置 key 中多个 filed/value。如:hmset myhash2 username zhangsan age 21
取值
语法:hget key field
说明:返回指定的 key 中的 field。如:hget myhash username# 结果为:"zhangsan"
删除
语法:hdel key field[field]
说明:可以删除一个或多个字段,返回值是被删除的字段个数6.3 List(列表)
List 类型是按照插入顺序排序的双向链表。可以添加一个元素到列表的头部或者尾部
在 key 对应 list 的头部添加字符串元素:lpush key value
在 key 对应 list 的尾部添加字符串元素:rpush key value
返回 key 对应 list 的长度:llen key6.4 Set(集合)
Redis 的 Set 是 string 类型的无序集合,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1),Set集合中不允许出现重复的元素
添加元素
语法:sadd key value[value1、value2]
说明:向 set 中添加数据,如果该key的值已有,则不会重复添加删除元素
语法:srem key members[member1、members2]
说明:删除 set 中指定的成员获取集合元素
集合的差集运算 A-B
语法:sdiff key1 key2
说明:返回 key1 和key2 中相差的成员,而且与key的顺序有关,即返回差集集合的交集运算A∩B
集合的并集运算A∪B
6.5 sorted set(有序集合)
有序集合和 Set 类型极为相似,都不允许重复的成员出现在一个 Set 中。它们之间的主要差别是有序集合中的每一个成员都会有一个 score 与之关联,通过 score 来为集合中的成员进行从小到大的排序
6.6 HyperLoglog
HyperLoglog 是 redis 新支持的类型,主要适用场景是海量数据的计算。特点是速度快。占用空间小。时间复杂度:O(1)
Redis命令:https://redis.io/commands7、高危的命令
keys
- hgetall
- sdiff/sunion等
- ZRANGE 0 -1
- flush
-
8、Key的规范
不建议太长,太长查询性能会很糟糕
- 不建议太短,太短可读性比较差
- 建议采用类似格式 business:object-type:id:field
- userid_111
- userid:111
- iot:login:userid:111
- 一级的Key不要超过千万
- 控制单个key的大小
- 避免所有的数据都放在一个key里面
-
9、不推荐 Redis 作为消息队列
消息一旦消费完就从 redis 中删除了
- redis本身的持久化机制决定了可能会丢数据
- 性能有限
- 功能比较简单,没有延迟消息、指定位点消费等功能
测试redis时要注意点,可以查看这篇:Redis之常见风险与应对措施
