202104-09 redis 主从备份及其主备切换的操作 首先原文是用了3个服务器,我是用了一个服务器;然后再原文的基础上,稍加了自己的整理。前提:redis中,主从切换场景中,没有绝对的主和从,只有初始化的主和从,然后当主down后,从就变成主了,而主即使连接上,也是从,不会变为主1.redis-server的主备关系:master:redis-1slave1:redis-2slave3:redis-32.首先进行主从备份:修改从服务redis-1redis-2的redis.conf在从服务上修改redis.conf加入slaveof127.0.0.1... 继续阅读 >
202104-07 推荐几款 Redis 可视化工具(太厉害了) 1.命令行不知道大家在日常操作redis时用什么可视化工具呢?以前总觉得没有什么太好的可视化工具,于是问了一个业内朋友。对方回:你还用可视化工具?直接命令行呀,redis提供了这么多命令,操作起来行云流水。用可视化工具觉得很low。命令行的鄙视用工具的,用高端工具的鄙视低端工具的,鄙视链一直存在。虽然用命令行自己也可以,但是总感觉效率上不如用工具,在视觉上不那么直观。尤其是看json的时候,在命令行就很不友好。大佬... 继续阅读 >
202104-07 redis实现延时队列的两种方式(小结) 背景项目中的流程监控,有几种节点,需要监控每一个节点是否超时。按传统的做法,肯定是通过定时任务,去扫描然后判断,但是定时任务有缺点:1,数据量大会慢;2,时间不好控制,太短,怕一次处理不完,太长状态就会有延迟。所以就想到用延迟队列的方式去实现。一,redis的过期key监控1,开启过期key监听在redis的配置里把这个注释去掉notify-keyspace-eventsEx然后重启redis2,使用redis过期监听实现延迟队列继承KeyExpirationEv... 继续阅读 >
202104-07 redis如何后台启动的方法 当安装好redis之后,运行redis-server命令之后,显示如图所示:但是这样没有办法在这个tab下做任何操作了,因为这个时候使用Ctrl+c之后,就变成了这个样子然后就关闭了,那么我想让redis在后台启动怎么办呢?在安装redis之后,我们可以可以找到一个叫redis.conf的文件,这个文件是redis的配置文件位置,如图所示:使用vim命令打开该文件,如图所示:其实英文好的同学可以好好读一下这个配置文档,受益匪浅的,上来就是redis如何来... 继续阅读 >
202103-30 Redis Sentinel的使用方法 1、sentinelmonitor用法:sentinel monitor master-name ip port quorum其中,master-name是主节点的名称,ip,port不用解释,是主节点的地址信息。 最后的quorum是判断主节点最终不可达所需要的票数。这个值越大,判断越可信,这个值越小,判断越不可信,一般这个数字取的是sentinel节点数目的一半+1.同时,该值还与sentinel节点的领导者选举有关,至少要有max(quorum,num(sentinel... 继续阅读 >
202103-30 Redis Sentinel的基本搭建 RedisSentinel的概念 我们知道Redis主从模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点的地址。然后在很多应用场景下这种故障处理的方式是无法接受的,应用程序需要实时感知当前的可用节点。为了解决这个问题,RedisSentinel应运而生,也称之为"哨兵"。 介绍sentinel之前,先来了解几个redis的概念,主节点master:Redis进程,主服务从节点slave... 继续阅读 >
202103-30 详解Redis 分布式锁遇到的序列化问题 场景描述最近使用Redis遇到了一个类似分布式锁的场景,跟Redis实现分布式锁类比一下,就是释放锁失败,也就是缓存删不掉。又踩了一个Redis的坑……这是什么个情况、又是怎样排查的呢?本文主要对此做个复盘。问题排查既然是释放锁有问题,那就先看看释放锁的代码吧。释放锁释放锁使用了Lua脚本,代码逻辑和Lua脚本如下:释放锁示例代码publicObjectrelease(Stringkey,Stringvalue){ObjectexistedValue=stringR... 继续阅读 >
202103-30 手动实现Redis的LRU缓存机制示例详解 前言最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用LRU等淘汰机制,然后找了这方面的一些资料与大家分享一下。LRU总体大概是这样的,最近使用的放在前面,最近没用的放在后面,如果来了一个新的数,此时内存满了,就需要把旧的数淘汰,那为了方便移动数据,肯定就得使用链表类似的数据结构,再加上要判断这条数据是不是最新的或者最旧的那么应该也要使用hashmap等key-value形式... 继续阅读 >
202103-30 Redis集群水平扩展、集群中添加以及删除节点的操作 在Redis集群搭建中,我们搭建了下图所示的Redis集群,接下来我们就来看看如何为我们的Redis集群进行水平扩容。[root@localhostredis-5.0.3]#src/redis-serverredis-cluster/8001/redis.conf[root@localhostredis-5.0.3]#src/redis-serverredis-cluster/8004/redis.conf[root@localhostredis-5.0.3]#src/redis-serverredis-cluster/8002/redis.conf[root@localhostredis-5.0.3]#src/redis-serverredis-cluster/8005/r... 继续阅读 >
202103-30 redis keys与scan命令的区别说明 rediskeys和scan的区别redis的keys命令,通常在用来删除相关key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys时,执行速度会比较慢,更致命的是,这个命令会阻塞redis多路复用的io主线程,如果这个线程阻塞,在此期间,其他发向redis服务端的命令,都会被阻塞,从而引发一系列级联反应,导致瞬间相应卡顿,从而引发超时等问题,所以应该在生产环境禁止用使用keys和类似的命令smembers,这种时间复杂度为O(N),... 继续阅读 >
202103-30 redis通过lua脚本,获取满足key pattern的所有值方式 我们知道,redis提供了keys命令去获取所有满足格式的key,如我们键入命令keys"user*"将得到所有以user开头的key然后执行mget命令可以获取多个key的值,如但如果满足条件的key过多,我们要将所有key拿到,再用mget去拿到所有值则为相对比较麻烦,因此可以借助xargsredis-clikeys"user*"|xargsredis-climget获取到所有key的值也可以执行lua脚本localkeys=redis.call('keys',KEYS[1]);returnredis.call('mget',unpack(key... 继续阅读 >
202103-30 redis 获取 list 中的所有元素操作 一种方法是用lrange(key,0,-1)。这种方法不会影响redislist中的数据。List<String>list=jedis.lrange(key,0,-1);另一种方法是用while+lpop。这种方法会将redislist中的数据都弹出来,redislist就变成空的了。List<String>list=newArrayList<>();Stringst=jedis.lpop(key);while(st!=null){list.add(st);st=jedis.lpop(key);}这两种方法获得的List<String>list中的元素的顺... 继续阅读 >
202103-30 Redis swap空间(虚拟内存)的使用详解 swap空间对于操作系统来说比较重要,当我们使用操作系统的时候,如果系统内存不足,常常会将一部分内存数据页进行swap操作,以解决临时的内存困境。swap空间由磁盘提供,对于高并发场景下,swap空间的使用会严重降低系统性能,因为它引入了磁盘IO操作。 在Linux中,提供了free命令来查询操作系统的内存使用情况,free命令的结果中也包含了swap相关的情况,例如下面的结果中:[root@VM-0-14-centos~]#f... 继续阅读 >
202103-30 Redis 事务知识点相关总结 Redis中的事务介绍 MySQL中的事务大家都不陌生,Redis中的事务和MySQL中的事务不同,今天看下Redis事务中的一些知识点吧。01事务简介 Redis中的事务使用multi、exec来标记,其中multi代表事务开始,exec代表事务结束,multi和exec之间的命令是原子顺序执行的。下面是一个例子:127.0.0.1:7397>multiOK127.0.0.1:7397>setkey_hellohelloQUEUED127.0.0.1:7397>setkey_worldworldQUEUED1... 继续阅读 >
202103-29 深入理解 Redis Template及4种序列化方式 概述使用Spring提供的SpringDataRedis操作redis必然要使用Spring提供的模板类RedisTemplate,今天我们好好的看看这个模板类。RedisTemplate看看4个序列化相关的属性,主要是用于KEY和VALUE的序列化。举个例子,比如说我们经常会将POJO对象存储到Redis中,一般情况下会使用JSON方式序列化成字符串,存储到Redis中。Spring提供的Redis数据结构的操作类ValueOperations类,提供RedisStringAPI操作L... 继续阅读 >
202103-29 详解RedisTemplate下Redis分布式锁引发的系列问题 自己的项目因为会一直抓取某些信息,但是本地会和线上经常一起跑,造成冲突。这其实就是我们常说的分布式集群的问题了,本地和线上的服务器构成了集群以及QPS为2的小并发(其实也不叫并发,不知道拿什么词形容?)。 首先,分布式集群的问题大家都知道,会造成数据库的插入重复问题,会造成一系列的并发性问题。 解决的方式呢也大概如下几点,百度以及谷歌... 继续阅读 >