[转帖]Redis入门(数据结构基础,分布式锁,性能调优)

redis,入门,数据结构,基础,分布式,性能 · 浏览次数 : 0

小编点评

**异常信息:io.lettuce.core.RedisCommandExecutionException:OOM 命令不可用,当内存使用大于 'maxmemory' 时。** **原因:** Redis 中的 `maxmemory` 属性控制了内存限制,当内存使用超过 `maxmemory` 时, `RedisCommandExecutionException` 会抛出异常。 **解决方案:** 1. **调整 `maxmemory` 属性值:** - 使用 `redis-cli` 命令设置 `maxmemory-policy`选项。默认值为 `noeviction`,表示不进行数据淘汰。 - 如果需要设置有效期,可以使用 `volatile-lru` 或 `volatile-random` 等策略。 2. **降低内存占用:** - 只存储必要的数据。 - 使用压缩算法。 - 减少缓存大小。 3. **启用混合持久化:** - 设置 `appendonly` 和 `appendfilename`选项。 - 使用 `aof-use-rdb-preamble` 和 `mix` 等选项。 4. **禁用 THP 特性:** - 使用 `echo never > /sys/kernel/mm/transparent_hugepage/enabled` 等命令禁用 THP 特性。 5. **使用分布式架构:** - 设置 `cluster`选项,使用 Redis 集群。 - 使用 `Redis Cluster` 库实现集群操作。 **注意:** - `maxmemory` 属性的单位是字节。 - 不同的 Redis 版本可能支持不同的 `maxmemory` 值。 - 可以使用 `info` 命令查看内存使用信息。

正文

目录

 

1、Redis基础

1.1 Redis是啥?能干啥?

1.2 安装Redis

1.3 Redis集成Spring 入门Demo

1.4 Redis支持数据类型

2、分布式锁解决方案-Redis(略)

3、Redis性能调优军规

3.1 缩短键值对的存储长度

3.2 使用 lazy free(延迟删除)特性

3.3 设置键值的过期时间

3.4 禁用长耗时的查询命令

3.5 使用 slowlog 优化耗时命令

3.6 使用 Pipeline 批量操作数据

3.7 避免大量数据同时失效

3.8 客户端使用优化

3.9 Redis内存管理与数据淘汰机制

3.10 使用物理机而非虚拟机安装 Redis 服务

3.11 检查数据持久化策略

3.12 禁用 THP 特性

3.13 使用分布式架构来增加读写速度


1、Redis基础

1.1 Redis是啥?能干啥?

是啥: Redis是一个开源的,基于内存亦可持久化的日志型、高性能Key-Value数据库,并提供多种语言的API

干啥: 性能极高 – Redis官方描述理论上能达到读的速度是110000次/s,写的速度是81000次/s 。可以使用redis-benchmark命令测试:

  1. [root@ydt1 bin]# ./redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
  2. script load redis.call('set','foo','bar'): 69541.03 requests per second
  3. [root@ydt1 bin]# ./redis-benchmark -n 100000 -q script load "redis.call('get','foo')"
  4. script load redis.call('get','foo'): 83125.52 requests per second
  5. #可以通过sysbench对比下MySQL的QPS
  6. #安装sysbench压测工具
  7. yum install gcc gcc-c++ autoconf automake make libtool bzr mysql-devel git
  8. git clone https://github.com/akopytov/sysbench.git
  9. cd sysbench
  10. git checkout 1.0.18
  11. ./autogen.sh
  12. ./configure --prefix=/usr --mandir=/usr/share/man
  13. make && make install
  14. #步骤一:准备数据
  15. sysbench --db-driver=mysql --mysql-host=192.168.223.128 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=sbtest --table_size=10000 --tables=1 --events=0 --time=10 --threads=2 oltp_read_only prepare
  16. #只读场景压测
  17. #步骤二:运行workload
  18. sysbench --db-driver=mysql --mysql-host=192.168.223.128 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=sbtest --table_size=10000 --tables=1 --events=0 --time=10 --threads=2 --percentile=95 --skip-trx=1 --report-interval=1 oltp_read_only run
  19. #只写场景压测
  20. #步骤二:运行workload
  21. sysbench --db-driver=mysql --mysql-host=192.168.223.128 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=sbtest --table_size=10000 --tables=1 --events=0 --time=10 --threads=2 --percentile=95 --report-interval=1 oltp_write_only run
  22. #步骤三:清理数据
  23. sysbench --db-driver=mysql --mysql-host=192.168.223.128 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=sbtest --table_size=10000 --tables=1 --events=0 --time=10 --threads=2 --percentile=95 oltp_write_only cleanup
  24. #SysBench参数说明
  25. #db-driver 数据库引擎。
  26. #mysql-host RDS实例连接地址。
  27. #mysql-port RDS实例连接端口。
  28. #mysql-user RDS实例账号。
  29. #mysql-password RDS实例账号对应的密码。
  30. #mysql-db RDS实例数据库名。
  31. #table_size 测试表大小。
  32. #tables 测试表数量。
  33. #events 测试请求数量。
  34. #time 测试时间。
  35. #threads 测试线程数。
  36. #percentile 需要统计的百分比,默认值为95%,即请求在95%的情况下的执行时间。
  37. #report-interval 表示N秒输出一次测试进度报告,0表示关闭测试进度报告输出,仅输出最终的报告结果。
  38. #skip-trx 是否跳过事务。
  39. #1:跳过
  40. #0:不跳过

丰富的数据类型 – Redis支持二进制的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来,实际生产中也可以通过集成API使用LUA脚本进行操作。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

1.2 安装Redis

  1. #第一步:下载redis安装包 官网:https://redis.io/
  2. wget http://download.redis.io/releases/redis-4.0.6.tar.gz
  3. #第二步:解压压缩包
  4. tar -zxvf redis-4.0.6.tar.gz
  5. #第三步:yum安装gcc依赖
  6. yum install  gcc
  7. #第四步:跳转到redis解压目录下
  8. cd redis-4.0.6
  9. #第五步:编译安装
  10. make MALLOC=libc
  11. #将bin目录安装到当前目录下,当然,你也可以直接使用src下的脚本
  12. make install PREFIX=/usr/local/redis-4.0.6

启动服务端:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

 

List(列表)---有序

  1. @Test
  2.    public void insertList() {
  3.        jedis.del("person");
  4.        jedis.del("city");
  5.        //左压栈laohe, laoli, laowang
  6.        jedis.lpush("person", "laowang", "laoli", "laohe");
  7.        //右压栈changsha, shenzhen, guangzhou
  8.        jedis.rpush("city", "changsha", "shenzhen", "guangzhou");//右压栈"guangzhou","shenzhen","changsha"
  9.        System.out.println(jedis.lpop("person"));//左弹栈
  10.        System.out.println(jedis.rpop("city"));//右弹栈
  11.        System.out.println(jedis.lrange("person", 0, -1));//先进后出
  12.        System.out.println(jedis.lrange("city", 0, -1));//先进先出
  13.   }

输出结果:

  1. laohe
  2. guangzhou
  3. [laoli, laowang]
  4. [changsha, shenzhen]

 

Set(集合)---无序,差值

  1. /**
  2.     * Set (无序)
  3.     */
  4.    @Test
  5.    public void insertSet() {
  6.        jedis.del("username","password");
  7.        jedis.sadd("username", "laozhang", "laoxie", "laojiang");
  8.        jedis.sadd("password", "laohu", "laoxie", "laojiang");
  9.        System.out.println(jedis.smembers("username"));//取列表值
  10.        System.out.println(jedis.sdiff("username", "password"));//取差值
  11.   }

输出结果: 

 

ZSet(sorted set:有序集合)--- 排行榜

  1. /**
  2.     * 有序Set
  3.     */
  4.    @Test
  5.    public void insertZSet() {
  6.        jedis.del("tuhao");
  7.        jedis.zadd("tuhao", 1000, "mayun");
  8.        jedis.zadd("tuhao", 1, "wangjianlin");
  9.        jedis.zadd("tuhao", 100, "mahuateng");
  10.        System.out.println(jedis.zrange("tuhao", 0, -1));//屌丝榜
  11.        System.out.println(jedis.zrevrange("tuhao", 0, -1));//土豪榜
  12.   }

输出:

  1. [wangjianlin, mahuateng, mayun]
  2. [mayun, mahuateng, wangjianlin]

2、分布式锁解决方案-Redis(略)

需要的了解的同学移步至:分布式锁解决方案实战_长沙老码农-CSDN博客

3、Redis性能调优军规

尽管Redis是一个非常快速的内存数据存储媒介,也并不代表Redis不会产生性能问题,我这里总结了一些处理性能问题的手段!

3.1 缩短键值对的存储长度

键值对的长度是和性能成反比的 , 在 key 不变的情况下,value 值越大操作效率越慢

  1. Logger logger = Logger.getLogger(ClusterTest.class);
  2.        JedisPool jedisPool = (JedisPool) context.getBean("jedisPool");
  3.        Jedis jedis = jedisPool.getResource();
  4.         Pipeline pipe = jedis.pipelined(); // 先创建一个 pipeline 的链接对象
  5.        long start = System.currentTimeMillis();
  6.        for (int i = 0; i < 100000; i++) {
  7.            pipe.set(String.valueOf(i), String.valueOf(i));
  8.       }
  9.        pipe.sync();
  10.        long end = System.currentTimeMillis();
  11.        logger.info("the general total time is:" + (end - start));
  12.        String v = "aaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooaddasssssssssssssssssssssssssssaaasssssssssssssssssdakldwndonqwdknaknwndddddoooooa";
  13.        System.out.println(v.getBytes().length);
  14.        start = System.currentTimeMillis();
  15.        for (int i = 0; i < 100000; i++) {
  16.            pipe.set(String.valueOf(i), v + String.valueOf(i));
  17.       }
  18.        pipe.sync();
  19.        end = System.currentTimeMillis();
  20.        logger.info("the general total time is:" + (end - start));
  21.        
  22.        #执行结果如下:
  23.        #17:32:17,155  INFO ClusterTest:227 - the general total time is:498
  24.        #699
  25.        #17:32:19,820  INFO ClusterTest:238 - the general total time is:2656

 

3.2 使用 lazy free(延迟删除)特性

lazy free 特性是 Redis 4.0 新增的一个非常实用的功能,它可以理解为惰性删除或延迟删除。意思是在删除的时候提供异步延时释放键值的功能,把键值释放操作放在 BIO(Background I/O) 单独的子线程处理中,以减少删除对 Redis 主线程的阻塞,可以有效地避免删除 big key 时带来的性能和可用性问题。

lazy free 对应了 4 种场景,默认都是关闭的:

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

slave-lazy-flush no

它们代表的含义如下:

  • lazyfree-lazy-eviction:表示当 Redis 运行内存超过 maxmeory 时,是否开启 lazy free 机制删除;

  • lazyfree-lazy-expire:表示设置了过期时间的键值,当过期之后是否开启 lazy free 机制删除;

  • lazyfree-lazy-server-del:有些指令在处理已存在的键时,会带有一个隐式的 del 键的操作,比如 rename 命令,当目标键已存在,Redis 会先删除目标键,如果这些目标键是一个 big key,就会造成阻塞删除的问题,此配置表示在这种场景中是否开启 lazy free 机制删除;

  • slave-lazy-flush:针对 slave(从节点) 进行全量数据同步,slave 在加载 master 的 RDB 文件前,会运行 flushall 来清理自己的数据,它表示此时是否开启 lazy free 机制删除。

建议开启其中的 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-server-del 等配置,这样就可以有效的提高主线程的执行效率。

3.3 设置键值的过期时间

我们应该根据实际的业务情况,对键值设置合理的过期时间,这样 Redis 会帮你自动清除过期的键值对,以节约对内存的占用,以避免键值过多的堆积,频繁的触发内存淘汰策略。

3.4 禁用长耗时的查询命令

以从以下几个方面入手改造:

  • 决定禁止使用 keys 命令;

  • 尽可能将排序、并集、交集等操作放在客户端执行,以减少 Redis 服务器运行压力;

     

3.5 使用 slowlog 优化耗时命令

我们可以使用 slowlog 功能找出最耗时的 Redis 命令进行相关的优化,以提升 Redis 的运行速度,慢查询有两个重要的配置项:

  • slowlog-log-slower-than :用于设置慢查询的评定时间,也就是说超过此配置项的命令,将会被当成慢操作记录在慢查询日志中,它执行单位是微秒 (1 秒等于 1000000 微秒);

  • slowlog-max-len :用来配置慢查询日志的最大记录数。

我们可以根据实际的业务情况进行相应的配置,其中慢日志是按照插入的顺序倒序存入慢查询日志中,我们可以使用 slowlog get 来获取相关的慢查询日志,再找到这些慢查询对应的业务进行相关的优化。

  1. redis> SLOWLOG GET
  2. 1) 1) (integer) 12                      # 唯一性(unique)的日志标识符
  3.   2) (integer) 1324097834              # 被记录命令的执行时间点,以 UNIX 时间戳格式表示
  4.   3) (integer) 1689                      # 查询执行时间,以微秒为单位
  5.   4) 1) "SET"                          # 执行的命令
  6.      2) "1"
  7.  3) "LAOHU"                      
  8.      4) "slowlog-log-slower-than"

 

3.6 使用 Pipeline 批量操作数据

Pipeline (管道技术) 是客户端提供的一种批处理技术,用于一次处理多个 Redis 命令,从而提高整个交互的性能。

  1. @Test
  2.    public void testGeneralAndPipeline(){
  3.        JedisPool jedisPool = (JedisPool) context.getBean("jedisPool");
  4.        Jedis jedis = jedisPool.getResource();
  5.        Logger logger = Logger.getLogger(ClusterTest.class);
  6.        long start = System.currentTimeMillis();
  7.        for (int i = 0; i < 10000; i++) {
  8.            jedis.set(String.valueOf(i), String.valueOf(i));
  9.       }
  10.        long end = System.currentTimeMillis();
  11.        logger.info("the general total time is:" + (end - start));
  12.        Pipeline pipe = jedis.pipelined(); // 先创建一个 pipeline 的链接对象
  13.        long start_pipe = System.currentTimeMillis();
  14.        for (int i = 0; i < 10000; i++) {
  15.            pipe.set(String.valueOf(i), String.valueOf(i));
  16.       }
  17.        pipe.sync(); // 获取所有的 response
  18.        long end_pipe = System.currentTimeMillis();
  19.        logger.info("the pipe total time is:" + (end_pipe - start_pipe));
  20.   }

执行结果:

  1. 16:03:17,592 INFO ClusterTest:114 - the general total time is:2634
  2. 16:03:17,692 INFO ClusterTest:123 - the pipe total time is:77

 

3.7 避免大量数据同时失效

不仅仅会造成缓存雪崩,数据库服务器承压太大而宕机,对于Redis本身来说,瞬间需要干掉大量的key,也是对cpu性能的一个考验!

hz 10---》每秒执行10次过期扫描

20210203231838640.png

 

解读:每次从过期字典(所有设置了过期时间键值对的集合)中随机获取20个,如果过期键值对超过四分之一,那么会继续从字典中获取20个继续删除过期键值对,如此循环往复,会造成大量的CPU损耗,并且在整个执行过程会导致 Redis 的读写出现明显的卡顿,卡顿的原因是内存管理器需要频繁回收内存页

3.8 客户端使用优化

在客户端的使用上我们除了要尽量使用 Pipeline 的技术外,还需要注意要尽量使用 Redis 连接池,而不是频繁创建销毁 Redis 连接,这样就可以减少网络传输次数和减少了非必要调用指令。

3.9 Redis内存管理与数据淘汰机制

最大内存设置

默认情况下,在32位OS中,Redis最大使用3GB的内存,在64位OS中则没有限制。

在使用Redis时,应该对数据占用的最大空间有一个基本准确的预估,并为Redis设定最大使用的内存。

否则在64位OS中Redis会无限制地占用内存(当物理内存被占满后会使用swap空间--硬盘内存中的一部分空间),容易引发各种各样的问题。

通过如下配置控制Redis使用的最大内存:

maxmemory 100mb 

在内存占用达到了maxmemory后,再向Redis写入数据时,Redis会:

  • 根据配置的数据淘汰策略尝试淘汰数据,释放空间

  • 如果没有数据可以淘汰,或者没有配置数据淘汰策略,那么Redis会对所有写请求返回错误,但读请求仍然可以正常执行

    1. @Test
    2. public void testMaxmemory(){
    3. JedisPool jedisPool = (JedisPool) context.getBean("jedisPool");
    4. Jedis jedis = jedisPool.getResource();
    5. Transaction transaction = jedis.multi();
    6. for (int i = 0; i < 100000; i++) {
    7. transaction.set("" + i,"value is " + i);
    8. }
    9. transaction.exec();
    10. }

     

    异常信息:io.lettuce.core.RedisCommandExecutionException: OOM command not allowed when used memory > 'maxmemory'.

在为Redis设置maxmemory时,需要注意:

如果采用了Redis的主从同步,主节点向从节点同步数据时,会占用掉一部分内存空间

如果maxmemory过于接近主机的可用内存,会导致数据同步时内存不足。

所以设置的maxmemory不要过于接近主机可用的内存,留出一部分预留用作主从同步。

数据淘汰机制

Redis提供了5种数据淘汰策略:

  • volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key

  • allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰

  • volatile-random:随机淘汰数据,只淘汰设定了有效期的key

  • allkeys-random:随机淘汰数据,所有的key都可以被淘汰

  • volatile-ttl:淘汰剩余有效期最短的key

最好为Redis指定一种有效的数据淘汰策略以配合maxmemory设置,避免在内存使用满后发生写入失败的情况。

一般来说,推荐使用的策略是volatile-lru,并辨识Redis中保存的数据的重要性。

对于那些重要的,绝对不能丢弃的数据(如配置类数据等),应不设置有效期,这样Redis就永远不会淘汰这些数据。

对于那些相对不是那么重要的,并且能够热加载的数据(比如缓存最近登录的用户信息,当在Redis中找不到时,程序会去DB中读取),可以设置上有效期,这样在内存不够时Redis就会淘汰这部分数据。

配置方法:

maxmemory-policy volatile-lru   #默认是noeviction,即不进行数据淘汰

 

3.10 使用物理机而非虚拟机安装 Redis 服务

在虚拟机中运行 Redis 服务器,因为和物理机共享一个物理网口,并且一台物理机可能有多个虚拟机在运行,因此在内存占用上和网络延迟方面都会有很糟糕的表现,我们可以通过 ./redis-cli --intrinsic-latency 100 命令查看延迟时间,如果对 Redis 的性能有较高要求的话,应尽可能在物理机上直接部署 Redis 服务器。

  1. [root@ydt src]# ./redis-cli --intrinsic-latency 100
  2. Max latency so far: 1 microseconds.
  3. Max latency so far: 7 microseconds.
  4. Max latency so far: 9 microseconds.
  5. Max latency so far: 29 microseconds.
  6. Max latency so far: 399 microseconds.
  7. Max latency so far: 1243 microseconds.
  8. Max latency so far: 2157 microseconds.
  9. Max latency so far: 3847 microseconds.
  10. Max latency so far: 3980 microseconds.
  11. Max latency so far: 5076 microseconds.
  12. Max latency so far: 23236 microseconds.
  13. Max latency so far: 31935 microseconds.
  14. Max latency so far: 46829 microseconds.
  15. 1838316588 total runs (avg latency: 0.0544 microseconds / 54.40 nanoseconds per run).
  16. Worst run took 860865x longer than the average latency.
  17. #注意:后面的参数100表示100s
  18. #由测试结果可以看出来,redis内部延迟最大为46829微秒(46毫秒),这会是一个不太好的消息,因为内部延迟超过100微秒性能就不是很好了,最主要的原因是系统有其他应#用在共享cpu

 

3.11 检查数据持久化策略

Redis 的持久化策略是将内存数据复制到硬盘上,这样才可以进行容灾恢复或者数据迁移,但维护此持久化的功能,需要很大的性能开销。

在 Redis 4.0 之后,Redis 有 3 种持久化的方式:

  • RDB(Redis DataBase,快照方式)将某一个时刻的内存数据,以二进制的方式写入磁盘;

  • AOF(Append Only File,文件追加方式),记录所有的操作命令,并以文本的形式追加到文件中;

  • 混合持久化方式,Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险。

RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响 Redis 的启动速度,为了能同时拥有 RDB 和 AOF 的优点,Redis 4.0 之后新增了混合持久化的方式,因此我们在必须要进行持久化操作时,应该选择混合持久化的方式。

  1. appendonly yes #开启aof持久化,rbd是默认开启的
  2. appendfilename "appendonly.aof" #aof持久化文件
  3. aof-use-rdb-preamble yes #开启aof和rdb混合持久化模式

 

3.12 禁用 THP 特性

Linux kernel 在 2.6.38 内核增加了 Transparent Huge Pages (THP) 特性 ,支持大内存页 2MB 分配,默认开启。

这个特性实际上就是会把这种巨页的使用对用户透明,用户不需要再进行巨页的配置,内存会自动将连续的512个普通页作为一个巨页处理,为了减少维护人员配置巨页的工作

我们Redis在启动的时候也会去检查是否也已经禁用THP特性:

30663:M 25 Jul 18:34:48.221 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

当开启了 THP 时,fork 的速度会变慢,fork 之后每个内存页从原来 4KB 变为 2MB,会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了 512 倍,会拖慢写操作的执行时间,导致大量写操作慢查询。例如简单的 incr 命令也会出现在慢查询中,因此 Redis 建议将此特性进行禁用,禁用方法命令如下:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

为了使机器重启后 THP 配置依然生效,可以在 /etc/rc.local 中追加

echo never > /sys/kernel/mm/transparent_hugepage/enabled 

 

3.13 使用分布式架构来增加读写速度

Redis 分布式架构有三个重要的手段:

  • 主从同步

  • 哨兵模式

  • Redis Cluster 集群

使用主从同步功能我们可以把写入放到主库上执行,把读功能转移到从服务上,因此就可以在单位时间内处理更多的请求,从而提升的 Redis 整体的运行速度。

而哨兵模式是对于主从功能的升级,但当主节点奔溃之后,无需人工干预就能自动恢复 Redis 的正常使用。

Redis Cluster 是 Redis 3.0 正式推出的,Redis 集群是通过将数据库分散存储到多个节点上来平衡各个节点的负载压力。

Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot = CRC16(key) & 16383,每一个节点负责维护一部分槽以及槽所映射的键值数据。这样 Redis 就可以把读写压力从一台服务器,分散给多台服务器了,因此性能会有很大的提升。

在这三个功能中,我们只需要使用一个就行了,毫无疑问 Redis Cluster 应该是首选的实现方案,它可以把读写压力自动的分担给更多的服务器,并且拥有自动容灾的能力。

 

 

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览32645 人正在系统学习中

与[转帖]Redis入门(数据结构基础,分布式锁,性能调优)相似的内容:

[转帖]Redis入门(数据结构基础,分布式锁,性能调优)

目录 1、Redis基础 1.1 Redis是啥?能干啥? 1.2 安装Redis 1.3 Redis集成Spring 入门Demo 1.4 Redis支持数据类型 2、分布式锁解决方案-Redis(略) 3、Redis性能调优军规 3.1 缩短键值对的存储长度 3.2 使用 lazy free(延

[转帖]rsbeat对redis慢日志入库到ES

git地址: https://github.com/Yourdream/rsbeat gitg地址: 改进支持sentinel https://github.com/154650362/rsbeat 1、安装 mkdir rsbeat cd rsbeat curl -L https://ghprox

[转帖]炸了~Redis bigkey导致生产事故-bigkey问题全面分析

文章首发于公众号:BiggerBoy 原文链接 一个Redis生产事故的复盘,整理这篇文章分享给大家。本期文章分析Redis中的bigkey相关问题,主要从以下几个点入手: 文章目录 什么是bigkey?bigkey的危害bigkey的产生如何发现bigkey实际生产的操作方式 如何优化bigkey

[转帖]炸了~Redis bigkey导致生产事故-bigkey问题全面分析

https://blog.csdn.net/ibigboy/article/details/124216874 文章首发于公众号:BiggerBoy 原文链接 一个Redis生产事故的复盘,整理这篇文章分享给大家。本期文章分析Redis中的bigkey相关问题,主要从以下几个点入手: 文章目录 什么

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]Redis 7.0 三节点哨兵(Sentinel)高可用 环境搭建手册

2022-06-17 16:253480原创Redis 本文链接:https://www.cndba.cn/dave/article/108088 1 哨兵高可用架构说明 Redis 最早的高可用方案是主从复制,但这种方案存在一个问题,就是当主库宕机后,从库不会自动切成主库,需要人工干预。 所有在主

[转帖]Redis 备份与恢复(RDB/AOF) 说明

2022-06-16 20:364580原创Redis 本文链接:https://www.cndba.cn/dave/article/108068 1 RDB 方式 1.1 RDB 备份恢复说明 Redis 的备份恢复有两种方法:RDB和AOF。 其中RDB 文件是一个经过压缩的二进制文件,有两个R

[转帖]Redis 性能优化的 13 条军规!史上最全

https://zhuanlan.zhihu.com/p/118532234 Redis性能优化实战方案 Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O

[转帖]Redis性能调优万字总结,面试必问!

https://zhuanlan.zhihu.com/p/541745804 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如 Redis的内存模型? Redis的底层数据结构是怎么的? Redis的多线程模型 Redis的集群原理 Redis的雪崩,击穿,穿透怎么

[转帖]Redis连接未释放,造成TCP连接数过多

https://segmentfault.com/a/1190000022704886 早上看到服务器告警通知,TCP连接数比较高,达到5000多,我设置的阈值是5000,正常TCP连接不会这么高,这样的一个阈值我可以提前知道有问题早点解决,不至于后面引起一系列问题,甚至拖垮服务器。 排查 登陆服务