Redis的常见知识点

一、使用Redis有哪些好处?

  1. 速度快,因为数据存在内存中,类似于HashMap的优势就是查找和操作的时间复杂度都是O(1)
  2. 支持丰富数据类型,string,list,set,sorted  set,hash
  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
  4. 丰富是特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

二、为什么redis需要把所有数据放到内存中?

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。

如果不将数据放在内存中,磁盘I/O速度会严重影响redis的性能。

三、Redis是单进程单线程的?

Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

四、redis主从复制?

redis主从配置比较简单,基本就是在从节点配置文件加上:slaveof 192.168.33.130 6379

主要是通过master  server持久化的rdb文件实现的。master  server先dump出内存快照文件,然后将rdb文件传给slave  server,slave  server  根据rdb文件重建内存表。

redis复制过程如下:

1、slave  server启动连接到master   server之后,slave   server主动发送SYNC命令给master   server

2、master  server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给slave   server

3、master   server子进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中

4、slave   server接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构

5、master  server把快照文件发送完毕之后,发送缓存队列保存的保存的子进程快照期间改变的数据给slave  server,slave  server做相同处理,保存数据一致性

6、master   server后续接收的数据,都会通过步骤1建立的连接,把数据发送到slave   server

需要注意:slave   server如果因为网络或其他原因断与master   server的连接,当slave   server重新连接时,需要重新获取master     server的内存快照文件,slave    server的数据会自动全部清空,然后再重新建立内存表,这样会让slave   server启动恢复服务比较慢,同时也给master   server带来较大压力,可以看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽量规避中途增加从库redis2.8之前不支持增量,到2.8之后就支持增量了。

原则:Master会将数据同步到slave,而slave不会将数据同步到master。slave启动时会连接master来同步数据。这是一个典型的分布式读写分离模型。我们可以利用master来插入数据,slave提供检索服务,这样可以有效减少单个机器的并发访问数量。读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

redis:会周期性的把数据写入磁盘或者修改操作写入追加的记录文件,并在基础上实现了master-slave(主从)同步。

重要的特点实现数据持久化

1.使用RDB快照的方式,将内存中的数据不断写入磁盘;会出现数据丢失

2.使用AOF日志方式,记录每次更新的日志。即每条会使Redis内存数据发生改变的命令都会追加到一个log文件中,也就是说这个log文件就是Redis的持久化数据。

缺陷:由于主从之间是异步传输,所以存在丢失数据的风险。

例如:客户端写主节点B,B回复客户端OK,B传送写操作到从节点B1、B2和B3.由于B在回复客户端前,不会等待从节点的确认。所以如果此时B发生故障,虽然从节点会被推举出一个主节点,但是还没有传送到从节点的数据将永远丢失了。

六、redis常见性能问题和解决问题

1、Master最好不要做任何持久化,如RDB内存快照和AOF日志文件

2、如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

3、为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

4、尽量避免在压力很大的主库上增加从库

七、redis集群

Redis   Cluster是一个实现了分布式且允许单点故障的redis高级版本,没有中心节点,各个节点地位一致,具有线性可伸缩的功能。

redis集群优点:

1.主从备份,防止主机宕机。

2.读写分离,分担master的任务。

3.任务分离,分担工作与计算。

---------------------

方案

1.master下面有两个孩子,两个孩子直接指向master(树)

2.线性,第一个孩子指向master,第二个孩子指向第一个孩子

原理

主从通信:slave启动之后连接master,slave发出同步命令,slave拿到dump出的rdb快照,之后再拿缓冲aof队列中的日志数据进行数据填充。

---------master配置:

1.关闭rdb快照(备份工作交给slave)

2.可以开启aof

Redis   Cluster

1.分布式存储架构:

节点之间通过二进制协议进行通信,节点与客户端之间通过ASCII协议进行通信。

2.数据的放置策略:

Redis   Cluster将整个key的数值域分成16384个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis   Cluster支持的最大节点数就是16384.

Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统。

例:replicas  1 表示我们希望为集群中的每个主节点创建一个从节点,由于sedis的集群最少需要3个主节点,如果我们每个主节点需要一个从节点,那么最少需要6台机器(或者说6个实例)。

145、147、148这三个将成为主节点,140、141、143将依次称为主节点的从节点

 

16384个哈希槽,那么每一个哈希槽中存的key和value是什么?

当你往Redis  Cluster中加入一个key时,会根据crc16(key)mod   16384计算这个key应该分部到哪个hash  slot中,一个hash  slot中会有很多key和value。

你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis   Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key在哪个分区,每个分区里有很多key。

 

redis  cluster(集群)

3.0之后的功能,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了Redis高可用、可扩展等问题。

Redis集群提供了以下两个好处

1.将数据自动切分(split)到多个节点

2.当集群中的某一个节点故障时,redis还可以继续处理客户端的请求

一个redis集群包含16384个哈希槽(hash   slot),数据库中的每个数据都属于这16384个哈希槽中的一个。集群使用公式CRC16(key)%16384来计算键key属于哪个槽。

集群中的每一个节点负责处理一部分哈希槽。

 

集群中的主从复制

集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作。

这样集群就不会因为一个主节点的下线而无法正常工作。

 

注意:

1.如果某一个主节点和他所有的从节点都下线的话,redis集群就会停止工作了。redis集群不保证数据的强一致性,在特定的情况下,redis集群会丢失已经被执行过的写命令

2.使用异步复制(asynchronous   replication)是redis集群可能会丢失命令的其中一个原因,有时候由于网络原因,如果网络断开时间太长,redis集群就会启动新的主节点,之前发给主节点的数据就会丢失。

3.一个主节点可以有多个从节点

当从节点首次或者重连主节点时,主节点会进行后台存储,即将数据snapshot为磁盘上的rdp文件,也将rdp文件发给从节点进行存储。

后台存储过程中以及以后的产生的写操作,主节点都会异步的发送到从节点,从节点执行这些操作以保证数据同步。

默认情况下,从节点对客户端只提供读服务。

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

相关知识:redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

<think>好的,我现在需要帮助用户了解Redis的基础知识和核心概念。根据用户提供的引用内容,我需要整合这些信息,确保回答结构清晰,并符合之前的系统级指令。首先,我要确认用户的需求:他们想学习Redis的基础知识,可能包括数据类型、常用命令、Java客户端以及核心概念如键值操作和过期策略。 首先,我应该从Redis的定义开始,引用[4]提到Redis是远程字典服务,使用C语言编写,支持网络和内存持久化,是key-value数据库。这部分可以作为概述。 接下来是核心数据结构。用户引用的内容中提到了常见数据类型,如String、Hash、List、Set、ZSet,可能还有Stream和HyperLogLog。需要详细说明每种数据类型的用途和示例命令,比如SET/GET对应String,HSET/HGET对应Hash等。同时,需要注意行内数学表达式用$...$,但这里可能更多是命令示例,所以可能不需要数学格式,但如果有涉及变量或表达式,比如过期时间,就要用正确格式。 然后是键管理,引用[1]提到了键值操作和过期策略。需要解释KEYS、EXPIRE、TTL、DEL等命令,以及过期策略如定期删除和惰性删除。这里可能需要提到如何设置过期时间,比如EXPIRE key seconds,用$符号包裹命令中的变量,比如$EXPIRE$ key 60。 持久化机制方面,引用中没有直接提到,但根据常识,RDB和AOF是Redis的持久化方式,需要补充这部分内容,但可能用户提供的引用没有,所以需要确认是否在允许范围内。不过用户提供的引用可能没有这些信息,但根据问题,可能需要简要提及,但如果没有引用支持,可能需要跳过或注明。 高可用架构部分,引用[2]提到了哨兵模式和集群模式,可以在这里解释主从复制、哨兵和集群的作用,确保线程安全和高可用性。 Java客户端部分,引用[2]详细说明了Jedis、Lettuce和Redisson的区别和特点,需要分点说明每个客户端的优缺点,比如Jedis的线程不安全,需要连接池;Lettuce的线程安全和响应式支持;Redisson的分布式数据结构。 最后,应用场景部分,可以结合高性能、缓存、分布式锁等,引用[1]提到Redis在现代应用中的重要作用,可以举例如缓存、会话存储、排行榜等。 现在需要检查是否符合系统指令:行内数学表达式是否正确使用,比如命令中的变量是否需要使用$...$,例如EXPIRE key $seconds$?或者像EXPIRE这样的命令名称是否需要格式化?根据示例,用户可能在行内代码或命令中使用反引号,但系统指令要求数学表达式用$...$。可能这里的命令不需要数学格式,而是用代码块或反引号,但根据用户示例中的Python代码,他们使用```python代码块。但系统指令只提到数学表达式需要用$...$,其他代码可能用代码块。所以可能命令部分使用反引号,但根据用户提供的引用,他们可能没有使用,所以可能需要用行内代码或普通文本。 不过用户示例中的快速排序部分用到了代码块,所以可能Redis命令也应该用代码块,但用户引用中的命令是普通文本。需要明确:根据系统指令,数学表达式必须用$...$,而代码应该用代码块。所以当提到命令如SET key value时,应该用反引号或代码块,但用户示例中的Python代码用了代码块,所以可能Redis命令也应该用代码块,比如: ```bash SET user:1 "Alice" ``` 但需要看用户提供的引用是否这样使用。在用户提供的引用中,引用[2]提到了一些命令如Jedis的方法,但未用代码块,所以可能需要统一使用行内代码用反引号,或者根据情况处理。不过根据系统指令,只有数学表达式需要$...$,其他代码可能按常规处理。因此,可能命令部分使用反引号,例如`SET`、`HSET`等。 此外,引用标记需要放在相关内容的末尾,比如在提到键值操作时,引用[^1],在Java客户端部分引用[^2]等。 现在开始组织内容: 1. Redis概述:根据引用[4],简要介绍Redis是什么,特点。 2. 核心数据结构:列出数据类型,每种类型的说明和示例命令,引用[2]中的数据类型部分。 3. 键管理与过期策略:引用[1]中的键值操作和过期策略,说明相关命令和策略。 4. 持久化机制:可能需要简要提及,但引用中没有,所以可能不包含。 5. 高可用架构:哨兵和集群,引用[2]提到。 6. Java客户端:详细说明Jedis、Lettuce、Redisson,引用[2]。 7. 应用场景:引用[1]和[3]提到的高性能和现代应用角色。 最后生成相关问题,确保问题与内容相关,如数据类型、持久化、客户端选择、过期策略等。 需要确保所有引用正确标注,例如在键管理部分末尾加[^1],Java客户端部分加[^2],概述加[^4]等。 可能的结构: ### Redis 基础知识与核心概念 #### 1. Redis 概述 Redis(Remote Dictionary Server)是一个开源的键值存储数据库... #### 2. 核心数据结构 - **String**: 最基本类型,`SET user:1 "Alice"`... [^2] - **Hash**: 适合存储对象,`HSET user:1 name "Alice"`... ... #### 3. 键管理与过期策略 - **键操作命令**: `KEYS *`, `DEL key`... - **过期策略**: `EXPIRE key 60`,定期删除和惰性删除 #### 4. 高可用架构 主从复制、哨兵模式、集群模式 #### 5. Java 客户端 - **Jedis**: 简单但线程不安全... - **Lettuce**: 线程安全,支持响应式... - **Redisson**: 提供分布式数据结构... [^2] #### 6. 应用场景 缓存、会话存储、实时排行榜[^1][^3] 相关问题部分需要生成至少三个问题,可能涉及数据类型选择、过期策略比较、客户端优缺点等。</think>### Redis 基础知识与核心概念 #### 1. Redis 概述 Redis(Remote Dictionary Server)是一个高性能的开源键值数据库,使用 ANSI C 语言编写,支持网络访问和持久化存储。它以内存为主要存储介质,同时提供多种数据结构的灵活操作,广泛应用于缓存、消息队列等场景。 #### 2. 核心数据结构 Redis 支持多种数据类型,满足不同场景需求: - **String**:存储文本或二进制数据,支持原子操作。 示例命令:`SET user:1 "Alice"`、`GET user:1`。 - **Hash**:适合存储对象,字段可单独修改。 示例命令:`HSET user:1 name "Alice" age 30`、`HGET user:1 name`。 - **List**:双向链表,支持队列和栈操作。 示例命令:`LPUSH tasks "task1"`、`RPOP tasks`[^2]。 - **Set**:无序唯一集合,用于去重或交集运算。 示例命令:`SADD tags "redis" "database"`、`SINTER tags1 tags2`。 - **Sorted Set (ZSet)**:带权重的有序集合,适用于排行榜。 示例命令:`ZADD ranking 100 "Alice"`、`ZRANGE ranking 0 -1`。 - **Stream**:日志类型数据,支持消息队列模式。 - **HyperLogLog**:基数统计,高效估算去重数量。 #### 3. 键管理与过期策略 - **键操作命令**: - `KEYS *`:匹配所有键(生产环境慎用)。 - `EXPIRE key 60`:设置键过期时间为 $60$ 秒。 - `TTL key`:查看剩余生存时间。 - **过期策略**: - **定期删除**:随机抽查键并删除过期键。 - **惰性删除**:访问时检查过期状态,若过期则删除。 #### 4. 高可用架构 - **主从复制**:数据从主节点同步到从节点,实现读写分离。 - **哨兵模式**:自动监控节点状态,实现故障转移。 - **集群模式**:数据分片存储,支持横向扩展和高可用[^2]。 #### 5. Java 客户端 - **Jedis**:API 与 Redis 命令直接对应,简单易用,但需通过连接池保证线程安全[^2]。 - **Lettuce**:基于 Netty 实现,支持异步和响应式编程,线程安全且支持集群。 - **Redisson**:提供分布式锁、队列等高级功能,简化分布式系统开发。 #### 6. 应用场景 - **缓存**:加速热点数据访问,降低数据库压力[^1]。 - **会话存储**:集中管理用户会话状态[^1]。 - **实时排行榜**:通过 ZSet 快速实现动态排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值