1、什么是Redis?
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。
另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
如果数据长度都一样,就用char,比如身份证号、手机号 如果数据长度不一样,就用varchar,比如名字、地址,但要保证不越界 定长的磁盘空间比较浪费,但效率高 变长的磁盘空间比较节省,但效率低 varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节 char(L): 固定长度字符串,L是可以存储的长度,单位为字符(字母/汉字),最大长度值可以为255
2、Redis是单线程的吗?
redis是单线程的!
redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。
redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。
3、 Redis和MySQL的区别?
a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库。mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在缓存中,读取速度快,但是保存时间有限,最后按需要可以选择持久化到硬盘。
b).mysql作为持久化数据库,每次访问都要在硬盘上进行I/O操作。频繁访问数据库会在反复连接数据库上花费大量时间。redis则会在缓存区存储大量频繁访问的数据,当浏览器访问数据的时候,先访问缓存,如果访问不到再进入数据库.
4、Redis的五大数据类型?
a) 字符串类型 String 添加操作:set
b) 哈希对象 hash 添加操作: hset
c). 列表对象 list 添加操作: lpush
d). 集合对象 set 添加操作:sadd
e). 有序集合对象 sorted set 添加操作: zadd (其他操作略)
6、Redis如何解决key冲突?
拉链法。这个问题可以考虑到另一个问题,HashMap是如何解决key冲突的,同样也是采用拉链地址法。如果被问到解决key值冲突还有什么方法?一般来说解决key值冲突的方法有俩种,一种是开放地址法,另一种就是拉链法。
7、Redis的集群策略?
redis的集群有多个,但是性能最强大的是官方的redis-cluster。
1.使用去中心化化思想, 使用hash slot方式 将16348个hash slot 覆盖到所有节点上 对于存储的每个key值 使用CRC16(KEY)&16348=slot 得到他对应的hash slot 并在访问key时就去找他的hash slot在哪一个节点上 然后由当前访问节点从实际被分配了这个hash slot的节点去取数据。
2.投票容错。通过投票容错机制判断节点是否还在工作中。Redis集群中每个节点都会按时向其他节点发送”心跳包”。当有一个节点不响应时,则判断该节点故障。要求是超过半数的投票不响应。
3.为了解决节点master失效fail的问题,可以使用主从复制策略。 什么时候整个集群不可用(cluster_state:fail)? 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态. 如果集群超过半数以上master挂掉,无论是否有slave(从),集群进入fail状态.