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,保证可用性和分区容错性,数据一致性并不全保证。

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

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

相关推荐
姜鱼问生8 小时前
Nginx 缓存命中率监控:从 X-Cache-Status 到实时统计
运维·nginx·缓存
IvorySQL9 小时前
PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
数据库·postgresql
刘胡子大叔9 小时前
SQL 脚本的导入顺序
数据库·sql
代码什么用10 小时前
Spring对IoC的实现
数据库·spring
禾小西11 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
hz5678912 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC12 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday12 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
半杯咖啡半行码12 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
小米里的大麦13 小时前
16 MySQL 事务
数据库·mysql