hash命令与string基本雷同,只不过是前面加个H,基本命令不进行阐述。
1.查看当前key类型
- type keyname
2.查看hash中一个field中有多少个key
3.查看当前哪些field中含有这个key
- hkeys keyname
4.可以查看当前key存在哪些field中,以及value值
- hgetall keyname
5.返回hash表中key的所有field值
- hvals keyname
6.hlen key
7.hstrlen key field
8.hincrby key field increment
9.hincrbyfloat key field increment
10.hmset key field value [field value...]
11.hmget key field [field value...]
12.hscan key cursor [match pattern] [COUNT count]
问题0:hset,hget和hmset,hmget的区别?
- 经过测试,hset和hmset的使用是雷同的?我也很纳闷(redis5.0.5)?
- hget一次只能获取一次,hmget一次可获取多个
问题1:redis中string的hash存储基本类似(key-value),区别是什么?
- redis hash是一个string类型的field和value的映射表,它的操作,添加和删除都是O1。
- hash特别适合存储对象,如果对象以string方式进行存储的话,就需要将对象拆成多个字符串。
- 针对第二点,string类型也可以存储对象序列化。
- 将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象,节省内存的原因是:新建一个hash对象时,开始时用zipmap(又称small hash)来存储的,这个zipmap其实并不是hash table,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。
问题2:redis中string和hash的使用场景
- 过期事件:string可以设置过期事件,hash过期时间只能设置在大key上,单个field不可设置超时时间。
- hash上单个不适合存储大量的field,并且field多个消费CPU,以散列表形式存储比较省内存。
- 实际中:String存储单个大文本非结构化数据。
- 实际中:Hash存储结构化数据,一个hash存储一条数据,一个field存储一条数据中的一个属性,value为属性值。
问题3:hash存储例子
- 假如数据库中有一张表user 包含 id,name,age,sex 4个属性
- 1、1,张三,16,1
- 2、2,李四,22,1
- 3、3,王五,28,0
- 4、4,赵六,32,1
- hset user_1 id 1 name 张三 age 16 sex 1
hset user_2 id 2 name 李四 age 16 sex 1
这样存储,如果用户的某个属性值改变,还可以单个修改。例如 吧张三的年龄改为30 则可以使用命令:
hset user_1 age 30