jedis

延迟任务的实现总结

早过忘川 提交于 2020-03-23 08:48:25
上一篇 写了使用RabbitMQ来实现延迟任务的实现,其实实现延迟任务的方式有很多,各有利弊,有单机和分布式的。在这里做一个总结,在遇到这类问题的时候希望给大家一个参考和思路。 延迟任务有别于定式任务,定式任务往往是固定周期的,有明确的触发时间。而延迟任务一般没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件。延迟任务相关的业务场景如下: 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时。 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单。 下面我们来探讨一些方案,其实这些方案没有好坏之分,和系统架构一样,只有最适合。对于数据量较小的情况下,任意一种方案都可行,考虑的是简单明了和开发速度,尽量避免把系统搞复杂了。而对于数据量较大的情况下,就需要有一些选择,并不是所有的方案都适合了。 1. 数据库轮询 这是比较常见的一种方式,所有的订单或者所有的命令一般都会存储在数据库中。我们会起一个线程去扫数据库或者一个数据库定时Job,找到那些超时的数据,直接更新状态,或者拿出来执行一些操作。这种方式很简单,不会引入其他的技术,开发周期短。 如果数据量比较大,千万级甚至更多,插入频率很高的话,上面的方式在性能上会出现一些问题,查找和更新对会占用很多时间,轮询频率高的话甚至会影响数据入库

Redis应用场景

試著忘記壹切 提交于 2020-03-23 08:07:15
1、 l iunux系统 redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统。和Memcached类似,但很大程度补偿了memcached的 不足,它支持存储的value类型相对更多,包括string、list、set、zset和hash。这些数据类型都支持push/pop、add /remove及取交集并集和差集及更丰富的操作。在此基础上,redis支持各种不同方式的排序。Redis数据都是缓存在计算机内存中,并且会周期性 的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。 redis官网地址: http://www.redis.io/ 最新版本:2.8.3 在Linux下安装Redis非常简单,具体步骤如下(官网有说明): 1、下载源码,解压缩后编译源码。 $ wget http://download.redis.io/releases/redis-2.8.3.tar.gz $ tar xzf redis-2.8.3.tar.gz $ cd redis-2.8.3 $ make 2、编译完成后,在Src目录下,有四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf。然后拷贝到一个目录下。 mkdir /usr/redis cp redis-server /usr/redis cp

redis 延时任务 2

…衆ロ難τιáo~ 提交于 2020-03-22 17:05:15
引言 在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别 定时任务有明确的触发时间,延时任务没有 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期 定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务 下面,我们以判断订单是否超时为例,进行方案分析 方案分析 (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现 博主当年早期是用quartz来实现的(实习那会的事),简单介绍一下 maven项目引入一个依赖如下所示 < dependency > < groupId > org . quartz - scheduler </ groupId > < artifactId > quartz </ artifactId > < version > 2.2.2 </ version > </ dependency > 调用Demo类MyJob如下所示 package com . rjzheng . delay1 ; import

浅谈布隆过滤器

情到浓时终转凉″ 提交于 2020-03-22 09:55:23
不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛身在互联网,做着开发的,无人不知,无人不晓,哪怕对技术不是很关心的小伙伴也听过它的名号。我也花了不少时间去研究布隆过滤器,看了不少博客,无奈不是科班出身,又没有那么聪明的头脑,又比较懒...经过“放弃,拿起,放弃,拿起”的无限轮回,应该算是了解了布隆过滤器的核心思想,所以想给大家分享下。 布隆过滤器的应用 我们先来看下布隆过滤器的应用场景,让大家知道神奇的布隆过滤器到底能做什么。 缓存穿透 我们经常会把一部分数据放在Redis等缓存,比如产品详情。这样有查询请求进来,我们可以根据产品Id直接去缓存中取数据,而不用读取数据库,这是提升性能最简单,最普遍,也是最有效的做法。一般的查询请求流程是这样的:先查缓存,有缓存的话直接返回,如果缓存中没有,再去数据库查询,然后再把数据库取出来的数据放入缓存,一切看起来很美好。但是如果现在有大量请求进来,而且都在请求一个不存在的产品Id,会发生什么?既然产品Id都不存在,那么肯定没有缓存,没有缓存,那么大量的请求都怼到数据库,数据库的压力一下子就上来了,还有可能把数据库打死。 虽然有很多办法都可以解决这问题,但是我们的主角是“布隆过滤器”,没错,“布隆过滤器”就可以解决(缓解)缓存穿透问题。至于为什么说是“缓解”,看下去你就明白了。 大量数据,判断给定的是否在其中 现在有大量的数据

使用redis

房东的猫 提交于 2020-03-22 08:42:26
1. 下载jedis包 https://repo1.maven.org/maven2/redis/clients/jedis/3.2.0/jedis-3.2.0.jar 2. 将 jedis-3.2.0.jar包导入 3. 测试 package TestRedis; import redis.clients.jedis.Jedis; public class Test1 { public static void main(String[] args) { //连接本地的 Redis 服务 Jedis jedis = new Jedis("localhost"); System.out.println("连接成功"); //查看服务是否运行 System.out.println("服务正在运行: "+jedis.ping()); //设置redis字符串 jedis.set("name","qiao"); System.out.println("redis 存储的字符串为 "+jedis.get("name")); } } 来源: https://www.cnblogs.com/hapyygril/p/12544004.html

redis在java客户端的操作

孤人 提交于 2020-03-22 08:04:49
redis高性能,速度快,效率高的特点,用来做缓存服务器是很不错的选择。(和memcache相似) redis在客户端的操作步骤: 1.redis单机版操作 1.1通过Jedis对象操作 (1)将安装redis服务的服务器的ip地址和redis的端口号作为构造参数传递给Jedis,用来创建一个Jedis对象   Jedis jedis = new Jedis(ip,port); (2)通过第一步创建的jedis对象,操作redis的5大数据类型(hash类型,string类型,list类型,set类型,zset类型,有序)   jedis.set(string key,string value);   jedis.get(string key); (3)操作完成后关闭jedis连接   jedis.close(); 这种方法需要每次创建连接,关闭连接,比较浪费资源。因此使用下面的jedisPool连接池操作单机版redis 直接上代码:      // 创建jedis对象 Jedis jedis = new Jedis("ip", 6379); // 操作string数据类型 jedis.set("username", "helloworld"); // 根据key取出对应的value值 String value = jedis.get("username"); // 值输出

redis连接池的使用方法

依然范特西╮ 提交于 2020-03-22 08:04:27
所需jar :jedis-2.8.0.jar和commons-pool-2-2.3jar Jedis操作步骤如下: 1->获取Jedis实例需要从JedisPool中获取; 2->用完Jedis实例需要返还给JedisPool; 3->如果Jedis在使用过程中出错,则也需要还给JedisPool; 1 package cn.crxy.redis; 2 3 import redis.clients.jedis.Jedis; 4 import redis.clients.jedis.JedisPool; 5 import redis.clients.jedis.JedisPoolConfig; 6 7 public class RedisUtils { 8 9 private RedisUtils(){ 10 11 } 12 13 private static JedisPool jedisPool = null; 14 //获取链接 15 public static synchronized Jedis getJedis(){ 16 if(jedisPool==null){ 17 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 18 //指定连接池中最大空闲连接数 19 jedisPoolConfig

Redis之JedisConnectionFactory通过哨兵发现master

余生长醉 提交于 2020-03-21 22:28:00
3 月,跳不动了?>>> JedisConnectionFactory中配置了哨兵后,会自动发现master节点,它是怎么做到的呢? 注:Spring-data-redis的版本: 1.8.7.RELEASE,Jedis的版本: 2.9.0.RELEASE 1.xml配置 List-1 properties文件省略了 <bean class="redis.clients.jedis.JedisPoolConfig" id="jedisPoolConfig"> <property name="maxTotal" value="${redis.maxTotal}"/> <property name="maxIdle" value="${redis.maxIdle}"/> <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"/> <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"/> <property name="minEvictableIdleTimeMillis" value="${redis

redis在java项目中的使用

天涯浪子 提交于 2020-03-21 17:04:53
在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用。 redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字,字符串等,可以用string-value的形式存储;另一种是存对象、集合等,最好用序列化的方式来存储。 1、存储简单数据 try { Jedis jedis = new Jedis(); jedis.set("name", "JackGSmith"); } catch (Exception e) { //如果缓存连不上,则不处理 System.out.println("登录无法更新该用户缓存"); } 从redis缓存中获取key为“name”的值,使用jedis.get("name"),用一个String变量接收即可。 2、存储对象、集合 存对象集合用序列化的方式存储,用反序列化的方式取值。存储的key和value都是转化成字节码的形式。 先定义一个抽象类:SerializeTranscoder.java,代码如下: package cn.com.taiji.sample.utils; import java.io.Closeable; import java.io.IOException; public abstract class SerializeTranscoder {

RedisAPI

烂漫一生 提交于 2020-03-18 14:44:42
linux下redis安装: redis官网地址:http://www.redis.io/ 最新版本:3.0.0 在Linux下安装Redis非常简单,具体步骤如下(官网有说明): 1、下载源码,解压缩后编译源码。 $ wget http://download.redis.io/releases/redis-3.0.0.tar.gz $ tar xzf redis-3.0.0.tar.gz $ cd redis-3.0.0 $ make $ make test $ make install 安装完毕后, 3、启动Redis服务。 $ redis-server redis.conf 4、然后用客户端测试一下是否启动成功。 $ redis-cli redis> set foo bar OK redis> get foo "bar" java使用API: package com.reapal.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * Created by dell on 2015/1/21. */ public class RedisAPI { private static