1、redis的定义:基于内存的高性能非关系型(key-value)数据库。
2、redis的数据类型:string、hash、list、set、sorted-set。
3、redis的特点:redis本身是一个key-value类型的内存数据库,整个数据库在系统内存中操作,定期的将数据同步到磁盘中,因为是纯内存操作,所以性能特别快,每秒可实现10万次的操作。另外redis支持多种数据类型,可以保存多种数据结构。因此redis可以实现多种功能,例如用list来做双向链表,实现轻量级的消息队列服务。另外通过对存入的key-value设置expire参数,实现数据缓存。
4、redis有哪些好处:
速度快,数据都存储在内存中,查找和操作的时间复杂度都是O(1)
有丰富的数据类型string、hash、list、set、sorted-set。
支持事务,操作都是原子性的。
丰富的特性:可用作缓存,消息
5、redis常见性能问题和解决方案
a. Master写内存快照,调用rdbSave函数,会阻塞主线程工作,当快照比较大时,会间歇性停止服务,所以不建议Master写内存快照。
b. Master AOF持久化,如果不重写aof文件,这个持久化方式对性能的影响是最小的,但是会导致aof文件不断增大,AOF文件过大会影响Master重启的恢复速度Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据重要,某个Slave开启AOF备份数据,策略为每秒同步一次。
c. Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
6、mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
(redis内存数据达到一定量时,会启用数据淘汰策略,redis提供6中数据淘汰策略)
- volatile-lru:从已经设置过期时间的数据集挑选最近最少使用的淘汰。
- volatile-ttl:从已经设置过期时间的数据集中挑选将要过期的淘汰。
- volatile-random:从已经设置过期时间的数据集随机挑选要淘汰的。
- allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰。
- allkeys-random:从所有的数据集中随机挑选的数据淘汰。
no-enviction:禁止驱逐数据。
7、redis为什么把数据存到内存中?
因为在内存中读写速度比较快,并通过异步的形式写到磁盘中,所以redis具有持久化和快速的特点。如果不将数据都写到内存中,I/O磁盘速度会严重影响redis的性能。
8、redis缓存失效策略和主键失效机制
在redis中有生存期的key成为volatile,在创建缓存的时候,会给key设置生存期,过了生存期,其key可能会被删除。
(1)影响生存时间的操作- 生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆盖原来的数据,也就是说,修改key对应的value和使用另外相同的key和value来覆盖以后,当前数据的生存时间不变
(2)如何更新生存时间 - 可以对一个已经带有生存时间的 key 执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。过期时间的精度已经被控制在1ms之内,主键失效的时间复杂度是O(1)。
- EXPIRE和TTL命令搭配使用,TTL可以查看key的当前生存时间。设置成功返回 1;当 key 不存在或者不能为 key 设置生存时间时,返回 0 。
- 最大缓存配置:在 redis 中,允许用户设置最大使用内存大小server.maxmemory
默认为0,没有指定最大缓存,如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置。redis 内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略
9、redis的使用场景
- 最常用的一种使用Redis的情景是会话缓存(session cache)
- 全页缓存(FPC)
- 最新列表
- 新闻列表页面最新的新闻列表,使用redis的lpush命令构建一个list,一个个顺序都塞进去
- 排行榜应用
实现此功能主要用到redis的数据类型是redis的有序集合sortedSet。sortedSet是set类型的一个拓展,比原有的类型多了一个顺序属性,此属性再买次插入数据时会自动调整顺序值,保证value值按照一定顺序连续排列。
假如一个游戏经验值排行榜,主要的实现思路是:
1 在一个新的玩家参与到游戏中,在redis中的sortedSet中新增一条记录,score为0.(zadd key_name 0 number)
2 当玩家的经验值发生变化时,修改该玩家的score值(zadd key_name 5 number )
3 使用redis的zrange (score升序排列),zrevrange(score降序排列)方法获取排行榜(zrange/zrevrange key_name 0 -1 withscores)。 - 计数器应用
redis的命令都是原子性的,可以轻松的利用incr/decr命令进行原子性操作,来构建计数系统。由于单线程,可以避免并发问题,保证不会出错。 - 数据排重
redis set是可以自动重排的,当你需要存储一个列表数据,又不希望出现重复数据,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口。
实现方案:set的内部是一个value永远为null的HashMap,实际上是通过计算hash的方式快速重排,这也是set能提供判断一个成员是否在集合内的原因。 - 实时的反垃圾系统
- 可以发布订阅的实时消息系统
redis中pub/sub系统可以构建实时的消息系统
一个生产者可以对应多个消费者,但是必须保证消息发布者和订阅者同时在线,否则一旦消息订阅者由于各种总异常情况被迫断开连接,再起重新连接后,其离线期间的消息是无法被重新通知。当然,生产者是不需要关心有多少订阅者,也不用关心订阅者的具体信息,而订阅者可以根据需要自由选择订阅哪些频道。
造成的缺点:如果大量的消息到redis服务时,如果订阅者不能及时消费,则就会导致信息堆积,引发内存问题。 - 队列应用:如图所示
- 生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆盖原来的数据,也就是说,修改key对应的value和使用另外相同的key和value来覆盖以后,当前数据的生存时间不变
redis 4.0新增特性:
1 lazyFree:lazyFree机制可以避免del、rename、flushAll、flushdb引起的的阻塞。
2 unlink 在4.0之前del命令在删除key之前,会释放掉所有key内存以后才会返回ok,如果key比较大的情况下,会等待很久,为了兼容del的功能,redis4.0引入unlink命令,效果和用法和del一样,不过unlink是释放内存在后台运行的线程。
3 flushdb/flushAll 可以指定是否使用Lazyfree的方式来清空整个内存。
4 rename :执行 rename oldkey newkey 时,如果newkey已经存在,redis会先删除,这也会引发上面提到的删除大key问题,如果想让redis在这种场景下也使用lazyfree的方式来删除,可以在控制台上打开如下配置。lazyfree-lazy-server-del yes/no
5 混合rdb-aof持久化机制:
redis 4.0的RDB-AOF混合机制一旦开启,AOF重写产生同时包含的rdb格式和aof格式的内容,rdb记录原有的数据,aof用于记录最近发生了变化的数据。这样redis同时兼有rdb和aof持久化的优点,技能快速生成重写的问题件,也能在出现问题的时候,快速的载入数据。