分布式缓存Redis使用方法

合集下载

华为云分布式缓存服务(DCS) 1.10.0 用户指南说明书

华为云分布式缓存服务(DCS) 1.10.0 用户指南说明书

分布式缓存服务(DCS) 1.10.0用户指南文档版本01发布日期2023-03-30版权所有 © 华为云计算技术有限公司 2023。

保留一切权利。

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。

商标声明和其他华为商标均为华为技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意您购买的产品、服务或特性等应受华为云计算技术有限公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。

除非合同另有约定,华为云计算技术有限公司对本文档内容不做任何明示或暗示的声明或保证。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。

除非另有约定,本文档仅作为使用指导,本文档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

华为云计算技术有限公司地址:贵州省贵安新区黔中大道交兴功路华为云数据中心邮编:550029网址:https:///目录1 快速入门 (1)1.1 创建实例 (1)1.1.1 创建前准备 (1)1.1.2 准备实例依赖资源 (2)1.1.3 创建Redis实例 (3)1.2 查看实例信息 (5)2 用户指南 (8)2.1 登录分布式缓存服务 (8)2.2 实例日常操作 (8)2.2.1 变更规格 (8)2.2.2 重启实例 (11)2.2.3 删除实例 (12)2.2.4 主备切换 (13)2.2.5 清空实例数据 (14)2.2.6 导出实例列表 (15)2.2.7 命令重命名 (15)2.3 实例配置管理 (16)2.3.1 配置管理说明 (16)2.3.2 修改实例配置参数 (16)2.3.3 修改实例安全组 (24)2.3.4 查看实例后台任务 (24)2.3.5 查看Redis 3.0 Proxy集群实例的数据存储统计信息 (25)2.3.6 管理分片与副本 (26)2.3.7 管理实例白名单 (27)2.3.8 查询Redis实例慢查询 (28)2.3.9 查询Redis实例运行日志 (29)2.4 实例备份恢复管理 (30)2.4.1 备份与恢复说明 (30)2.4.2 设置自动备份策略 (32)2.4.3 手动备份实例 (33)2.4.4 实例恢复 (34)2.4.5 下载实例备份文件 (35)2.5 使用DCS迁移数据 (36)2.5.2 备份文件导入方式 (37)2.5.2.1 备份文件导入方式-OBS桶 (38)2.5.2.2 备份文件导入方式-Redis实例 (40)2.5.3 在线迁移方式 (41)2.6 密码管理 (45)2.6.1 关于实例连接密码的说明 (45)2.6.2 修改缓存实例密码 (46)2.6.3 重置缓存实例密码 (47)2.6.4 修改Redis实例的访问方式 (48)2.7 用户Redis切换DCS Redis操作指导 (49)2.7.1 概述 (49)2.7.2 创建DCS Redis实例 (50)2.7.3 迁移用户Redis数据 (50)2.7.3.1 备份文件导入方式-OBS桶 (50)2.7.3.2 在线迁移方式 (51)2.7.3.2.1 约束条件 (51)2.7.3.2.2 在线迁移实施步骤 (51)2.7.4 数据完整性校验 (53)2.7.5 切换访问DCS Redis (53)2.7.6 业务功能验证 (54)2.8 参数模板 (54)2.8.1 查看参数模板信息 (54)2.8.2 创建自定义参数模板 (60)2.8.3 修改自定义参数模板 (66)2.8.4 删除自定义参数模板 (73)2.9 监控 (74)2.9.1 支持的监控指标 (74)2.9.2 查看监控指标 (95)3 最佳实践 (96)3.1 使用DCS实现热点资源顺序访问 (96)3.2 使用Redis实现排行榜功能 (101)3.3 Redis使用规范 (103)3.4 Redis客户端重试指南 (110)3.5 使用主备切换功能验证应用是否实现自动重连 (113)4 常见问题 (115)4.1 实例类型/版本 (115)4.1.1 版本差异 (115)4.1.2 如何查询Redis实例的原生版本 (116)4.1.3 DCS Redis 4.0支持的新特性说明 (116)4.1.4 DCS Redis 5.0支持的新特性说明 (120)4.2 客户端和网络连接 (125)4.2.2 DCS实例支持弹性IP访问吗? (126)4.2.3 DCS实例是否支持跨VPC访问? (126)4.2.4 客户Http的Server端关闭导致Redis访问失败 (127)4.2.5 客户端出现概率性超时错误 (127)4.2.6 使用Jedis连接池报错如何处理? (127)4.2.7 客户端访问Redis实例出现“ERR unknown command”的原因是什么? (129)4.2.8 如何使用Redis-desktop-manager访问Redis实例? (129)4.2.9 使用SpringCloud时出现ERR Unsupported CONFIG subcommand怎么办? (130)4.2.10 Redis实例连接失败的原因排查 (131)4.2.11 连接池选择及Jedis连接池参数配置建议 (131)4.2.12 使用Redis实例的发布订阅(pubsub)有哪些注意事项? (134)4.3 Redis使用 (134)4.3.1 Redis实例CPU使用率达到100%的原因 (134)4.3.2 Redis实例能否修改VPC和子网? (134)4.3.3 Redis 4.0/5.0实例为什么没有安全组信息? (134)4.3.4 Redis实例支持的单个Key和Value数据大小是否有限制? (134)4.3.5 Redis集群可以读取每个节点的IP地址吗? (135)4.3.6 创建缓存实例,为什么可使用内存比实例规格少一些? (135)4.3.7 Redis实例是否支持多DB方式? (135)4.3.8 Redis集群实例是否支持原生集群? (135)4.3.9 Redis实例是否支持配置哨兵模式? (135)4.3.10 Redis默认的数据逐出策略是什么? (135)4.3.11 使用redis-exporter出错怎么办? (136)4.3.12 Redis3.0 Proxy集群不支持redisson分布式锁的原因 (136)4.3.13 实例是否支持自定义或修改端口? (136)4.3.14 实例是否支持修改访问地址? (137)4.3.15 DCS实例是否支持跨可用区部署? (137)4.3.16 集群实例启动时间过长是什么原因? (137)4.3.17 客户使用Redis版本和DCS Redis版本不同是否存在兼容问题? (137)4.3.18 DCS Redis有没有后台管理软件? (137)4.3.19 Redis实例经常内存满了但是key不多的原因 (137)4.3.20 DCS缓存实例的数据被删除之后,能否找回? (138)4.3.21 访问Redis返回“Error in execution” (138)4.3.22 Redis key丢失是什么原因 (138)4.3.23 重启实例后缓存数据会保留吗? (138)4.4 Redis命令 (138)4.4.1 如何清空Redis数据? (139)4.4.2 高危命令如何重命名? (139)4.4.3 是否支持pipeline命令? (139)4.4.4 Redis是否支持INCR/EXPIRE等命令? (139)4.4.5 Redis命令执行失败的可能原因 (140)4.4.7 Redis命令执行是否有超时时间?超时了会出现什么结果? (141)4.5 扩容缩容与实例升级 (141)4.5.1 Redis实例是否支持版本升级?如Redis4.0升级到Redis5.0? (141)4.5.2 DCS实例规格变更是否需要关闭或重启实例? (141)4.5.3 DCS实例规格变更的业务影响 (141)4.5.4 Redis实例变更失败的原因 (142)4.6 监控告警 (143)4.6.1 如何查看Redis实例的实时并发连接数和最大连接数 (143)4.6.2 Redis命令是否支持审计? (143)4.6.3 Redis监控数据异常处理方法 (143)4.6.4 为什么实例实际可用内存比申请规格小而且已使用内存不为0? (143)4.6.5 监控数据出现实例已使用内存略大于实例可使用内存是什么原因? (144)4.6.6 为什么带宽使用率指标会超过100% (144)4.6.7 监控指标中存在已拒绝连接数是什么原因? (144)4.7 数据备份/导出/迁移 (145)4.7.1 如何导出Redis实例数据? (145)4.7.2 是否支持控制台导出RDB格式的Redis备份文件? (145)4.7.3 迁移过程中为什么进程总是被kill? (145)4.7.4 Redis在线数据迁移是迁移整个实例数据么? (146)4.7.5 DCS支持数据持久化吗?开启持久化有什么影响? (146)4.7.6 AOF文件在什么情况下会被重写 (146)4.7.7 使用Rump在线迁移 (147)4.8 主备倒换 (148)4.8.1 发生主备倒换的原因有哪些? (148)4.8.2 主备倒换的业务影响 (148)4.8.3 主备实例发生主备倒换后是否需要客户端切换IP? (148)4.8.4 Redis主备同步机制怎样? (148)5 错误码 (150)5.1 111400111 实例重启中,请稍后重试 (150)5.2 111400113 实例正在规格变更中,请稍后重试 (150)5.3 111403002 租户只有只读权限,无法操作DCS (150)5.4 DCS.2007 您的权限不足 (151)5.5 dcs.08.0002 操作超时 (151)5.6 111403003 角色没有操作权限,无法执行此操作 (151)5.7 111400010 实例名称不合法,请以字母,中文,或数字开头,且只能包含中文、字母、数字、下划线或者中划线,长度为4-64 (152)5.8 111400096 当前实例正在备份中,请稍后再试 (152)5.9 111400011 实例描述长度必须为0~1024 (152)5.10 111400017 实例正在执行后台任务 (153)5.11 111400020 子网的DHCP必须开启 (153)5.12 111400019 密码复杂度不符合要求 (153)5.13 DCS.4026 实例的当前状态不支持此操作 (154)5.14 111400027 当前节点不支持该操作 (154)5.15 111400035 租户实例配额不足 (154)5.16 111400039 请求调整配额超出限制范围 (155)5.17 111400036 租户内存配额不足 (155)5.18 111400042 可用区不存在。

redis基本用法

redis基本用法

redis基本用法Redis是一种高性能的键值存储数据库,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。

以下是Redis的基本用法:1. 安装Redis在Linux系统上,可以使用命令行安装Redis:sudo apt-get updatesudo apt-get install redis-server2. 启动Redis启动Redis服务器可以使用以下命令:redis-server3. 连接到Redis可以使用以下命令连接到正在运行的Redis服务器:redis-cli4. 存储和获取数据存储数据可以使用SET命令:SET key value获取数据可以使用GET命令:GET key5. 删除数据可以使用DEL命令删除一个或多个键值对:DEL key1 key2 ...6. 数据类型Redis支持五种主要的数据类型:字符串、哈希表、列表、集合和有序集合。

7. 字符串操作字符串是最简单的数据类型。

可以使用SET和GET命令存储和获取字符串。

其他常用的字符串操作包括APPEND(追加字符串)、INCR (增加数字)、DECR(减少数字)等。

8. 哈希表操作哈希表是一种键值对集合。

可以使用HSET和HGET命令存储和获取哈希表中的元素。

其他常用的哈希表操作包括HDEL(删除元素)、HLEN(获取元素数量)等。

9. 列表操作列表是一系列有序的元素。

可以使用LPUSH和RPUSH命令向列表中添加元素,使用LPOP和RPOP命令从列表中取出元素。

其他常用的列表操作包括LLEN(获取列表长度)、LRANGE(获取指定范围内的元素)等。

10. 集合操作集合是一组无序的唯一元素。

可以使用SADD和SMEMBERS命令向集合中添加元素,使用SREM命令删除元素。

其他常用的集合操作包括SCARD(获取集合大小)、SINTER(获取多个集合的交集)等。

11. 有序集合操作有序集合是一组有序的唯一元素。

thinkphp rediscluster 使用方式

thinkphp rediscluster 使用方式

thinkphp rediscluster 使用方式ThinkPHP 是一款流行的PHP开发框架,它为开发者提供了丰富的功能和便利的开发环境。

其中,RedisCluster 是一个基于Redis 的分布式集群解决方案,可以帮助我们搭建高性能和高可用性的Redis 集群环境。

本文将详细介绍ThinkPHP 中如何使用RedisCluster,包括安装、配置和使用详解等内容。

第一部分:安装RedisCluster在开始使用RedisCluster 之前,我们需要确保RedisCluster 已经安装在开发环境中。

以下是安装RedisCluster 的步骤:1. 下载RedisCluster 扩展:你可以在GitHub 上找到RedisCluster 的源码,并从中获取最新的扩展包。

2. 解压扩展包:将下载的扩展包解压到你的本地文件系统中。

3. 编译扩展包:进入解压后的目录,并执行以下命令进行编译:phpize./configuremake && make install4. 修改php.ini 配置文件:找到你的php.ini 配置文件,并添加以下内容:extension=rediscluster.so5. 重新启动PHP:重启你的Web 服务器或PHP-FPM 进程,以使配置生效。

安装完成后,你可以通过运行`php -m grep rediscluster` 命令来验证RedisCluster 是否已经成功安装。

第二部分:配置RedisCluster在使用ThinkPHP 中的RedisCluster 功能之前,我们需要进行相应的配置。

以下是配置RedisCluster 的步骤:1. 打开ThinkPHP 的配置文件:在你的项目根目录下,找到`config` 目录,并打开`cache.php` 配置文件。

2. 配置RedisCluster 参数:在`cache.php` 文件中,搜索`redis` 配置项,并根据下面的示例进行修改:php'redis' => ['type' => 'redis','host' => '127.0.0.1','port' => 6379,'password' => '','timeout' => 3600,],- `type`:指定使用RedisCluster。

Redis分布式锁实现与应用场景分析

Redis分布式锁实现与应用场景分析

Redis分布式锁实现与应用场景分析分布式锁是在分布式系统中常用的一个技术,用于保证多个进程或线程对共享资源的互斥访问。

在分布式环境下,由于多个节点之间的通信延迟和不稳定性,传统的锁机制无法直接使用。

Redis是一个高性能的分布式缓存和存储系统,其内置的原子性操作和分布式特性使其成为实现分布式锁的理想工具。

本文将介绍Redis分布式锁的实现原理和常见的应用场景。

一、Redis分布式锁实现原理为了保证分布式锁的正确性和可靠性,Redis采用了基于SETNX (SET if Not eXists)指令和过期时间的方式来实现分布式锁。

1. SETNX指令SETNX指令是Redis中的一个原子性指令,用于将一个键值对设置到Redis中,仅在键不存在时才执行。

可以利用SETNX指令的原子性来实现分布式锁。

2. 过期时间为了防止锁死的情况出现,Redis分布式锁还需要设置一个合适的过期时间。

当获取到锁的客户端在执行完业务逻辑后,可以手动删除锁,或者利用锁的过期时间自动释放。

二、Redis分布式锁的实现步骤下面将介绍Redis分布式锁的典型实现步骤:1. 获取锁客户端使用SETNX指令尝试将一个唯一的键值对设为1,如果设置成功,则表示获取到了锁。

2. 设置过期时间获取到锁的客户端需要为该锁设置一个适当的过期时间,以防止锁长时间占用。

3. 执行业务逻辑获取到锁的客户端可以执行自己的业务逻辑。

4. 释放锁业务逻辑执行完毕后,客户端需要删除该锁,或者让锁自动过期。

三、Redis分布式锁的应用场景Redis分布式锁在很多场景下都能发挥重要作用,下面介绍一些常见的应用场景。

1. 资源互斥访问在多个进程或线程同时对共享资源进行读写操作时,需要保证资源的互斥访问。

通过使用Redis分布式锁可以实现资源的串行化访问,避免并发操作引发的数据不一致等问题。

2. 防止缓存击穿当某个热点数据的缓存过期时,多个请求同时访问该数据,可能引发缓存击穿的问题,导致大量请求打到数据库上。

Redis分布式系统的数据一致性保证方法

Redis分布式系统的数据一致性保证方法

Redis分布式系统的数据一致性保证方法Redis是一种开源的分布式系统,被广泛用于缓存、队列和数据存储等场景。

在分布式环境中,数据一致性是一个重要的问题,因为多个节点之间的数据同步可能会出现延迟或者错误。

为了保证Redis分布式系统的数据一致性,我们可以采用以下几种方法:一、主从复制(Master-Slave Replication)主从复制是Redis最常用的一种数据一致性保证方法。

在主从复制中,一个节点(称为Master节点)将自己的数据复制到一个或多个从节点(Slaves节点)。

当Master节点的数据发生变化时,它会将变化的数据同步给所有的从节点,从节点接收并应用这些变化,以保持数据的一致性。

主从复制的优点是简单可靠,从节点可以提供读取服务而不影响Master节点的性能。

然而,主从复制并不能保证数据的强一致性,因为从节点接收到的变化可能存在一定的延迟。

二、哨兵模式(Sentinel)哨兵模式是Redis提供的高可用性解决方案之一。

在哨兵模式中,多个节点组成一个群集,其中一个节点被选为Master节点,其他节点作为从节点。

哨兵节点负责监控Master节点的状态,并在Master节点宕机时自动切换到一个可用的从节点作为新的Master节点。

哨兵模式通过Master节点的自动切换保证了系统的高可用性,但并不能解决数据一致性问题。

当Master节点发生切换时,新的Master节点会从旧的Master节点同步数据,但这个过程可能存在一定的延迟。

三、cluster模式Redis的cluster模式是一种分布式解决方案,可以将数据分布在多个节点上,提供高可用性和性能扩展。

在cluster模式中,Redis将数据分片存储在多个节点上,并通过Gossip协议进行节点间的通信和数据同步。

cluster模式通过数据分片和自动的数据迁移保证了系统的可用性和性能扩展,但并不能保证强一致性。

由于数据分片和数据迁移的过程中可能存在并发操作和网络延迟,数据一致性需要开发人员自行保证。

redisclient中setex方法

redisclient中setex方法

redisclient中setex方法简介R e di s是一款高性能的内存数据库,常用于缓存、队列和分布式锁等应用场景。

在Re dis的Ja va客户端中,r ed is cl ie nt是一个常用的工具,它提供了一系列方便的操作方法。

本文将重点介绍re di sc l ie nt中的s et ex方法。

什么是sete x方法s e te x方法是re di sc l ie nt中一个常用的方法,它用于向Re d is中设置一个带有过期时间的键值对。

"S et ex"在R ed is中代表了"S et wi th Ex pi ra tio n",通过此方法,我们可以在R ed is中设置一个键值对,并指定该键值对的过期时间。

sete x方法的语法s e te x方法的语法如下:s e te x(St ri ng ke y,i n ts ec on ds,S tr ing v al ue)*k ey:用于存储键值对的ke y,必须是一个字符串。

*s ec on ds:键值对的过期时间,单位为秒。

*v al ue:k ey对应的v a lu e值,必须是一个字符串。

sete x方法的用途s e te x方法广泛应用于缓存场景。

例如,我们可以将经常访问的数据存储在R ed is的缓存中,并通过se tex方法设置一个较短的过期时间,以保持缓存的新鲜度。

当数据过期后,系统会重新从数据库中获取最新的数据并更新到缓存中。

sete x方法的示例下面是一个使用s ete x方法的示例:p u bl ic cl as sR ed isE x am pl e{p u bl ic st at ic vo idm a in(S tr in g[]a rgs){R e di sC li en tr ed isC l ie nt=n e w Re di sCl i en t("l oc al ho st",6379);J e di sj ed is=r ed isC l ie nt.g et Je di s();//设置一个键值对,并指定过期时间为60秒j e di s.se te x("k ey1",60,"v al ue1");//获取键k ey1的值S t ri ng va lu e=je dis.ge t("k ey1");S y st em.o ut.p ri ntl n("Va lu eo fk ey1:"+va lu e);//等待70秒后再次获取键k ey1的值t r y{T h re ad.s le ep(70000);}c at ch(I nt er ru pte d Ex ce pt io ne){e.pr in tS ta ck Tr ace();}v a lu e=je di s.ge t("k ey1");S y st em.o ut.p ri ntl n("Va lu eo fk ey1af t er ex pi ra ti on:"+v al ue);j e di s.cl os e();}}在上述示例中,我们首先创建了一个R edi s Cl ie nt实例,并获取了一个J ed is对象。

rediscacheclient 用法-概述说明以及解释

rediscacheclient 用法-概述说明以及解释

rediscacheclient 用法-概述说明以及解释1.引言1.1 概述概述部分的内容可以参考以下示例:引言部分将简要介绍本文的主题——rediscacheclient的用法。

Redis 是一个高性能的键值数据库,常被用作缓存服务器。

而rediscacheclient 则是Redis客户端的一个常见实现,旨在简化与Redis的交互、存取数据以及其他相关操作。

在本篇文章中,我们将详细介绍rediscacheclient的定义、作用以及基本用法。

首先,我们将介绍rediscacheclient是什么,其理念及目标,以帮助读者更好地理解该工具的用途和意义。

接下来,我们将深入探讨rediscacheclient的基本用法。

通过实际的代码示例和详细解释,我们将演示如何连接到Redis服务器、创建缓存、获取缓存以及其他关键操作。

这将有助于读者快速上手并充分利用rediscacheclient提供的功能。

最后,我们将总结rediscacheclient的优点,并提出一些建议,在特定情境下如何更好地运用rediscacheclient。

这将帮助读者更好地理解和应用rediscacheclient,提升其在项目开发中的效率和性能。

总而言之,本文通过深入介绍rediscacheclient的概念、用法和优势,旨在帮助读者更好地理解和应用该工具。

接下来,我们将进入正文部分,详细讲解rediscacheclient的定义和作用。

文章结构部分(1.2 文章结构)的内容是对整篇文章的组织和布局进行描述。

在本文中,文章结构分为引言、正文和结论三个部分。

引言部分(1.1 概述、1.2 文章结构、1.3 目的)旨在向读者介绍本文的主题和目的,并提供整篇文章的框架。

正文部分(2.正文)是重点部分,其中包括2.1 rediscacheclient的定义和作用以及2.2 rediscacheclient的基本用法。

在这一部分中,我们将详细介绍rediscacheclient的定义、作用以及如何使用它来实现缓存功能。

Redis缓存常见问题及解决方案

Redis缓存常见问题及解决方案

Redis缓存常见问题及解决方案在开发过程中,缓存被广泛使用以提高应用程序的性能和可伸缩性。

Redis是一种流行的内存缓存解决方案,但它也存在一些常见问题。

本文将讨论这些问题,并提供解决方案,以帮助开发人员更好地使用Redis缓存。

1. 内存占用过高Redis将数据存储在内存中,因此内存占用是一个重要考虑因素。

当存储的数据量大于可用内存时,Redis可能会出现内存溢出,导致系统崩溃。

为了解决这个问题,可以考虑以下解决方案:- 使用LRU算法或Redis的过期策略来淘汰旧的或不常访问的数据。

- 将冷数据移到磁盘上,通过Redis的持久化机制进行持久化存储。

2. 数据一致性Redis的数据存储是在内存中进行的,这使得数据一致性成为一个挑战。

在某些情况下,Redis可能会由于服务器故障或其他原因导致数据丢失。

为了确保数据的一致性,可以采取以下措施:- 使用Redis的持久化机制,将数据定期写入磁盘进行备份。

- 设置Redis的复制机制,将数据复制到多个节点,以实现高可用性和容错性。

3. 内存泄漏由于Redis存储在内存中,如果应用程序没有正确管理资源,可能会导致内存泄漏。

为了防止内存泄漏,可以采取以下方法:- 使用合适的过期时间和淘汰策略,避免数据在缓存中永久存在。

- 定期监控Redis节点的内存使用情况,并及时发现和处理潜在的内存泄漏问题。

4. 性能瓶颈随着应用程序的扩展和数据量的增长,Redis的性能可能会受到限制。

为了克服性能瓶颈,可以考虑以下措施:- 将数据分片到多个Redis节点,以提高并发性能。

- 使用Redis集群来实现分布式缓存,从而提高性能和可伸缩性。

- 对Redis的操作进行优化,使用合适的数据结构和算法,减少不必要的内存和CPU开销。

5. 高并发访问当有大量并发访问Redis时,可能会导致请求堆积和性能下降。

为了应对高并发访问,可以采取以下措施:- 使用连接池来管理与Redis的连接,以提高连接复用率和性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 分布式缓存Redis使用方法 作者:张小博,新炬网络技术专家。 缓存在系统中的作用: 1、少量数据存储,高速读写访问。通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。

2、海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。Redis3.0以后开始支持集群,实现了半自动化的数据分片,不过需要smart-client的支持。

Redis全角度介绍: 网络模型:Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。

内存管理:Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。

数据一致性问题:在一致性问题上,个人感觉redis没有memcached实现的好,Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。

支持的KEY类型:Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供 2

了持久化和复制等功能。 客户端支持:redis官方提供了丰富的客户端支持,包括了绝大多数编程语言的客户端,比如我此次测试就选择了官方推荐了Java客户端Jedis.里面提供了丰富的接口、方法使得开发人员无需关系内部的数据分片、读取数据的路由等,只需简单的调用即可,非常方便。

数据复制:从2.8开始,Slave会周期性(每秒一次)发起一个Ack确认复制流(replication stream)被处理进度, Redis复制工作原理详细过程如下:

1. 如果设置了一个Slave,无论是第一次连接还是重连到Master,它都会发出一个SYNC命令;

2. 当Master收到SYNC命令之后,会做两件事: a) Master执行BGSAVE:后台写数据到磁盘(rdb快照); b) Master同时将新收到的写入和修改数据集的命令存入缓冲区(非查询类); 3. 当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传送给Slave,而Slave则把内存清空后,加载该文件到内存中;

4. 而Master也会把此前收集到缓冲区中的命令,通过Reids命令协议形式转发给Slave,Slave执行这些命令,实现和Master的同步;

5. Master/Slave此后会不断通过异步方式进行命令的同步,达到最终数据的同步一致;

6. 需要注意的是Master和Slave之间一旦发生重连都会引发全量同步操作。但在2.8之后,也可能是部分同步操作。

2.8开始,当Master和Slave之间的连接断开之后,他们之间可以采用持续复制处理方式代替采用全量同步。

Master端为复制流维护一个内存缓冲区(in-memory backlog),记录最近发送的复制流命令;同时,Master和Slave之间都维护一个复制偏移量(replication offset)和当前Master服务器ID(Master run id)。当网络断开,Slave尝试重连时:

a. 如果MasterID相同(即仍是断网前的Master服务器),并且从断开时到当前时 3

刻的历史命令依然在Master的内存缓冲区中存在,则Master会将缺失的这段时间的所有命令发送给Slave执行,然后复制工作就可以继续执行了;

b. 否则,依然需要全量复制操作。 读写分离:redis支持读写分离,而且使用简单,只需在配置文件中把redis读服务器和写服务器进行配置,多个服务器使用逗号分开如下:

WriteServerList="192.168.2.71:6379" ReadServerList="192.168.2.71:6379,192.168.2.71:6380" MaxWritePoolSize="60" MaxReadPoolSize="60" AutoStart="true" LocalCacheTime="180" RecordeLog="false"> 水平动态扩展:历时三年之久,终于等来了期待已由的Redis 3.0。新版本主要是实现了Cluster的功能,增删集群节点后会自动的进行数据迁移。实现 Redis 集群在线重配置的核心就是将槽从一个节点移动到另一个节点的能力。 因为一个哈希槽实际上就是一些键的集合, 所以 Redis 集群在重哈希(rehash)时真正要做的, 就是将一些键从一个节点移动到另一个节点。

数据淘汰策略:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 4

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据

集群(分布式) 下面详细介绍一下redis的集群功能,从3.0以后的版本开始支持集群功能,也就是正真意义上实现了分布式。

Redis 集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset)。

Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability)。

Redis 集群为了保证一致性(consistency)而牺牲了一部分容错性: 系统会在保证对网络断线(net split)和节点失效(node failure)具有有限(limited)抵抗力的前提下, 尽可能地保持数据的一致性。

集群特性: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

Redis 集群实现的功能子集: 5

Redis 集群实现了单机 Redis 中, 所有处理单个数据库键的命令。针对多个数据库键的复杂计算操作, 比如集合的并集操作、合集操作没有被实现, 那些理论上需要使用多个节点的多个数据库键才能完成的命令也没有被实现。在将来, 用户也许可以通过 MIGRATE COPY 命令, 在集群的计算节点(computation node)中执行针对多个数据库键的只读操作, 但集群本身不会去实现那些需要将多个数据库键在多个节点中移来移去的复杂多键命令。

Redis 集群不像单机 Redis 那样支持多数据库功能, 集群只使用默认的 0 号数据库, 并且不能使用 SELECT 命令。

Redis 集群协议中的客户端和服务器: Redis 集群中的节点有以下责任: 1、持有键值对数据。 2、记录集群的状态,包括键到正确节点的映射(mapping keys to right nodes)。 3、自动发现其他节点,识别工作不正常的节点,并在有需要时,在从节点中选举出新的主节点。

为了执行以上列出的任务, 集群中的每个节点都与其他节点建立起了“集群连接(cluster bus)”, 该连接是一个 TCP 连接, 使用二进制协议进行通讯。

节点之间使用 Gossip 协议 来进行以下工作: 1、传播(propagate)关于集群的信息,以此来发现新的节点。 2、向其他节点发送 PING 数据包,以此来检查目标节点是否正常运作。 3、在特定事件发生时,发送集群信息。 4、除此之外, 集群连接还用于在集群中发布或订阅信息。 因为集群节点不能代理(proxy)命令请求, 所以客户端应该在节点返回 -MOVED 或者 -ASK 转向(redirection)错误时, 自行将命令请求转发至其他节点。因为客户端可以自由地向集群中的任何一个节点发送命令请求, 并可以在有需要时, 根据转向错误所提供的信息, 将命令转发至正确的节点, 所以在理论上来说, 客户端是无须保存集群状态信息的。不过, 如果客户端可以将键和节点之间的映射信息保存起来,

相关文档
最新文档