And correcting the spelling of "SEPERATOR" would be a plus while changing the code.
*Wes Williams | Pivotal Advisory **Data Engineer* 781.606.0325 http://pivotal.io/big-data/pivotal-gemfire On Mon, Mar 6, 2017 at 6:14 PM, galen-pivotal <g...@git.apache.org> wrote: > Github user galen-pivotal commented on a diff in the pull request: > > https://github.com/apache/geode/pull/404#discussion_r104549703 > > --- Diff: geode-core/src/main/java/org/apache/geode/redis/internal/ > executor/hash/HashInterpreter.java --- > @@ -0,0 +1,126 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > contributor license > + * agreements. See the NOTICE file distributed with this work for > additional information regarding > + * copyright ownership. The ASF licenses this file to You under the > Apache License, Version 2.0 (the > + * "License"); you may not use this file except in compliance with > the License. You may obtain a > + * copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, > software distributed under the License > + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR > CONDITIONS OF ANY KIND, either express > + * or implied. See the License for the specific language governing > permissions and limitations under > + * the License. > + */ > +package org.apache.geode.redis.internal.executor.hash; > + > +import java.util.Map; > + > +import org.apache.geode.cache.Region; > +import org.apache.geode.redis.GeodeRedisServer; > +import org.apache.geode.redis.internal.ByteArrayWrapper; > +import org.apache.geode.redis.internal.Coder; > +import org.apache.geode.redis.internal.ExecutionHandlerContext; > +import org.apache.geode.redis.internal.RedisDataType; > + > +/** > + * Utility class for interpreting and processing Redis Hash data > structure > + * > + * > + */ > +public class HashInterpreter { > + > + /** > + * <pre> > + * The region:key separator. > + * > + * REGION_KEY_SEPERATOR = ":" > + * > + * See Hash section of <a href= > + "https://redis.io/topics/data-types">https://redis.io/ > topics/data-types#Hashes</a> > + * </pre> > + */ > + public static final String REGION_KEY_SEPERATOR = ":"; > + > + /** > + * The default hash region name REGION_HASH_REGION = Coder. > stringToByteArrayWrapper("ReDiS_HASH") > + */ > + public static final ByteArrayWrapper REGION_HASH_REGION = > + Coder.stringToByteArrayWrapper(GeodeRedisServer.HASH_REGION); > + > + /** > + * Return the region presenting the hash > + * > + * @param key the raw Redis command key that may contain the > region:key formation > + * @param context the exception handler context > + * @return the region were the command's data will be processed > + */ > + @SuppressWarnings("unchecked") > + public static Region<ByteArrayWrapper, Map<ByteArrayWrapper, > ByteArrayWrapper>> getRegion( > --- End diff -- > > @ggreen yeah, I'd put everything in one region because I think it's > easier to understand, and because it's much cheaper to create new hash > objects in a region than it is to create new regions. Though if you want to > see my hidden agenda, look ahead: > > if I were to redesign data storage in the Redis adapter, I think I > would do away with the separate region per type and a metadata region that > just stores types, and implement the whole thing as one region that stored > collections of all the types we support. During the lookup we could catch a > `ClassCastException` if the key is the wrong type, and then we'd propagate > that up as the same error Redis throws when you try to modify a key that is > of the wrong type. > > Storing collections as Java objects rather than via some translation > to a Region means that as the objects get larger, the cost of transferring > them between members in the system increases as well. Geode contains a > `Delta` interface that I think we could use to avoid the overhead of > transferring the whole object every time. Then the only downside is that we > can't scale a single hash/set/list across servers, which I think is fine -- > do you really need to store a list in Redis that takes more than however > many gigabytes of RAM are in a single Geode instance? Some folks on the > user/dev lists seem to disagree with this view, though, so take it with a > bit of salt. > > The other thing I'd like to look at to implement this is how we want > to store and process data -- the whole `ByteArrayWrapper`/`String` thing > could be simplified, but I think that's fairly orthogonal to the region and > command interpreter implementation. > > I don't know that much about the end users of Redis, though, so I'm > curious: what are you using the Redis adapter for? What use case are you > optimizing for? > > > --- > If your project is set up for it, you can reply to this email and have your > reply appear on GitHub as well. If your project does not have this feature > enabled and wishes so, or if the feature is enabled but not working, please > contact infrastructure at infrastruct...@apache.org or file a JIRA ticket > with INFRA. > --- >