【Redis】Redis总结

Redis是什么?

Redis是一个使用C语言写成的,开源的基于内存的高性能key-value数据库。


Redis支持那些数据类型?

String(字符串)
格式:set key value
string类型是二进制安全的。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。

Hash(哈希)
格式:hmset name key1 value1 key2 value2
Redis hash 是一个键值(key => value)对集合。
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或者尾部。
格式:Ipush name value 在key对应list的头部添加字符串元素
格式:rpush name value 在key对应list的尾部添加字符串元素

Set(无序集合)
格式:sadd name value
Redis的set是string类型的无序集合。
集合是通过哈希表实现的,所以添加/删除/查找的复杂度都是O(1)。

Zset(sorted set:有序集合)
格式:zadd name ccore value
Redis zset和set一样也是string类型元素的集合,不允许重复的成员。
不用的是每个元素都会关联要给double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数score却可以重复。

Bitmap

HyperLogLogs

Streams

使用场景

在这里插入图片描述
在这里插入图片描述


Redis特性是什么?

速度快
数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1),每秒可以处理超过10w次读写操作,是已知性最快的Key-Value DB。

支持丰富的数据类型
支持以上8种数据类型。

支持事务
操作不是原子性的,即使某些操作失败,也不会影响别的操作的执行。

丰富的特性
可用于缓存,按key设置过期时间,过期后将会自动删除。

单个value的最大限制是1GB,不像memcached只能保存1MB的数据。


Redis持久化是什么?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis提供了两种持久化方式:一: RDB (默认),二:AOF

RDB(Redis DataBase)
在指定的时间间隔内将内存中的数据集快照写入磁盘。
优点:

  1. 访问性能最佳。
  2. 适合大规模的数据恢复。
  3. 对数据完整性和一致性要求不高。

缺点:

  1. 数据不安全,会丢失最后一次快照后的所有修改,fork消耗极大
    save seconds changes
    在这里插入图片描述

AOF(Append-only file)
日志的形式来记录每个写操作,将Redis执行过的所用写指令记录下来(读操作不记录)。

优点:

  1. 每秒同步:appendfsync always 同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差但是数据完整性比较好。
  2. 每修改同步:appendfsync everysec 异步操作,每秒记录,如果一秒内宕机,有数据丢失。
  3. 不同步:appendfsync no 从不同步。

数据相对安全
缺点:

  1. 相同数据集的数据而言AOF文件要远大于RDB文件,恢复速度慢于RDB。
  2. AOF运行效率要慢于RDB,每秒同步策略效率较好,不同步效率和RDB相同。

访问性能相对不是最佳


Redis有那些架构模型?

1.单机版

2.主从复制

3.哨兵
Redis sentinel 是一个分布式系统种监控redis主从服务器,并在主服务器下线时自动进行故障转移。
特性
监控(monitoring):Sentinel 会不断地检查你的主从服务器是否运作正常。
提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failoveer):当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作。

特点:
高可用
监控各个节点
自动故障迁移

缺点:
主从模式,切换需要时间丢数据
没有解决master写压力

4.集群


带来哪些问题?

什么是缓存穿透?

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就是叫做缓存穿透。

如何避免?
1.对查询结果为空的情况也进行缓存,缓存时间可以设置的短一点,或者该key对应的数据insert了之后清理缓存。
2.对一定不存在的key进行过滤。可以把所有的可能存在的key放在一个大的Bitmap中,查询时通过该bitmap过滤。


什么是缓存击穿?

一条数据

如何解决?

  • 二级缓存
  • 分布式锁

什么是缓存雪崩?

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力,导致系统崩溃。

如何避免?
1.在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2.做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
3.不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

区别:
穿透 无数据
击穿 一条数据
雪崩 多条数据


淘汰策略

  1. Allkeys-lru:移除最近最少使用的key(常用)
  2. Allkeys-random:随机移除某个key
  3. Volatile-lru:移除最近最少使用的key(这个一般不太适合)
  4. Volatile-random:随机移除某个key
  5. Volatile-ttl:优先删除更早过期的key
  6. noeviction:不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息

redis是单线程还是多线程

单线程,单线程为什么还那么快?
1.纯内存操作
2.核心基于非阻塞的IO多路复用机制
3.避免了多线程的频繁上下文切换问题

参考资料:
Redis1
Redis2
Redis3
Redis4

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值