Redis(远程字典服务器) 是一个开源的、使用 C 语言编写的 NoSQL 数据库即非关系数据库。
Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程。
Redis特点:
①读写速度快。
②支持丰富的数据类型。
③持久化,可以将内存中的数据保存在磁盘中,重启时再次加载进内存进行使用,定期快照,日志记录方式保存(类似增量备份)。
④原子性:redis 所有操作都是原子性的。
⑤支持数据备份:即 master-salve 模式的数据备份。
Redis五种数据类型分别是string(字符串),hash(哈希),list(列表),set(集合)及sort set (有序集合)。
1.字符串string 可以接受任何格式数据,如JPEG图像数据,它是标准的key-value,Value可容纳高达512MB的数据;应用程序场景:非常常见的场景用于计算站点访问量、当前在线人数等。
2.散列hash
可以使你像在数据库中Update一个属性一样只修改某一项属性值。应用程序方案:存储部分更改数据,如用户信息、会话共享。
3.列表list
允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构。
应用场景:(1)最新消息排行榜。(2)消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)
4.集合sets
所谓集合就是一堆不重复值的组合,并且是没有顺序的。在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
5.有序集合sort sets
一个有序的并且不重复的集合列表,每个元素都与双类型的分数相关联。Redis使用分数将集合的成员从小到大排序。zset的成员是唯一的,但是分数可以重复。sorted set是插入有序的,即自动排序。
应用举例:(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。(2)排行榜应用,根据得分列出topN的用户等。
缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
解决方案:
- 把一些空值,null值也放入缓存.
- 布隆过滤器,类似于拦截器
布隆过滤器:一种数据结构,是由一串很长的二进制向量组成,可以将其看成一个二进制数组。既然是二进制,那么里面存放的不是0,就是1,但是初始默认值都是0。
缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方案:
- 对接口限流
- 加分布式锁
缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
解决方案:
- 缓存数据的过期时间设置随机(比如加1-5分钟的随机数),防止同一时间大量数据过期现象发生。
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同得缓存数据库中。
- 热点数据永不过期