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

如何设置Redis Hash结构中field的过期时间

1.背景不知道大家有没有用Redis的Hash数据结构来缓存一种类的多个不同对象实体的经历,把不同对象的ID作为Hash的field,对象的JSON序列化字符串作为value。如果这个Hash里面的对象太多,且有部分对象过了一定时间后就不会再被访问到,这个时候我们是不是会想到要给其中某些field(后面暂且称之为子元素吧)给设置过期时间,不然的话,如果Hash里面的对象数量一直增长,将会造成Redis的内存爆炸。所以,怎么给Hash的子元素设置过期时间呢?2.是否是伪需求这时候有些同学就会说了,我直接把每一个field当做Redis的String类型的key,对象的JSON字符串作为String的value存不就可以了,这样不就可以针对每一个对象设置一个过期时间了。按理说,如果只要求设置过期时间,这样做是没问题的,而且这样做也最简单。但是如果你做过测试,你会发现同样数量的元素,用一个Hash结构存储和用若干个String结构存储,更节省内存。因为我们简单想一下,不管我们的Hash还是String类型的key,一般都会有个前缀,而用Hash定位一个元素只需要在Redis中存储一份这个前缀
 2022-03-14   技术分享    Redis 

如何查询日志中有多少个IP登录

“如何查询日志中有多少个IP登录?”,这是我之前面试百度实习生被问到的问题,当时因为没有什么经验也答得不好。因为最近经常有碰到类似的需求,所以令我又想起了这个问题。如果IP在日志中的一行出现的位置是这样的:"time":"2021-08-16T18:28:02.187","ip":"127.0.0.1" 如果只是grep ip那还好说,但是一个IP在日志中出现的次数可能超过一次,所以需要去重,在Linux中去重的命令是uniq,但是又因为uniq去重需要排序,所以需要先给IP排一下序。于是我们的命令可以这样写:grep ip|awk -F “,” ‘{print $2}’ | sort | uniq |wc -l这样就把所有登录的IP的次数统计出来了。但是还没完,这个时候假如产品经理又提了个需求:怎么统计出昨天上线,但是今天没上线的IP。这个时候你该怎么做呢?先把昨天上线的IP通过上面的方法输出到文件ip1.txt中,然后把今天上线的IP用同样的方法输出到ip2.txt中。然后用命令sort ip1.txt
 2021-08-16   技术分享    Linux  面试题 

1小时 -> 8秒!

最近优化了一个需求,从原来的1小时到现在的只需要8秒!因为数据在两个表,需要查询两次,然后合并两个集合的不同数据,于是有了这个需求。一开始想到的方法是遍历小集合的每一个元素,然后在大集合中删除和当前小集合的元素中相同id的元素。用到了removeIf方法,但是执行下来发现1百多万的数据操作用了1个小时,这是无法忍受的。本想着也就是一个for循环啊,怎么会这么慢,于是查看了一下List的removeIf方法,没想到这个方法还是循环集合中的每一个元素,找到符合条件的然后删除。这和外面的for循环组合起来其实是一个双层for循环,所以才导致这么慢。于是就想着能不能一遍循环解决。思考了一下,其实我本质要解决的问题是要把大集合中和小集合元素id值相同的删掉,那我可以循环大集合,然后看每一个id是否在小集合中有,如果有就删除,这样就相当于一个循环解决了。那么怎么看当前元素的id在小集合中有没有呢,这让我们想到了set集合,它可以做的事就是判断元素是否重复。重复的元素就不能添加进set集合,所以我们利用这个特性,先把小集合的所有元素的id放到一个set集合中,这个通过stream的map方法可以很容
 2020-11-19   技术分享    性能优化 

Java serialVersionUID 有什么作用?

我们都知道对象要序列化和反序列化要实现Serializable接口,但是仅仅知道这一点似乎还少了一点,那就是serialVersionUID要不要声明。有时候我们似乎不声明serialVersionUID也不会报错,但是有时候又会莫名其妙的收到InvalidClassException错误。似乎我们有必要来了解一下serialVersionUID的作用到底是什么了。在没有显示声明serialVersionUID的时候,Java编译器会给我们生成一个默认的serialVersionUID,并且这个生成也会遵循一定的规范。但是不同的Java编译器可能会生成不同的serialVersionUID,所以在反序列化的时候就会收到InvalidClassException的错误。所以为了避免因Java编译器不同导致反序列化失败的问题,最好还是要显示的声明一下serialVersionUID。这个serialVersionUID就是标明对象的版本的,如果版本号不对,Java将不会对其进行反序列化。所以这就能解释之前我在idea中启动项目把Redis中的一个缓存对象读出来反序列化为Java对象时为什么
 2020-10-09   技术分享   

怎么合并一个实例的两个不同对象

在工作过程中,我们可能会遇到这么一个需求,就是对于同一个类的两个不同对象(就是不为空的属性各不同)怎么合并他们成一个对象,并且包含他们两个的所有属性。因为要获取一个对象的所有属性,我们自然想到要用反射,于是就有了下面的代码:public static <T> T combineSydwCore(T sourceBean, T targetBean){ Class sourceBeanClass = sourceBean.getClass(); Class targetBeanClass = targetBean.getClass(); Field[] sourceFields = sourceBeanClass.getDeclaredFields(); Field[] targetFields = targetBeanClass.getDeclaredFields(); for(int i=0; i<sourceFields.length; i++){ Field sourceField = sourceFie
 2020-09-28   技术分享   
123…13

搜索

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