202107-01 基于Redis延迟队列的实现代码 使用场景工作中大家往往会遇到类似的场景:1.对于红包场景,账户A对账户B发出红包通常在1天后会自动归还到原账户。2.对于实时支付场景,如果账户A对商户S付款100元,5秒后没有收到支付方回调将自动取消订单。解决方案分析方案一:采用通过定时任务采用数据库/非关系型数据库轮询方案。优点:1.实现简单,对于项目前期这样是最容易的解决方案。缺点:1.DB有效使用率低,需要将一部分的数据库的QPS分配给JOB的无效... 继续阅读 >
202106-23 基于Redis实现分布式锁的方法(lua脚本版) 1、前言在Java中,我们通过锁来避免由于竞争而造成的数据不一致问题。通常我们使用synchronized、Lock来实现。但是Java中的锁只能保证在同一个JVM进程内中可用,在跨JVM进程,例如分布式系统上则不可靠了。2、分布式锁分布式锁,是一种思想,它的实现方式有很多,如基于数据库实现、基于缓存(Redis等)实现、基于Zookeeper实现等等。为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件互斥性:在任意时刻,... 继续阅读 >
202106-23 redis三种高可用方式部署的实现 前言一、主从复制概念和mysql的主从复制一样都是将服务器的数据复制到另一个数据库中发送的称为master接受的叫slave数据为单向传输只可以主到从每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。作用数据冗余实现了数据的热备份,是持久化之外的一种数据冗余方式故障切换当主节点宕机或者出现错误时由从服务器来提供服务实现故障切换负载均衡:在主从复制的基础上... 继续阅读 >
202106-23 Redis数据结构之链表与字典的使用 今天我们来聊一聊Redis中的链表与字典,具体如下:链表关于链表的基础概念其实你在学习Redis之前一定积累了不少,所以本文将默认你已经掌握了链表相关的基础知识,而Redis的链表其实也就是普通的链表~因为Redis是使用C语言编写的,因此Redis的数据结构的定义都是使用C语法定义的,你不需要完全理解下方C语言声明结构体的语法,但我认为依靠大家的Java知识也能理解这就像是在Java中定义了一个链表对象Redis链表节点的结构typedefst... 继续阅读 >
202106-19 基于Redis过期事件实现订单超时取消 订单超时取消的实现,首先想到的是定时任务,但是这种实现方式在订单量较大的情况下是有问题的,而且时间也会有误差,最大时间差就是定时任务的执行间隔时间。使用redis的过期监听事件可以比较好的解决这个问题。实现的方式是订单创建后向redus中存一记录,一般就以订单号为key。设置过期时间(订单超时时间),一旦时间超时会触发监听事件,这时候就可以通过key判断这个订单是否支付,未支付时取消订单。redis过期监听的实现:1.... 继续阅读 >
202106-19 Redis实现订单自动过期功能的示例代码 前言用户下单后,规定XX分钟后自动设置为“已过期”,不能再发起支付。项目类似此类"过期"的需求,笔者提供一种使用Redis的解决思路,结合Redis的订阅、发布和键空间通知机制(KeyspaceNotifications)进行实现。配置redis.confgnotify-keyspace-events选项默认是不启用,改为notify-keyspace-events“Ex”。重启生效,索引位i的库,每当有过期的元素被删除时,向**keyspace@:expired**频道发送通知。E表示键事件通知,所有通知... 继续阅读 >
202106-19 redis 限制内存使用大小的实现 记录一次生产环境问题排查过程:生产环境部署方式:nginx+uwsgi+flask问题描述:发现生产环境中之前正常运行的服务突然不可用了,查看程序日志发现部分接口访问时报I/O写错误,nginxacess.log显示504,error.log显示upstreamtimeout.同时netstat-apn|grep6379|wc-l检查发现redis存在大量连接,进一步检查发现其中大多为SYN_SENT包,连接大多归属于uwsgi进程。 因为程序中有很多接口被调用是会访... 继续阅读 >
202106-19 Redis IP地址的绑定的实现 很多时候我们的redis的IP地址一般都是默认的127.0.0.1代表只能接受本机的访问,因此我们其他机器上想要访问这个redis的时候,就需要去修改ip地址的访问。第一步:进入到我们的redis配置文件,比如我这里是在/opt/myRedis/redis.conf,使用命令跳转到相应路径下cd/opt/myRedis/第二步:编辑该目录下的redis.conf配置文件vimredis.conf第三步:进入到配置文件之后,在查看模式下(也就是在只读的时候,跳转到最后一行,好像是按一... 继续阅读 >
202106-19 redis通过6379端口无法连接服务器(redis-server.exe闪退) 程序中报错:UnabletoconnecttoRedis;nestedexceptionisio.lettuce.core.RedisConnectionException:Unabletoconnecttolocalhost:6379原因是redis没有启动,解决方法:找到redis安装路径,按如下步骤便可启动redis按正常情况来说redis便可通过6379端口连接到服务器,我这里报双击redis-server.exe时出现闪退(很多人出现这种现象)原因是:没有设置redis的最大内存所导致,解决方法:在redis的配置文件(redis.windows.... 继续阅读 >
202106-12 redis 查看所有的key方式 可以使用KEYS命令KEYSpattern例如列出所有的keyredis>keys*列出匹配的keyredis>keysapple*1)apple12)apple2补充:redis的常用命令——KEYRedis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sortedsets)与范围查询,bitmaps,hyperloglogs和地理空间(g... 继续阅读 >
202106-12 c#基于Redis实现轻量级消息组件的步骤 最近在开发一个轻量级ASP.NETMVC开发框架,需要加入日志记录,邮件发送,短信发送等功能,为了保持模块的独立性,所以需要通过消息通信的方式进行处理,为了保持框架在部署,使用,二次开发过程中的简易便捷性,所以没有选择传统的MQ,而是基于Redis的订阅发布实现一个系统内部消息组件,话不多说,上码!数据结构定义消息实体包含几个部分,订阅通道名称,信息头,信息体,信息差异化额外信息字典,信息头主要包含消息标识,消息... 继续阅读 >
202106-05 Springboot Redis设置key前缀的方法步骤 properties中配置#redisredis.masterClusterNodes=10.40.57.197:7000;10.40.57.198:7002;10.40.57.199:7004redis.slaveClusterNodes=10.40.57.197:7001;10.40.57.198:7003;10.40.57.199:7005redis.maxTotal=50redis.maxIdle=10redis.minIdle=1redis.maxWaitMillis=1000redis.testOnBorrow=trueredis.testOnReturn=trueredis.timeout=10000redis.lockExpireSeconds=5redis.soTimeout=1000redis.maxAttempts=3redis.password=123456r... 继续阅读 >
202106-05 详解SpringBoot2.0的@Cacheable(Redis)缓存失效时间解决方案 问题 @Cacheable注解不支持配置过期时间,所有需要通过配置CacheManneg来配置默认的过期时间和针对每个类或者是方法进行缓存失效时间配置。解决 可以采用如下的配置信息来解决的设置失效时间问题配置信息@BeanpublicCacheManagercacheManager(RedisConnectionFactoryredisConnectionFactory){returnnewRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConn... 继续阅读 >
202105-29 springboot+redis 实现分布式限流令牌桶的示例代码 1、前言网上找了很多redis分布式限流方案,要不就是太大,需要引入第三方jar,而且还无法正常运行,要不就是定时任务定时往key中放入数据,使用的时候调用,严重影响性能,所以着手自定义实现redis令牌桶。只用到了spring-boot-starter-data-redis包,并且就几行代码。2、环境准备a、idea新建springboot项目,引入spring-data-redis包b、编写令牌桶实现方法RedisLimitExcutorc、测试功能,创建全局拦截器,测试功能3、上代码maven... 继续阅读 >
202105-29 SpringBoot+redis配置及测试的方法 1.创建项目时选择redis依赖2.修改配置文件,使用SpringBoot就避免了之前很多的xml文件2.1学过redis的同学都知道这个东西有集群版也有单机版,无论哪个版本配置起来都很简单2.1.1首先找到配置文件 2.1.2然后配置集群版,直接在配置文件内编辑即可2.1.3配置单机版3.测试找到测试文件夹,自动注入redis模板4.分别测试操作String和Hash类型的数据4.1操作String@TestpublicvoidtestString(){//操作String类型的数据V... 继续阅读 >
202105-28 Redis5之后版本的高可用集群搭建的实现 一、安装redis1、安装gccyuminstallgcc2、下载redis-5.0.8.tar.gz3、把下载好的redis-5.0.8.tar.gz放在/gyu/software文件夹下,并解压>tarxzfredis-5.0.8.tar.gz>cdredis-5.0.84、进入到解压好的redis-5.0.8目录下,进行编译与安装>make&makeinstall5、启动并指定配置文件>src/redis-serverredis.conf(注意要使用后台启动,所以修改redis.conf里的daemonize改为yes)6、验证启动是否成功>ps-ef|grepredis7、进... 继续阅读 >