Redis学习笔记(一)
Redis(一)
Redis是一个开源的、高效的、分布式Key-Value数据库。Redis目前支持存储5种数据类型,字符串(String)、有序列表(List)、无序列表(Set)、字典/哈希表(Hash)、有序Set(zSet)。并且拥有内存回收策略和数据持久策略来保证Redis的高效和安全,我们在项目中主要使用Redis作为缓存,存储一些频繁访问但是又不经常改变的数据比如说字典数据、权限数据、城市数据等。注:默认16个库
以下是关于Redis一些常见的面试问题
常见问题:(T/F 常问/不常问)
Redis集群相关(T)
分片:简单说就是将数据根据一定算法(有唯一且规则的算法[hash])存储到不同位置。
集群策略:据我所知目前Redis的集群策略比较流行的是主从复制+sentinel哨兵、redis cluster(redis官方提供的基于ruby的集群方案)、代理分片、codeis(豌豆荚的集群解决方案)
Q1:你们用的那种?
目前我做到xxx项目只使用到了主从复制(一主两从+3哨兵),主只做写的操作,从做读的操作,因为该项目还属于业务的前期用户量和数据类还达不到Redis单实例的瓶颈,没必要去搭集群。
为啥是3哨兵?
Q2:1个哨兵容易出现失误(由于网络的原因导致哨兵认为主挂掉了),
2个哨兵容易在相互投票选举时出现脑死情况导致无法切换主。
3个哨兵投票数为2的可以避免失误和哨兵在选举时的问题。
Q3:你们Redis存了什么数据(T)?
(字典数据、权限数据、城市数据、session等)
Q4:Redis内存回收机制你了解过吗?/你怎么理解的(T)。
Redis的内存回收会主动删除过期的key或不常用的key,通过设置maxmemory的大小来开启key的删除,通过指定maxmemory-policy的策略来指定Redis删除key的方式。
1、noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
2、allkeys-lru:在主键空间中,优先移除最近未使用的key。
3、volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
4、allkeys-random:在主键空间中,随机移除某个key。
5、volatile-random:在设置了过期时间的键空间中,随机移除某个key。
6、volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
(删除的是部分满足算法选中key,而不是满足算法的全部key)
Q5:怎么选择?
根据系统的实际要求进行选择,防止过期key的脏读概率使用volatile-ttl,为了给更多频繁使用的key提高更多的空间可以使用volatile-lru
Q6:lru算法你有了解过吗?(T)
这个lru算法我只有一点简单的了解,LRU就算最近最少使用的数据,redis主要用它来进行获取要删除的key。
Redis持久策略相关
Redis的持久化策略分为两种AOF和RDB,它俩的区别是存储数据的方式不一样,RDB是定时将全部内存中的数据进行存储。AOF是以日志Append(追加)的方式进行部分数据的持久化。AOF和RDB各有利弊,AOF的主要优势在于损失部分性能来保证数据的安全以及更高的一致性,相比AOF,RDB的优势在于其的高性能。
Q7:为什么选用Redis(F)。
高效、数据类型丰富可以应对不同的业务场景,有良好的持久策略和内存回收策略。并且Redis可以集群来对redis服务质量的提高。
Q8:Redis为什么高效?(F)
因为Redis的所有操作都是基于内存的所以相比硬盘,省去了频繁的IO操作,所以高效。
Q9:你们项目中用什么连接Redis/你们是怎么使用Redis的?(F)
Redis的java连接常用的是jedis,我们在项目中使用的是Spring-data-redis,用的是Jedis的连接池。
Q10:你对Redis的看法(F)
我觉得Redis目前还不太适合直接代替关系型数据库进行数据的持久化,首先是应为它是基于内存的带给我们高效的同时必然不能相硬盘一样存储海量数据而且Redis的设计之初也不是为了代替关系型数据库。虽然说现在Redis的集群分片+主从复制可以进行类数据库的持久,但是Redis始终存在会丢失数据可能,存在一定的风险,对于公司和用户来说数据的丢失是不可取的行为。
常见问题:(T/F 常问/不常问)
Redis集群相关(T)
分片:简单说就是将数据根据一定算法(有唯一且规则的算法[hash])存储到不同位置。
集群策略:据我所知目前Redis的集群策略比较流行的是主从复制+sentinel哨兵、redis cluster(redis官方提供的基于ruby的集群方案)、代理分片、codeis(豌豆荚的集群解决方案)
Q1:你们用的那种?
目前我做到xxx项目只使用到了主从复制(一主两从+3哨兵),主只做写的操作,从做读的操作,因为该项目还属于业务的前期用户量和数据类还达不到Redis单实例的瓶颈,没必要去搭集群。
为啥是3哨兵?
Q2:1个哨兵容易出现失误(由于网络的原因导致哨兵认为主挂掉了),
2个哨兵容易在相互投票选举时出现脑死情况导致无法切换主。
3个哨兵投票数为2的可以避免失误和哨兵在选举时的问题。
Q3:你们Redis存了什么数据(T)?
(字典数据、权限数据、城市数据、session等)
Q4:Redis内存回收机制你了解过吗?/你怎么理解的(T)。
Redis的内存回收会主动删除过期的key或不常用的key,通过设置maxmemory的大小来开启key的删除,通过指定maxmemory-policy的策略来指定Redis删除key的方式。
1、noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
2、allkeys-lru:在主键空间中,优先移除最近未使用的key。
3、volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
4、allkeys-random:在主键空间中,随机移除某个key。
5、volatile-random:在设置了过期时间的键空间中,随机移除某个key。
6、volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
(删除的是部分满足算法选中key,而不是满足算法的全部key)
Q5:怎么选择?
根据系统的实际要求进行选择,防止过期key的脏读概率使用volatile-ttl,为了给更多频繁使用的key提高更多的空间可以使用volatile-lru
Q6:lru算法你有了解过吗?(T)
这个lru算法我只有一点简单的了解,LRU就算最近最少使用的数据,redis主要用它来进行获取要删除的key。
Redis持久策略相关
Redis的持久化策略分为两种AOF和RDB,它俩的区别是存储数据的方式不一样,RDB是定时将全部内存中的数据进行存储。AOF是以日志Append(追加)的方式进行部分数据的持久化。AOF和RDB各有利弊,AOF的主要优势在于损失部分性能来保证数据的安全以及更高的一致性,相比AOF,RDB的优势在于其的高性能。
Q7:为什么选用Redis(F)。
高效、数据类型丰富可以应对不同的业务场景,有良好的持久策略和内存回收策略。并且Redis可以集群来对redis服务质量的提高。
Q8:Redis为什么高效?(F)
因为Redis的所有操作都是基于内存的所以相比硬盘,省去了频繁的IO操作,所以高效。
Q9:你们项目中用什么连接Redis/你们是怎么使用Redis的?(F)
Redis的java连接常用的是jedis,我们在项目中使用的是Spring-data-redis,用的是Jedis的连接池。
Q10:你对Redis的看法(F)
我觉得Redis目前还不太适合直接代替关系型数据库进行数据的持久化,首先是应为它是基于内存的带给我们高效的同时必然不能相硬盘一样存储海量数据而且Redis的设计之初也不是为了代替关系型数据库。虽然说现在Redis的集群分片+主从复制可以进行类数据库的持久,但是Redis始终存在会丢失数据可能,存在一定的风险,对于公司和用户来说数据的丢失是不可取的行为。