方程的博客 
  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
  •     

如何删除Redis Hash数据结构中的子键呢?

Redis可以设置某个键的过期时间这个我们都知道,可是你知道怎么过期删除Hash键中某个子键吗?Redis中可没有直接提供这样设置Hash键的子键的过期方法,但是我们可以自己用Redis实现这个需求。这里我们需要借用Redis中另外一个数据结构,那就是ZSET。我们在往Hash键中增加一个子键的时候,同时把该子键将要过期的时间戳当做score放进一个ZSET数据结构的键中,在用一个定时任务去定时扫描ZSET键,获取键中小于当前时间的子键,然后就可以根据这样获得的子键去Hash键中删除对应的子键了。这样说可能有点抽象,我们用一个具体的例子来说明一下。假如我们有一个这样的Hash键:CallRecord,然后里面存储的hkey是一个电话号码,value是这个电话号码的呼叫状态。然后有这样一个ZSET:CallRecord:ExpireAt,只要我们每产生一个呼叫记录,就把电话号码当做子键,对应电话号码相应的过期时间当做score塞进这个ZSET。这个过期时间可以是当前时间戳加上一个时间段,比如12小时。然后我们写一个定时任务,每分钟或者每秒(这个频率可以自己设置)扫描这个CallRecor
 2020-07-22   技术分享   

如何减少重复日志

在实际项目中,你可能会遇到被大量重复日志刷屏的苦恼,这种短时间内重复的日志不仅浪费服务器内存,而且影响你看其他日志。那么你可能会想,有没有一种方法能够让我既打印出这些日志,但又不想重复日志太多的方法。最近我就遇到了这种需求,有些日志不能不打,不然出了问题回过头来发现没有日志也不好定位问题,但是有时候因为定时任务的原因,这种日志又比较多,于是我就想着怎么去减少这种重复的日志。最朴素的想法就是给重复的日志计数,达到指定的数目就打一条日志,这样就达到了减少重复日志输出的目的。这样做的好处是不用借助其他框架,直接修改打印日志的代码就好了。坏处就是可能会对代码有一定的侵入性。于是顺着这个思路,我写了一个减少打印重复日志的工具类,在原来打印日志的地方调用这个工具类就可以起到减少重复日志的效果。代码如下:import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; /** * 用来减少打印重复日志
 2020-07-22   技术分享   

volatile为什么能禁止指令重排

在回答题目之前我们先来思考这样一个问题,就是指令重排是什么,我们为什么又要禁止它,以及在什么时候要禁止指令重排?我们都知道,像Java等高级语言最后都要被编译器转换为机器语言,或者称作机器指令,以便能被机器直接执行。所以,我们编写的程序最后都是一条条机器指令,从而能被CPU执行。在计算机组成原理这门课中,我们知道,这些指令被放在指令寄存器中,由程序计数器PC去指示CPU下一条该执行那条指令。CPU先从程序计数器中拿到下一条指令在指令寄存器的地址,计数器加一,然后把指令从指令寄存器中读出来,最后执行,然后又循环这个过程。又由于CPU的速度远大于寄存器的速度,所以为了增加CPU的并发度,在多核CPU中可能会有多核去拿指令,然后执行,所以在这个过程中,原本的代码顺序可能会被重新排序,这就是指令重排。当然,在单线程下,有些语句的顺序天然不能被重排,比如下面这种:int a = 1; // A int b = 2; // B int c = a * b; // C C的执行顺序必须在A和B后面,因为C依赖A和B,这种情况叫做as-if-serial语义。但是A和
 2020-07-05   技术分享   

LeetCode精选代码集

242. 有效的字母异位词我一开始的代码 public static boolean isAnagram(String s, String t) { char[] c1 = s.toCharArray(); char[] c2 = t.toCharArray(); if(c1.length != c2.length) { return false; } int[] m1 = new int[128]; int[] m2 = new int[128]; for(int i = 0; i < c1.length; ++i) { m1[c1[i]]++; m2[c2[i]]++; } for(char c : c1) { if(m1[c] != m2[c]){ return false;
 2020-06-30   技术分享    LeetCode 

为什么我的异常日志没有打印出来?!

背景最近在使用线程池的过程中,发现线程池执行的任务报错后没有错误日志打出来。纳尼?!线程池竟然还有这个坑?都说源码面前无秘密,所以我翻看了一下Java源码,客官请往下看:源码分析1. submit源码分析由于这个不打印异常日志的问题是因为使用submit方法引起的,所以我们先看一下submit方法的源码:/** * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Void> ftask = newTaskFor(task, null); execute(ftask); return ftask; } 我们可以看到这个方法把Runnable类型的任务转换成了Future类型的任务。
 2020-06-26   技术分享    线程池 
1234…13

搜索

Hexo Fluid
 总访问量 次   总访客数 人 
京ICP证18060568号  |  京公网安备18060568号