文章目录
-
- 什么是Redis
- Redis 有哪些适合的场景?
- Redis有哪些优缺点
- 为什么要用 Redis 而不用 map/guava 做缓存?
- Redis为什么这么快
- Redis有哪些数据类型
- string
- hash
- list
- set
- zset
- Redis 有哪几种数据淘汰策略?
- Redis 集群方案应该怎么做?都有哪些方案?
- 说说 Redis 哈希槽的概念?
- Redis高可用方案
- 什么是缓存穿透?
- 怎么避免缓存穿透?
- 什么是缓存雪崩?
- 怎么避免缓存雪崩?
- 什么是缓存击穿?何如避免?
- Redis 实现异步队列
- Redis 实现延时队列
- redis 主从复制如何实现的?
- Redis怎么做主从切换?数据丢失怎么办?
- Redis 持久化
- 缓存与数据库不一致怎么办
- 主从数据库不一致如何解决
- Redis 常见的性能问题和解决方案
- 假如 Redis 里面有 1 亿个 key ,其中有 10w 个 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?
- MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
为什么用redis,怎么使用的
使用了哪些数据结构
介绍sortedset
你会怎么实现sortedset
SoertedSet使用红黑树、跳表哪个实现更好?
什么是Redis
- Redis(Remote Dictionary Server) 是一个使用 C语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
- Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
- 与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,Redis 经常用来做分布式锁。
- Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
Redis 有哪些适合的场景?
- 缓存
- 排行榜:使用Redis的SortSet数据结构
- 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等
- 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;
- 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,完成异步解耦;
- Session共享
- 分布式锁
Redis有哪些优缺点
优点
- 读写性能优异
- 支持数据持久化,支持AOF和RDB两种持久化方式。
- 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
- Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
- Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
为什么要用 Redis 而不用 map/guava 做缓存?
- map/guava属于本地换成,最主要的特点是轻量以及快速,生命周期随着 jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
- 使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持服务的高可用,架构上较为复杂。
Redis为什么这么快
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
- 数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 使用多路 I/O 复用模型,非阻塞 IO;
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
Redis有哪些数据类型
Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求
string
Redis的数据结构
字符串类型是 Redis 最基础的数据结构,键都是字符串类型,而且其他几种数据结构都是在字符串类型的基础上构建的。字符串类型的值可以实际可以是字符串(简单的字符串、复杂的字符串如 JSON、XML)、数字(整形、浮点数)、甚至二进制(图片、音频、视频),但是值最大不能超过 512 MB。
设置值
set key value [ex seconds] [px millseconds] [nx|xx]
ex seconds:为键设置秒级过期时间,跟 setex 效果一样
px millseconds:为键设置毫秒级过期时间
nx:键必须不存在才可以设置成功,用于添加,跟 setnx 效果一样。由于 Redis 的单线程命令处理机制,如果多个客户端同时执行,则只有一个客户端能设置成功,可以用作分布式锁的一种实现。
xx:键必须存在才可以设置成功,用于更新
获取值
get key ,如果不存在返回 nil
批量设置值
mset key value [key value…]
批量获取值
mget key [key…]
计数
incr key
incr 命令用于对值做自增操作,返回结果分为三种:① 值不是整数返回错误。② 值是整数,返回自增后的结果。③ 值不存在,按照值为 0 自增,返回结果 1。除了 incr 命令,还有自减 decr、自增指定数字 incrby、自减指定数组 decrby、自增浮点数 incrbyfloat。
string 的内部编码
字符串对象底层数据结构实现为简单动态字符串(SDS)和直接存储,但其编码方式可以是int、raw或者embstr,区别