什么是Redis
Redis是一种Not-only-SQL的数据库,是用C语言编写的key-value型的内存数据库,可以用来缓存,做数据库,做消息中间件等。
为什么用Redis
Redis 优势
① 性能优秀:数据在内存中,读写速度非常快,支持并发 10W QPS。单进程单线程,是线程安全的,采用 IO 多路复用机制。
② 数据类型丰富:支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
③ 支持数据持久化:可以将内存中数据保存在磁盘中,重启时加载。
④ 运用场景丰富:主从复制,哨兵,高可用。可以用作分布式锁。可以作为消息中间件使用,支持发布订阅。
性能优秀
为什么说Redis的速度非常快呢?
Redis采用的是单线程的方式,完全采用内存的操作,也就意味着CPU不是瓶颈,瓶颈可能是内存大小或者网络带宽,所以没必要采用多线程的模式。
① 纯内存操作 redis将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制
② 单线程操作 避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题;
③ I/O多路复用 非阻塞I/O多路复用机制
④ 灵活的数据结构 针对不同场景可以使用不同的数据结构,减少内存的使用
数据类型丰富
首先需要了解Redis的redisObject的格式
可以通过不同的数据类型和编码方式进行组合,编码方式这一部分后续再记录和学习。主要记录一下这几种数据类型的运用
数据类型 | 特点 | 运用场景 |
---|---|---|
string | 可以包含任何数据,如图片或者序列化编码 | 很多都可以使用 |
hash | 类似与map类型 | 适合于存储对象 |
list | 双向链表,增删快 | 最新消息排行,消息队列 |
set | hash表,添加删除查询都是O(1) | 共同好友,唯一IP |
sorted set | 有天然的排序 | 排行榜,带权重的消息 |
string
- decr key 或 incr key: 适用于商品库存数场景,+1,-1之类的。
- setex key seconds value:设置key过期时间,手机验证码类的过期销毁场景
hash
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
- hmset key1 val1 key2 val2 key3 val3: 适用于存储多属性数据,淘宝购物车
list
一个列表最多可以包含 2^32 - 1 个元素
- lpush key value 或 rpop key:类似队列的左右操作,构建消息队列
- ltrim key start stop:可以设置长度,获得区间内元素,适用于最新上架的商品
set
集合中最大的成员数为 2^32 - 1
- sadd key value:利用set不重复的特性,抽奖操作
- sinter key1 [key2]:交集操作,好友类操作
sorted set
- zadd key scores value:利用有序,制作排行榜,或者热搜榜
怎么用Redis
在C++中,采用hiredis作为接口,使用几个指令就可以完成对redis的操作
//Demo
#include <hiredis.h>
int main()
{
redisContext* c = redisConnect("127.0.0.1", 6379);
redisReply* reply = (redisReply*) redisCommend(c, "set test 1");
freeReplyObject(reply);
redisFree(c);
return 0;
}
使用Redis可能会遇到的问题
缓存异常
i. 缓存雪崩
情况:12点开始大促,请求量超高,这时缓存在同一时间失效,那么请求量就落在了数据库上,数据库超出了处理能力,可能就会宕机。
处理方式:为缓存设置随机的过期时间,避免同一时间大面积失效;或者更新缓存而不是设置失效时间;或者设置双重缓存,一个短期一个长期。
ii. 缓存穿透
情况:不断的发起请求数据查询,但是缓存和数据库中都没有这一数据。
处理方式:① 接口处增加校验,id<0 则直接舍去;② 缓存空数据,哪怕查询结果为空,也将这个结果缓存,缓存的存活时间较短; ③ 布隆过滤器, 将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉
iii. 缓存击穿
情况:对一个数据有很高的请求,当这一数据的缓存出现问题时,超高的请求量就会落在数据库上,超过数据库的处理能力。
处理方式:设置热点数据永不过期或者加互斥锁
PERSIST KEY_NAME (取消key的过期时间)
下一章是:淘汰策略,主从机制,哨兵机制,持久化