1.为什么使用Redis,有什么优点?

①redis操作数据是基于内存,并且支持多路I/O服用,效率非常快,很适合用来做数据的缓存
②redis相比起memcache,支持的数据类型更加丰富。除了String以外,还支持hash,list,set,zset
③对集群的支持好,有三种集群方案,可以实现一写多读。
④相比起memcache,还支持数据的持久化,支持RDB和AOF两种模式。

2.Redis支持的数据类型?

redis的value除了支持String以外,同时还支持hash,list,set,zset类型。

3.Redis的使用场景?

①因为数据都是基于内存操作,速度非常快,很适合用来做中央缓存。
②可以基于string进行自增自减操作,从而实现计数器功能。这种方式的读写性能非常高,很适合用来做频繁读写的计数量。
③zset是有序的,可以实现排行榜功能。
④list因为是一个双向链表,可以用来消息队列。不过我们一般使用kafka,MQ等消息中间件。

4.Redis为什么那么快?

①因为redis操作数据是基于内存的,并且数据结构简单,所以效率很高。
②redis是单线程的,避免了线程竞争和上下文切换,也没有多线程之间的相互切换。并且不用考虑加锁,也没有加锁和释放锁的消耗。
③redis使用多路I\O复用模型,非阻塞式IO

5.你说一下Redis的持久化机制,应该如何选用?

redis有RDB和AOF两种持久化机制。
RDB是默认开启的机制,他需要满足一定的条件,在一定时间内执行一定数量的写操作才会进行持久化。
AOF需要我们在配置文件手动开启,开启后只要是进行了写操作,就会持久化。
如果能够接受几分钟内的数据丢失,可以选用RDB,RDB的执行效率也比AOF要高,数据恢复效率也比AOF高。
如果选用了AOF,不建议单独使用,建议和RDB一起使用。

6.MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

这个时候就需要需用合适的淘汰策略,来保证redis中存留的都是热点数据
常用的淘汰策略有按照过期时间分、和全局淘汰。
按过期时间分,有
volatile-lru :从设置了过期时间的数据中,淘汰最近最少使用的数据
volatile-ttl :从设置了过期时间的数据中,淘汰过期时间更早的数据
全局淘汰常用的用
allkeys-lru :从所有数据中,淘汰最近最少使用的数据

7.Redis如何做内存优化?

1.在保证见名知意的情况下,key应尽量的精简。value能用数字表示的就用数字,如性别就可以用1,2来表示。因为数字占内存字节数更小,并且redis有共享对象库的概念,存了0-9999的数字,使用重复的数组都只会指向同一个对象,就有点像我们java中包装类保存了-128到127的数字一样。
2.除了热点数据以外,其他数据应尽量都设置过期时间,避免一直占用空间,并且选用合适的淘汰策略。
3.在存放数据之间,可以用压缩工具,把数据进行压缩之后再存放到内存中。
4.如果是存放对象,应避免使用key,value形式进行存储,应该选用散列表(hashes)来进行存储。用value进行存储会设置到对象的序列化和反序列,浪费性能。并且hashes占用的空间更小,我们通过只设置一个key,对应一个map数据的形式进行存储。