Redis 的一些东西

  • 什么是Redis
  • 为什么用Redis
  • 性能优秀
  • 数据类型丰富
  • string
  • hash
  • list
  • set
  • sorted set
  • 怎么用Redis
  • 使用Redis可能会遇到的问题
  • 缓存异常



什么是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的格式

redis从节点故障 redis从节点作用_c++


可以通过不同的数据类型和编码方式进行组合,编码方式这一部分后续再记录和学习。主要记录一下这几种数据类型的运用

数据类型

特点

运用场景

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的过期时间)


下一章是:淘汰策略,主从机制,哨兵机制,持久化