Redis基础总结

Redis是一个基于内存的键值数据库,常用于缓存。

1、数据结构

常见的有:

string,可以存字符串、整数等,如 key: "sadasfa"

hash, 存一张哈希表, 如 key : {{k1, v1}, {k2, v2}}

list,存一个链表,如 key:{1->2->3}

set, 存一个字符串的无序集合,去重 如key: {"123", "213"}

zset,存储有序的键值对,每个元素有权重和值,根据权重排序,如key:{{A, 1}, {B, 2}, {C, 3}}

使用场景:

string记录一些信息,如计数

list:消息队列

hash:用户信息,HSET user:1000 name "John Doe"

set:去重,如查找我们2个人的所有好友

zset:有序,打赏排行榜, 按打赏的金额排序

redis为什么快

1、大部分操作在内存中完成,并且采用高效的数据结构,所以redis的瓶颈是内存和网络带宽,不是cpu,自然就采用单线程,避免多线程竞争。

2、采用I/O多路复用,提高并发。

3、6.0对于网络io的处理改成了多线程。但是对命令的执行还是单线程的。

持久化

redis持久化:三种方式

  1. AOF日志:每执行一条写命令后都会把它记录到AOF缓冲区,按写回策略写回磁盘。
    后续可以根据AOF日志进行数据恢复。写回策略:总是,每秒,由操作系统决定。A0F恢复是逐条恢复,比较慢,但是全。
  2. RDB快照:定期照一张快照,记录内存的所有数据,再写回磁盘,后续根据快照恢复。RDB很快因为直接是根据数据恢复,但不能太频繁,因为每次快照写回磁盘数据量比较大。所以RDB会有数据安全的问题。
  3. 混合持久化:AOF日志前半部分记录RDB的全量数据,后半部分记录AOF的增量,这样的化,重启redis后加载快,且数据丢失也较少。

高可用

主从复制:一主多从,从机备份主机数据,主机负责写,从机负责读,实现读写分离。但是

但是若主机挂了系统就只能读不能写了。所以需要能够自动重选出主机:引入哨兵,监控主机的运行情况,若主机挂了,他会选一个从机成为主机,具体过程:哨兵会定期发送ping判断主机是否正常运行,若ping失败则认为主机主观下线。则哨兵会向其他从机发出投票命令,让他们判断主机是否下线,当票数达到阈值则认为主机客观下线。开始重选主机:所有从机按优先级、复制进度、ID号排序,选出新的主机,到此故障迁移完成。注意哨兵本身也应该设置多个形成哨兵集群。但是从主机故障到哨兵发生故障进行故障迁移需要时间,这段时间还是不能写,所以让主机也形成集群,一个挂了也不影响。

redis集群保证数据一致性吗:他是AP,保证可用性和分区容错性,数据一致性并不全保证。

缓存雪崩 :为了保证缓存中的数据和数据库数据的一致性,缓存的数据会设置过期时间,当数据过期,就要访问数据库重新生成缓存。若大量缓存数据同时过期,同时又来了大量请求,就会全访问数据库,导致数据库压力骤增甚至崩溃。可均匀设置过期时间。或者像数据库构建缓存时加锁,保证同一时间只有一个线程构建缓存。
缓存击穿 :某个热点数据过期了,同时大量数据访问该热点数据,也会直接访问数据库。可以不给热点数据设置过期时间,我们后台更新缓存。
缓存穿透:用户访问的数据既不在缓存,也不在数据库,大量的这种请求也会导致数据库压力骤增。这一般是恶意访问,可以限制非法请求,或者没查到的数据缓存空值,后续也不用再查数据库了。

数据库和缓存如何保证一致性:读的时候先读缓存,缓存若没有就读数据库,并把数据放入缓存;写的时候先更新数据库再删除缓存。为啥是删除缓存不是更新缓存:因为更新的代价比较大,一个缓存可能设计多张表,而且这个缓存也不一定会被频繁访问到。这也是叫懒加载的思想,用到的时候再计算。

相关推荐
师太,答应老衲吧1 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis2 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享3 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil273 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk4 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境4 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n4 小时前
MYSQL库的操作
数据库·mysql
包饭厅咸鱼5 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库
王佑辉5 小时前
【redis】延迟双删策略
redis
生命几十年3万天5 小时前
redis时间优化
数据库·redis·缓存