Redis介绍:
- Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样,以下是5种基本类型:
类型 | 样式 |
---|---|
String | hello world |
Hash | {name:“Jack”,age:21} |
List | [A->B->C->C] |
Set | {A,B,C} |
SortedSet | {A:1,B:2,C:3} |
-
Redis操做不同数据类型的命令分组链接:
https://redis.io/commands
-
Redis通用命令
通用指令是部分数据类型的,都可以使用的指令,常见的有: KEYS:查看符合模板所有的key,不建议在生产设备上使用 DEL:删除一个指定的key EXISTS:判断key是否存在 EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除 TTL:查看一个key的甚于有效期 通过help[command]可以查看一个命令具体的用法。
Redis的key允许有多个单词形成层级结构,多个单词之间用’:'隔开,格式为:
项目名:业务名:类型:id;
-
String类型:最基本的数据类型,是二进制安全的,任何形式的字符串都可以存储,包括二进制数据,序列化后的数据,JSON化的对象
-
Hash类型:是一个String类型的域(field)和值(value)得映射表,用来存储对象信息。Reids中,每个哈希表可以存储2^32-1个键值对,也就是40多亿个数据。
-
List类型:Redis中的List类型与java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索也可以支持反向检索。特征与LinkedList类似:
有序 元素可以重复 插入和删除快 查询速度一般
6.1. 如何利用List结构模拟一个栈?
入口和出口在同一边
6.2. 如何利用List结构模拟一个队列?
入口和出口在不同边
6.3 . 如何利用List结构模拟一个阻塞队列?
入口和出口在不同边 出队时采用BLPOP或BRPOP
-
Set类型:Redis的Set结构与java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
无序 元素不可重复 查找快 支持交集、并集、差集等功能
-
SortedSet:Redis的SortedSet是一个可排序的set集合,与java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表加hash表。
可排序 元素不重复 查询速度快 因为SortedSet的可排序特性,经常被用来实现排行版这样的功能。
Redis优势
1. 内存数据库,属于非关系型数据库,在大数据量高并发请求的时候,为了减少与
服务器mysql数据库的大量交互,导致的效率低,因为redis的QPS(每秒查询的请求
次数)达到10w/s, 处理性能很高;
2. 有丰富的数据类型redis本身是key-value 形式存储数据,提供了五种基本类型
的存储
3. 业务场景:因为redis的性能与丰富的数据类型适用于处理 热数据缓存,点赞,
排名,秒杀等业务 (注意 如果你不会秒杀,就不要说)
Redis为什么这么快
1. 纯内存操作,避免了磁盘 `I/O` 等耗时操作**
2. 单线程操作,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程
上下文切换的消耗。
3. 采用非阻塞的IO多路复用机制,提升了并发效率
Redis雪崩
1.概念
雪崩就是指缓存中大批量热点数据过期后系统涌入大量查询请求,因为大部分数据在
Redis层已经失效,请求渗透到数据库层,大批量请求犹如洪水一般涌入,引起数据
库压力造成查询堵塞甚至宕机。
2.解决方案
数据的过期时间采用随机数,均匀分布
数据的过期时间设置为永不过期
搭建redis集群,实现高可用
缓存穿透
1.概念
指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到
数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,
造成缓存穿透。
2.解决方案
将不存在于缓存、数据库的数据,设置为null , 保存到redis 缓存中,并且设
置过期时间
缓存击穿
1.概念
缓存击穿:某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况
,当这个 key 在【失效的瞬间】,大量的请求就击穿了缓存,直接请求数据库
,就像是在一道屏障上凿开了一个洞。
2.解决方案
1.将热点数据设置为永远不过期
2.使用互斥锁(mutex key)