redis常用知识汇总(13)


先写数据库 , 再写缓存 , 数据库写成功 , 缓存写失败
写数据库成功 , 但写缓存失败 , 则下次读取(并发读)缓存时 , 则读不到数据
缓存使用时 , 假如读缓存失败 , 先读数据库 , 再回写缓存的方式实现
需要缓存异步刷新
指数据库操作和写缓存不在一个操作步骤中 , 比如在分布式场景下 , 无法做到同时写缓存或需要异步刷新(补救措施)时候
确定哪些数据适合此类场景 , 根据经验值确定合理的数据不一致时间 , 用户数据刷新的时间间隔
 
Redis常见性能问题和解决方案?
1、Master最好不要做任何持久化工作 , 包括内存快照和AOF日志文件 , 特别是不要启用内存快照做持久化 。
2、如果数据比较关键 , 某个Slave开启AOF备份数据 , 策略为每秒同步一次 。
3、为了主从复制的速度和连接的稳定性 , Slave和Master最好在同一个局域网内 。
4、尽量避免在压力较大的主库上增加从库
5、Master调用BGREWRITEAOF重写AOF文件 , AOF在重写的时候会占大量的CPU和内存资源 , 导致服务load过高 , 出现短暂服务暂停现象 。
6、为了Master的稳定性 , 主从复制不要用图状结构 , 用单向链表结构更稳定 , 即主从关系为:Master<–Slave1<–Slave2<–Slave3… , 这样的结构也方便解决单点故障问题 , 实现Slave对Master的替换 , 也即 , 如果Master挂了 , 可以立马启用Slave1做Master , 其他不变 。
Redis官方为什么不提供windows版本?
因为目前linux版本已经相当稳定 , 而且用户量很大 , 无需开发windows版本 , 反而会带来兼容性等问题 。
一个字符串类型的值能存储最大容量是多少?
512M
Redis如何做大量数据插入?
Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作 。
假如Redis里面有1亿个key , 其中有10w个key是以某个固定的已知的前缀开头的 , 如果将它们全部找出来?
使用keys指令可以扫出指定模式的key列表 。
对方接着追问:如果这个redis正在给线上的业务提供服务 , 那使用keys指令会有什么问题?
这个时候你要回答redis关键的一个特性:redis的单线程的 。keys指令会导致线程阻塞一段时间 , 线上服务会停顿 , 直到指令执行完毕 , 服务才能恢复 。这个时候可以使用scan指令 , scan指令可以无阻塞的提取出指定模式的key列表 , 但是会有一定的重复概率 , 在客户端做一次去重就可以了 , 但是整体所花费的时间会比直接用keys指令长 。
使用Redis做过异步队列吗 , 是如何实现的
使用list类型保存数据信息 , rpush生产消息 , lpop消费消息 , 当lpop没有消息时 , 可以sleep一段时间 , 然后再检查有没有信息 , 如果不想sleep的话 , 可以使用blpop, 在没有信息的时候 , 会一直阻塞 , 直到信息的到来 。redis可以通过pub/sub主题订阅模式实现一个生产者 , 多个消费者 , 当然也存在一定的缺点 , 当消费者下线时 , 生产的消息会丢失 。
Redis如何实现延时队列
使用sortedset , 使用时间戳做score, 消息内容作为key,调用zadd来生产消息 , 消费者使用zrangbyscore获取n秒之前的数据做轮询处理 。
Redis回收进程如何工作的?
1、一个客户端运行了新的命令 , 添加了新的数据 。
2、Redis检查内存使用情况 , 如果大于maxmemory的限制 ,  则根据设定好的策略进行回收 。
3、一个新的命令被执行 , 等等 。
4、所以我们不断地穿越内存限制的边界 , 通过不断达到边界然后不断地回收回到边界以下 。
5、如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键) , 不用多久内存限制就会被这个内存使用量超越 。
Redis回收使用的是什么算法?
LRU算法

【redis常用知识汇总】


推荐阅读