redis存储对象,实体类新加字段空指针问题处理

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

一般用缓存对象时,通过序列化存储,在实体类新加字段的时候,反序列化成对象是新加字段会为空,这个问题很容易被忽略,如果自己没有做好处理,上线会有大量的空指针异常,为解决这个问题,我们对做了一些对redis的key做了处理。

eg.我们给一个活动配置加了缓存。

class Activity{

  String name;//名称

  Boolean limit1;//参与活动限制1

  Boolean limit2;//参与活动限制1

...

}

if(limit1){

//符合条件。。

}

redis key ;ACTIVITY_KEY expire time:1hour

如果我们现在已经在正式环境上运行一段时间表现良好,现在我们加了一个限制limit3;

获取到缓存中Activity的limit3是null的,

if(limit3){//throw NullPointExecption

//符合条件。。

}

项目中可能类似的地方会比较多我的处理办法是key+version(Activity.class);

private static int version(Class clazz){
  return clazz.getDeclaredFields().length;
}

通过标记class中所有field的数量加入缓存,在添加实体类中的属性时更新后会自动将redis的key替换掉,从而达到避免空指针的问题

时间: 2024-10-25 11:15:20

redis存储对象,实体类新加字段空指针问题处理的相关文章

redis存储对象与对象序列化详解

redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis存储对象序列化和反序列化 首先来了解一下为什么要实现序列化 为什么要实现序列化接口 当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以. 把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象.甚至可以将该

python的类和对象(类的静态字段)

转自:http://www.cnblogs.com/Eva-J/p/5044411.html 什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首先看它的位置,是在father类中,而不是在__init__中.那么一个小小的静态字段,我为什么要特意写一篇番外给它呢?耐着性子看下去,你就会发现一个小小的类变量,却折射出了整个类的世界. 首先我们先来解释

实体类在set字段时报空指针异常

实体类在set字段时报空指针异常的原因: T_Entry entry=null;entry.setGeneName("1212");entry.setEntryName("ACLAM");text = product.text().toString();if(productName.toString().startsWith("<h2><strong>")){ entry.setEntryName(text); data.

实体类与数据库字段不匹配问题,java.sql.SQLSyntaxErrorException: Unknown column &#39;xxx&#39; in &#39;field list&#39;

控制台报错 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'user_name' in 'field list' ### The error may exist in panfeng/mapper/StudentMapper.java (best guess) ### The error may involve panfeng.mapper.StudentMapper.se

Mybatis中实体类中的字段跟对应表的字段不一致时解决办法

解决字段名与实体类属性名不相同的冲突 实体类字段: public class Order { private int id; private String orderNo; private float price; } 对应数据库表字段: CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); 方式一:通过在sql语句中定义别名: <selec

[问题解决]ALV新加字段不显示

1, 问题描述 ALV上新加了几个字段,开发机/测试机都显示正常,但是传到P系统就是不显示... 2, 问题解决 经过调查,发现是默认布局设置的问题,新加的字段在布局的列设置(Column Set)中,没有放在displayed columns中...这应该是个常见问题.. 以上. 原文地址:https://www.cnblogs.com/lvdong18847870057/p/12541939.html

关于entityframework 自动生成实体类中加验证的属性重新生成后属性被覆盖解决办法

1.手动创建一个部分类 (你可以手动创建 partial class, 内容为空) [MetadataType(typeof(AppleMetadata))] public partial class Apple { } 2.创建一个元数据类 ( AppleMetadata class, 在其中添加你需要的验证, field 的名字与 原来的Apple class 要一致) 3.修改ef的模板,是生成的实体类带有MetadataType属性

数据库动态存储动态实体类实例

“小安,这个表中缺少一个字段,用来保存地区码”,业务经理指着原型图,指责的看着我. “我知道了,我马上去加”,等我alter table add column 之后,对应的java bo,vo ,entity 实体,xml 等 修改测试之后,一个小时过去了······· “小安,你过来一下,原型图需要改动,需要加一个用户的邮箱”,业务经理客气的给我说道,并且 巴拉巴拉了十五分钟. “好,我改”,等我alter table add column 之后,对应的java bo,vo ,实体,xml 对

redis存储对象(转)

原文地址:http://www.cnblogs.com/JKayFeng/p/5911544.html 为什么要实现序列化接口 当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以. 把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象.甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计 算机平