Redis Hash構造を使用してオブジェクトを格納し、有限フィールドを変更します.

30613 ワード

Redisのhash構造は特にオブジェクトを格納するのに適している.例えば、IDに基づいてRedisに格納された質問の答えがあります.
keyは「siye_answerId:」+answer.getId();
そしてオブジェクトをmapに変換して直接格納し、hashkeyをオブジェクトのfield、hashvalueをオブジェクトの値とする.
回答を閲覧したり、コメントしたり、いいねを押したり、踏んだり、コレクションしたりする操作がある場合は、この1つのフィールドを直接更新します.
そして、オブジェクトを取得するときに直接オブジェクトに変換することができます.
次に、インスタンスコードと変換されたツールクラス(基本データ型、String、Dateなどの中に2レベルのオブジェクトしか変換できないことに注意)
@Test
public void test2() throws Exception {
    Date date = new Date();
    UserInfo user = new UserInfo(25L, "  ", 2000, date);
    String key = "test_UserInfoId:" + user.getId();
    Map<String, String> stringMap = EntityUtils.objectToHash(user);//    map
    hashOps.putAll(key, stringMap);
    hashOps.put(key, "name", "   ");
    Map<String, Object> map4 = hashOps.entries(key);//   map  
    UserInfo user2 = EntityUtils.hashToObject2(map4, UserInfo.class);
    Long age = hashOps.increment(key, "age", 500L);//         ,        ;
    Map<String, Object> map5 = hashOps.entries(key);//   map  
    UserInfo user3 = EntityUtils.hashToObject2(map5, UserInfo.class);
    System.out.println(user3);
}

以下、コンバータ
public class EntityUtils {

    static {
        ConvertUtils.register(new LongConverter(null), Long.class);
        ConvertUtils.register(new ByteConverter(null), Byte.class);
        ConvertUtils.register(new IntegerConverter(null), Integer.class);
        ConvertUtils.register(new DoubleConverter(null), Double.class);
        ConvertUtils.register(new ShortConverter(null), Short.class);
        ConvertUtils.register(new FloatConverter(null), Float.class);
        ConvertUtils.register(new Converter() {
            public Object convert(Class type, Object value) {
                if (value == null) {
                    return null;
                }
                return new Date(Long.valueOf((String) value));
            }
        }, Date.class);
    }

    public static Map<String, String> objectToHash(Object obj) {
        try {
            Map<String, String> map = Maps.newHashMap();
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                if (!property.getName().equals("class")) {
                    if (property.getReadMethod().invoke(obj) != null) {
                        //                  long;
                        if (property.getReadMethod().invoke(obj) != null) {
                            if ("java.util.Date".equals(property.getPropertyType().getTypeName())) {
                                Date invoke = (Date) property.getReadMethod().invoke(obj);
                                long time = invoke.getTime();
                                map.put(property.getName(), String.valueOf(time));
                            } else {
                                map.put(property.getName(), "" + property.getReadMethod().invoke(obj));
                            }
                        }
                    }
                }
            }
            return map;
        } catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public static <T> T hashToObject2(Map, ?> map, Class t) {
        try {
            Object o = t.newInstance();
            BeanUtils.populate(o, (Map) map);
            return (T) o;

        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }
}