redis-hash的基本介绍

其实要理解redis是用的hash类型,结合学过的数据结构哈希表是最好的;就比如Java中你要去创建一个哈希表:HashMap<String,String> hash=new HashMap<>();这里有三个关键词,hash--哈希表的名字,第一个String--key的数据类型,第二个String--value的数据类型;而redis是如何利用hash作为集合来记录数据呢?如下图所示:

一样是有三个关键词:key,field,value,key的作用就相当于hash表的名字,是唯一的,redis的key名字都是唯一的,这里也不例外,目的就是为了区分不同的键值对;field的作用就相当于哈希表的key,在哈希表中是唯一的,用来表示哈希表中的数据的一个键值对,value的作用就相当于哈希表中key-value中的value,表示键值对存的数据,是可以跟其他key的value重复的,没有唯一性;

如果到这里还不清楚redis中的hash的使用的话,这里简单举一个例子:比如你要存一个用户信息,可以如下图所示:user:1就是这个hash的名字,也就是key,field分别就是name、age、gender、studentId,以及他们对应的值value。

1、hset

        hset key field value[field value ......]

        可以创建一个数据类型为hash的键值对,比较特殊的是可以一次性插入多个field-value,返回值就是插入成功的个数(新增,修改的不算);值得注意的是,value只能是字符串;时间复杂度是O(N),不过这个N是指插入的键值对的个数,不是redis的所有键值对个数,首先redis要查到key时间复杂度就是O(1),又因为hash的特殊结构,所以在hash中插入或者查询一个field时间也是O(1),所以时间复杂度是O(N),N指的是插入的键值对的个数;虽然redis支持一次性插入多个键值对,这样有利于减少网络开销,但是我们也不建议一次性插入成百上千个,这可能会导致redis卡顿

2、hget

     hget key fiel

     这个指令可以一个field对应的value,能查到的就返回对应的value,查不到就返回nil,时间复杂度不用说肯定也是O(1),原理和hset是一致,也是多亏了hash的结果,只要用field去计算hash值就能够知道这个键值对存不存在;

3、hexists

       hexists key fiekld

        从字面意思也能看出就是去判断这个key对应的hash中是否包含这个field,存在就返回1,不存在就返回0;比较可惜的是他只能判断一个,不能一次性判断多个,时间复杂度也是O(1);

4、hdel

        hdel key field [field ...]

      这个指令是删除hash中field对应的的这个键值对,可以一次性删除多个,返回值是删除的个数,同样的一次性删除多个可以减少网络开销,但是要注意适量,时间复杂度O(1);

5、hincrby,hincrbyfloat

        hincrby/hincrbyfloat key field increment

        hash的这个对value为数字的加减操作指令就只使用这两个去覆盖加减整数,以及加减小数,如果操作的键值对的value不是数字,就会返回报错,如果操作正确,就会返回一个修改后数字,比如原来是10,加上10,就会返回一个20

6、hkeys,hvalues hgetall

        hkeys key这个指令返回的是key中包含的所有field

        hvalues key这个指令返回的是key中所有field对应的所有value,注意只是返回value,所有返回值是一致的,但是他们对应的是不同的field

        hgetall key就是返回全部的键值对,包括field和value

        这几个指令也要慎重操作,主要就是怕hash中包含的键值对非常多,一下子就返回回来那么多,可能就会造成redis卡顿,也是很严重的一件事,平常自己练习没事,因为键值对也不会有很多,造成卡顿影响也不多,最多只是影响你一个人,但是一旦在公司的生产环境上输入这个指令,就看会造成卡顿,可能会照成很严重的影响,也是一天一个失去年终的小技巧。

7、hmget

        hmget key field [field ...]

        这个指令的用法实际和mget是差不多的,就是去一次性获取多个field对应的value,能查到的就返回对应的value,查不到的就返回nil,时间复杂度是O(N),N是指查询的个数

实际上redis,有hmget,也有hmset,但是我这里不介绍hmset,是因为hmset的用法和hset的用法是一致的,都可以一次性插入多个键值对。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a添砖Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值