系统化的学习技术、研究技术而不是使用技术

Redis学习笔记

更新于:2018/11/07 17:48:59 分类:数据库

1. Redis支持的数据类型

数据类型 Key Value
String 正常的key 正常的value
Hash 正常的Key 如用户ID HashMap(field,value) 代表对象
List 链表名字 每个子元素都是string类型的双向链表
Set Set名字 string类型的无序集合
Zset Zset名字 一列存 value,一列存顺序

2. Redis的应用场景

  • 缓存热数据 比如博客
  • 计数器
  • 队列
  • 位操作
  • 分布式锁与单线程机制 比如秒杀系统
  • 最新列表
  • 排行榜

3. Redis的全称

Remote Dictionary Server

4. Redis有哪几种数据淘汰策略

  • noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)。
  • allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
  • volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • allkeys-random: 回收随机的键使得新添加的数据有空间存放。
  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
  • volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

5. 为什么Redis需要把所有数据放到内存中

  • 读写速度快, 基本不存在I/O问题
  • 内存越来越便宜

6. Redis的内存用完了会发生什么

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

7. Redis持久化数据和缓存怎么做扩容

如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。

如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。

8. Redis回收使用的是什么算法

LRU算法(LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的)

9. Redis如何做大量数据插入

Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作

10. Redis事务相关的命令有哪几个

MULTI、EXEC、DISCARD、WATCH、UNWATCH

11. 理解Redis事务

实上Redis命令在事务执行时可能会失败,但仍会继续执行剩余命令而不是Rollback(事务回滚)。如果你使用过关系数据库,这种情况可能会让你感到很奇怪。然而针对这种情况具备很好的解释:

  • Redis命令可能会执行失败,仅仅是由于错误的语法被调用(命令排队时检测不出来的错误),或者使用错误的数据类型操作某个Key: 这意味着,实际上失败的命令都是编程错误造成的,都是开发中能够被检测出来的,生产环境中不应该存在。
  • 由于不必支持Rollback,Redis内部简洁并且更加高效。

如果错误就是发生了呢 这是一个反对Redis观点的争论。然而应该指出的是,通常情况下,回滚并不能挽救编程错误。鉴于没有人能够挽救程序员的错误,并且Redis命令失败所需的错误类型不太可能进入生产环境,所以我们选择了不支持错误回滚(Rollback)这种更简单快捷的方法。

延迟执行事务有助于提升性能 因为Redis在执行事务的过程中,会延迟执行已入队的命令直到客户端发送EXEC命令为止。客户端会等到事务包含的所有命令都出现了之后,才一次性将MULTI、要在一次事务中使用的命令及EXEC命令全部发送给Redis,然后等待直到接收到所有命令的回复为止。这种“一次性发送多个命令,然后等待所有回复出现”的似乎没有通常称为流水线(pipelining),它可以减少客户端与Redis服务器之间的网络通信次数来提升Redis在执行多个命令时的性能。

12. Redis key的过期时间和永久有效分别怎么设置

EXPIRE和PERSIST命令

13. Redis集群如何选择数据库

Redis集群目前无法做数据库选择,默认在0数据库

14. Redis集群最大节点个数是多少

16384个

15. 支持一致性哈希的客户端有哪些

Redis-rb、Predis

16. Redis集群之间是如何复制的

异步复制

17. Redis如何设置密码及验证密码

设置密码:config set requirepass 123456

授权密码:auth 123456

18. 说说Redis哈希槽的概念

Redis集群没有使用一致性hash,而是引入了哈希槽的概念。 Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

19. Redis集群的主从复制模型是怎样的

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品。

20. 一个字符串类型的值能存储最大容量是多少

512M

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

Redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

22. Redis支持的Java客户端都有哪些,官方推荐用哪个

Redisson、Jedis、lettuce等等,官方推荐使用Redisson

23. 为什么要做Redis分区

分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。
如果没有分区,最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升。
Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。

24. Redis常见性能问题和解决方案

  • Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件。
  • 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次。
  • 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 。
  • 尽量避免在压力很大的主库上增加从库。
  • 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
    这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

25. 数据持久化

快照(snapshotting) 将某一时刻的所有数据全部都写入到硬盘。
在只使用快照持久化来保存数据时,一定要记住:如果系统真的崩溃,用户将丢失最后一近一次生成快照之后更改的所有数据。

只追加文件(append-only-file) 在执行写命令时,将被执行的写命令复制到硬盘。
Redis只要重新执行一次AOF文件包含的所有命令,就可以恢复AOF文件所记录的数据集。
 

留言(1)

小苦瓜@2018/11/01 09:50:50

楼主写得真好,赞一个

给我留言