什么是redis?
是一个使用 C 语言编写的,键值对数据库。 Redis 的数据是存在内存中的,所以读写速度非常快。
redis有哪些优缺点?
优:读写性能优异,数据持久化(RDB,AOF),数据类型丰富(string,hash,list),支持主从复制
缺:受物理内存限制,不具备自动容错和恢复功能。
Redis的应用场景有哪些?
缓存:频繁被访问的数据。排行榜:用sortSet(有序集合)。消息队列:邮件发送
redis为什么快?
完全基于内存、数据结构简答、单线程避免了上下文切换
缓存不一致怎么办?
先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么 数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
redis的缓存使用会出现什么问题,对应解决方案有什么?
缓存穿透:查询数据库里不存在的数据。缓存空值
缓存雪崩:某一时间段缓存集中失效。热点数据不过期,不同的过期时间
缓存击穿:频繁访问热点数据,失效时就落到了数据库。不过期
redis持久化方式?
RDB:对内存中数据库的状态进行快照。AOF:以追加的形式把redis的命令写入文件
两种持久化优缺点
RDB:用单独子进程来进行持久化不会 IO 操作,保证了 redis 的高性能。可能会丢失数据
AOF(appendonly):更完整的保存数据。Aof文件大恢复速度慢
redis如何实现ACID?
redis 可以实现原子性,一致性,隔离性。但是不能保证持久性。
原子性,multi会先把命令放到队列里面,然后exec执行命令。发生错误,redis不支持事务回滚
一致性, RDB/AOF。
隔离性,单线程上执行事务,并串行执行事务。watch机制。
持久性,AOF模式下,aof选项设置为always才有持久性。
缓存的常见删除策略有哪些?
定期删除(隔一段时间进行检查)惰性删除(不用管,请求时判断)
redis的内存淘汰策略是什么?(内存)
不允许写入(默认),移除最少使用的,快过期的数据任意移除,快过期的数据挑选移除,任意淘汰
LRU=缓存置换
如果一个数据在最近一段时间没有被用到,那么将来被使用到的可能性也很小,所以就可以被淘汰掉。
Redis命令
字符串 set设置 get获取
哈希 hmset设置 hgetall获取
列表 lpush设置 lrange获取
集合 sadd设置 smembers获取
有序集合 zadd设置 zrange获取
Auth 检查密码是否正确
Ping 查看服务是否运行
Quit关闭连接
事务
Watch监听,事务执行前发生改变就不继续了
批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
Multi开始事务
Exec触发事务
Discrad取消事务
分布式锁特性的实现?
「互斥性」: 任意时刻,只有一个客户端能持有锁。
「锁超时释放」:持有锁超时,可以释放,防止不必要的资源浪费,也可以防止死锁。
「可重入性」:一个线程如果获取了锁之后,可以再次对其请求加锁。
「高性能和高可用」:加锁和解锁需要开销尽可能低,同时也要保证高可用,避免分布式锁失效。
「安全性」:锁只能被持有的客户端删除,不能被其他客户端删除
实现:SETNX + EXPIRE