原理详情参见redis原理总结
Redis原理了解吗?你们是如何使用的?
Redis是基于内存、单进程单线程模型的KV数据库,由C语言编写。官方数据可达100000+qps。采用单进程单线程依然很快的原因除了它的数据结构、操作简单、完全基于内存,最主要还是它使用了多路 I/O 复用技术。

多路 I/O 复用是利用操作系统提供的select、poll、epoll可以同时监察多个流的 I/O 事件的能力:在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
详情参考IO多路复用—由Redis的IO多路复用yinch、Redis 和 I/O 多路复用
- 单进程单线程好处
- 代码更清晰,处理逻辑更简单
- 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
- 不存在多进程或者多线程导致的切换而消耗CPU
- 单进程单线程弊端
- 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善
Redis的数据类型你们都用过哪些,是如何使用的?
- String:基本操作,最常用,一般用于缓存信息结构比较简单、更新内容是全部更新的场景,常用操作命令:set,get,decr,incr,mget
- Hash:缓存信息为KV结构化数据并且更新时更多是更新部分内容的场景,常用操作命令:hget,hset,hgetall,比如:用户会话信息的维护,通常只会更新会话信息中的部分信息(最近登录时间、设置session attribute))
- List:缓存信息为List结构化数据并且更新时更多是更新部分内容的场景,常用操作命令:lpush,rpush,lpop,rpop,lrange,比如:商品的评价列表、会员的粉丝列表,(注意:仅存储部分热点数据,查询非热点数据时依然会走服务)
- Set:缓存信息为去重List结构化数据并且更新时更多是更新部分内容的场景,常用操作命令:sadd,spop,smembers,sunion
Redis集群了解么?Redis集群高可用、负载均衡你们是如何保证的?
通过主从模式实现高可用,但无法保证数据完全一致性(Redis更适用于缓存场景,对于数据一致性要求较高的场景还是采用数据库或者其他模式的Redis集群)。
Redis持久化机制了解么?
Redis中主从是如何同步的?
Redis的缓存更新你们是如何做的?
主从模式集群,通过更新Redis主结点,完成Redis众多从结点的更新。
网友评论