简介
提示:理论+方法+小总结
Redis基本介绍:
Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储的内存数据库。这里要区分开MySQL:
它支持多种基础数据结构
1、字符串(Strings)
2、哈希(Hashes)
3、列表(Lists)
4、集合(Sets
5、有序集合(Sorted Sets)
以及更高级的数据结构如
1、位图(Bitmaps)
2、超日志(Hyperloglogs)
4、地理空间索引(Geo indexes)
性能:
作为内存数据库,Redis的读写性能极高,能够支持每秒万级甚至百万级的读写操作,非常适合需要快速读写操作的场景。
持久性和复制:
虽然Redis是基于内存的,但它支持数据的持久化。可以通过RDB(快照)或AOF(append-only file)方式将内存中的数据定期或实时保存到磁盘上,确保数据安全。此外,Redis支持主从复制功能,提高数据的可用性和冗余。
补充——重点:
抛开Redis在java项目开发中:不论是elasticsearch还是Rocketmq等等诸多中间件和框架只要是涉及到会存储的那么都是如下的思想:
1、定时
2、定量
这两种在和:同步、异步进行组合:
最终结果为:
定时-同步刷盘
定时-异步刷盘
定量-同步刷盘
定量-异步刷盘
从性能角度来讲:定量-异步刷盘性能最高,从数据安全性角度来讲:定时-同步刷盘安全性最高性能最低。
Redis额外支持的操作:
Redis不但支持基本的键值操作,还提供复杂的数据结构操作,如事务、管道(pipeline)、Lua脚本、发布/订阅模式等
使用场景:
Redis由于其高性能的特性,通常被用于以下场景:
1、缓存系统:减少数据库负载,提供快速响应;
2、会话存储:如Web应用中的用户会话管理;
3、消息队列:因其支持发布订阅模式(pub/sub);
4、实时分析:如计算在线用户数、排行榜等;
5、地理空间数据:支持地理空间索引和范围查询。
与Java的集成:
在Java应用中,可以通过使用Jedis、Redisson、redisTemplate、Lettuce等客户端库来和Redis进行交互。这些库提供API来执行Redis命令,处理连接池,以及实现复杂的功能如分布式锁等。
但是通常建议使用Redisson,这里提供的功能更多,如看门狗机制
Redis集群
Redis拥有多种集群解决方案,以提供高可用性和水平扩展功能。以下是几种常见的Redis集群配置和它们的特点:
Redis Sentinel
描述:主从复制的模式增加了Redis Sentinel系统以实现高可用性。Sentinel负责监控所有Redis节点,并在主节点故障时自动进行故障转移(Process Failover)。
优点:
1、故障发现和自动故障转移。
2、可以继续使用单个Redis实例,无需修改客户端代码。
缺点:
不提供自动分片,因此不能直接用于数据水平扩展;由于使用异步复制,仍有数据丢失的风险。
适用场景:
要求高可用但数据量不是特别巨大的场景。
Redis Cluster
描述:一个分布式数据库系统,通过自动将数据分片到多个Redis实例中来提供水平扩展和高可用性。
优点:
1、自动分片,可水平扩展;
2、支持主从复制,并提供故障转移功能;
3、无单点故障(No single point of failure,NSPF)。
缺点:
1、客户端需要支持Redis Cluster协议;
2、分片机制可能会限制某些复杂操作,例如,有些事务和键操作要求数据位于同一节点上。
适用场景:
大规模数据集和高吞吐量要求场景。
除了以上两种官方支持的解决方案外,还有一些社区或云服务提供商实现的Redis高可用和分布式解决方案:
Codis
描述:基于代理的Redis分片解决方案,通过增加一个代理层来实现Redis的水平扩展。
优点:
1、对客户端透明,不需要特别的客户端支持;
2、提供图形界面管理工具;
3、动态扩缩容。
缺点:
1、新增了代理层,增加了系统复杂性;
2、不是Redis官方支持的,社区维护可能不如官方活跃。
适用场景:
操作简单,需要容易管理的环境下的中小型Redis集群。
Redis Enterprise
描述:Redis官方推出的企业版本,提供自动分片、持久化、备份、高可用等功能。
优点:
1、官方支持,稳定性和性能有保障;
2、集成了许多高级功能,例如自动重平衡、热升级;
3、提供图形界面的管理平台。
缺点:
1、商业化产品,需要付费;
2、对开源社区选型有一定限制。
适用场景:
对性能和稳定性有非常高要求的企业级应用。
选择不同的Redis集群方案时,需要权衡数据规模、易用性、成本、客户端支持等因素。对于大部分应用来说,Redis官方提供的Sentinel和Cluster方案已经能够很好地满足需求。在一些特定的、对集群管理有更复杂要求的场景下,则可以考虑使用如Codis或Redis Enterprise等其他解决方案。
补充
我之前没有单独列出"主从复制"作为一种集群配置,但实际上它是Redis提供高可用性的基础,并且在Redis Sentinel和Redis Cluster中都扮演重要的角色。我们可以将主从复制单独说明:
主从复制(Replication)
主从复制是Redis支持的一种数据复制方式,它允许一个或多个副本(从服务器),实时地复制主服务器的数据。它的配置简单,主要用于数据的冗余备份、读写分离和提高数据安全性。
优点:
1、数据冗余:提供数据的多个副本,可以用于灾难恢复。
2、读写分离:读操作可以分布到多个从节点,减轻主节点压力。
3、数据备份:可在从节点上进行持久化操作,避免影响主节点性能。
4、可扩展性:通过增加从节点来水平扩展读取能力。
缺点:
1、写操作不可扩展:所有写操作仍然需要通过主节点,主节点成为瓶颈。
2、不自动故障转移:如果主节点宕机,需要人工介入或额外的工具(如Sentinel)进行故障转移。
3、数据存在延迟:从节点的数据同步可能存在延迟,不能保证强一致性。
适用场景:
1、数据备份和灾难恢复。
2、当应用对读取性能要求高,而对写入性能和强一致性要求不高时,可以搭配多从节点以分散读压力。
3、作为复杂高可用解决方案(如Sentinel和Cluster)的一部分。
4、主从复制通常是高可用和负载均衡配置的基础。
比如,在Redis Sentinel中,Sentinel负责监控主从服务器并自动执行故障转移操作。在Redis Cluster中,各个分片(shard)内部也会使用主从复制来确保数据的高可用性。
因此,即使没有单独列出主从复制作为一个集群配置选项,它实际上是构成其他高可用集群解决方案的关键组件。
数据结构
数据结构分析——操作
提示:先操作后思想+面试
Redis提供了多种数据结构,每种结构都适合不同的使用场景。下面是Redis支持的常用数据结构及其典型使用场景:
字符串(String)
场景:缓存用户信息、会话(Session)信息、计数器、分布式锁的值。
描述:可以包含任何数据,例如文本、数字或者序列化的对象。
操作
# 增
SET user:1 "John Doe"
# 删
DEL user:1
# 改
SET user:1 "Jane Doe"
# 查
GET user:1
底层数据结构
字符串在Redis中是最基本的数据类型,实际上是动态字符串sds(simple dynamic string)。
Redis的字符串是二进制安全的,可以包含任意数据,比如jpeg图片或序列化的对象。
特点:动态字符串意味着字符串长度可以在运行时修改,不像C语言的字符串以空字符终止,支持高效的长度计算和字符串追加操作。
哈希(Hash)
场景:存储对象数据,如用户的属性,避免频繁的加载和存储整个对象。
描述:键值对集合,适合存储对象。
操作
# 增
HSET user:2 name "Alice" age "30" city "Wonderland"
# 删
# 删除特定字段
HDEL user:2 city
# 删除整个哈希
DEL user:2
# 改
HSET user:2 age "31"
# 查
HGET user:2 name
HGETALL user:2
底层数据结构
哈希在小数据集下使用ziplist(压缩列表),在数据量变大时转而使用hashtable。ziplist是Redis为内存优化设计的数据结构,压缩空间但对于元素的增删改查可能相对较慢。
特点:当哈希内的字段数量增长,或单个字段值超过某个阈值时,底层数据结构从ziplist升级到hashtable。
列表(List)
场景:实现队列(FIFO)或栈(LIFO)结构,比如消息队列。
描述:有序集合,按插入顺序排序。
操作
# 增
LPUSH friends:1 "Bob"
RPUSH friends: