Redis笔记 | 青训营

96 阅读3分钟

Redis工作原理

redis特点:非关系型数据库,单线程的,数据存储在内存中。可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

redis是单线程的,省去了多线程的上下文切换的时间,用单个CPU绑定一块内存的数据,针对这块内存的数据进行多次读写,这一过程都是在一个CPU上完成的,大大提高了效率。

Redis通过IO多路复用来实现处理并发客户端连接:将连接信息和事件放到队列中,再依次放入文件时间分派器,通过分派器分发给事件处理器。

Redis如何将数据持久化

Redis是内存性数据库,为了保证断电不丢失,需要将内存中的数据存入硬盘。

RDB

将某个时间点的所有数据都存到硬盘,把快照复制到其他服务器从而创建具有相同数据的服务器副本。如果系统故障,会丢失最后一次创建快照之后的数据。数据量很大时保存时间会很长。

AOF

把写命令追加到AOF文件末尾。使用AOF持久化需要设置同步,确保写命令能同步到磁盘文件上。对数据进行写入时不会马上将内容同步到磁盘上,而是先存储到缓冲区,由操作系统决定什么时候同步到磁盘。

同步频率 1、always每个写命令都同步,会严重降低服务器性能。 2、eyerysec每秒同步一次,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器几乎没有任何影响。 3、no让操作系统来决定何时同步,不会给性能带来多大提升,还会增加系统崩溃时候数据丢失的数量。

Redis数据类型

基本数据类型有string,list,hash,set,zset。

string

string类型为redis中最基本的数据类型,一个key对应一个value。 string是二进制安全的,可以包含任何数据,例如图片和序列化的对象,值最大存储512mb

类似于java中的map

list

列表。按照插入顺序排序。是一个简单的字符串集合。list内元素可以重复

set

字符串类型的无序集合,不能有重复元素。通过哈希表实现,增删改查时间复杂度都为O(1)

hash

是一个键值对集合,适用于存储对象。string是一个键值对,而hash是多个键值对,相当于一个映射表。

zset

zset与set不同的是 zset 每个元素都会关联一个 double 类型的分数。redis 通过分数来为集合中的成员进行从小到大的排序。 zset 的元素是唯一的,但是分数(score)却可以重复。

缓存穿透和缓存血崩

缓存穿透

即刻意请求缓存中不存在的数据,导致所有的请求都集中到数据库,从而数据库连接异常。

解决策略 1、采用互斥锁。缓存失效时候先去获得锁,得到锁之后再去请求数据库。未得到锁则休眠一段时间重试 2、采用异步更新。无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。 3、提供一个拦截机制。判断携带的key是否合法,不合法直接返回。

缓存血崩

即缓存同一时间大面积失效,此时又迎来一波请求,请求都集中到数据库,从而数据库连接异常。

解决策略 1、避免集体失效:给缓存的失效时间加上随机值 2、使用互斥锁 3、采取双缓存。