Redishash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象。 相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存, 并且可以更方便的存取整个对象。省内存的 原因是新建一个hash对象时开始是用zipmap(又称为smallhash)来存储的。这个zipmap其实并不是hash table,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。 尽管zipmap的添加,删除,查找都是 O(n),但是由于一般对象的field数量都不太多。所以使用zipmap也是很快的,也就是说添加删除平均还是O(1)。如果field或者 value的大小超出一定限制后,Redis会在内部自动将zipmap替换成正常的hash实现.这个限制可以在配置文件中指定 hash-max-zipmap-entries64#配置字段最多64个。 hash-max-zipmap-value512#配置value最大为512字节。
说了这么多的理论,上点操作怎么样
1、hset 设置hashfield为指定值,如果key不存在,则先创建。 127.0.0.1:6379>hsetusername 127.0.0.1:6379>hsetusernameheinrich (integer)0 127.0.0.1:6379>hsetuserage14 (integer)1 127.0.0.1:6379> 如果存在返回0 2,hsetnx 设置hashfield为指定值,如果key不存在,则先创建。如果field已经存在,返回0,nx是notexist的意思。 127.0.0.1:6379>hsetuserage14 (integer)1 127.0.0.1:6379>hsetnxusernameheinrich (integer)0 127.0.0.1:6379>hsetnxusernamebob (integer)0 127.0.0.1:6379>hsetnxuserweigth20kg (integer)1 127.0.0.1:6379> 所有的redis操作都只需要关注key和value无关,看上面就知道了 3,hmset 同时设置hash的多个field。 127.0.0.1:6379>hmsetusernamegeeage12 OK 4,hget 获取指定的value值 127.0.0.1:6379>hsetusernamegas (integer)0 127.0.0.1:6379>hgetusername "gas" 127.0.0.1:6379>hgetuserage "12" 127.0.0.1:6379> 5,hmget 获取全部指定的hashfiled。 127.0.0.1:6379>hmgetusernameagepassword 1)"gas" 2)"12" 3)(nil) 127.0.0.1:6379> 由于数据库没有field3,所以取到的是一个空值nil。 6,hincrby 指定的hashfiled加上给定值。也可以说是做加减法操作 127.0.0.1:6379>hincrbyuserage12 (integer)123456 127.0.0.1:6379>hmgetusernameage 1)"gas" 2)"12" 127.0.0.1:6379> 7,hexists 测试指定field是否存在。 127.0.0.1:6379>hexistsusername (integer)1 127.0.0.1:6379>hexistsusername1 (integer)0 127.0.0.1:6379> 如果存在返回1不存在返回0 8,hlen 返回指定hash的field数量。 127.0.0.1:6379>hlenuser (integer)5 9,hdel 删除指定的对象中的元素并返回删除的hash的field数量。 127.0.0.1:6379>hlenuser (integer)5 127.0.0.1:6379>hdeluserpwd (integer)1 127.0.0.1:6379>hmgetusernameage 1)"gas" 2)"12" 127.0.0.1:6379> 当然我们的del可是万能的可以直接删除hashmap中的对象 127.0.0.1:6379>hmsetusernameheinrichage21 OK 127.0.0.1:6379>hmgetusernameage 1)"heinrich" 2)"21" 127.0.0.1:6379>deluser (integer)1 127.0.0.1:6379>hmgetusernameage 1)(nil) 2)(nil) 127.0.0.1:6379> 这就叫牛掰,完胜其他的del操作 11,hvals 返回hash的所有value。 127.0.0.1:6379>hmsetusernameheinrichage21pwdroot OK 127.0.0.1:6379>hvalsuser 1)"heinrich" 2)"21" 3)"root" 127.0.0.1:6379> 主管再也不用担心我的学习了 但是看不到key,就像是找不到老婆,多难受 12,hgetall 获取某个hash中全部的filed及value。看到没就是这么牛掰,请记住不是hmgetall是hgetall 127.0.0.1:6379>hgetalluser 1)"name" 2)"heinrich" 3)"age" 4)"21" 5)"pwd" 6)"root" 127.0.0.1:6379>