ok,直接进入主题,今天要讲的Jedis操作Redis的Hash类型,我们以操作带动理解的形式进行展开。
private void setHashValue(String key){
//设置值,field的为HashMap中的Key :hset key field value
String field = "otherKey";
Long hset0 = getJedis().hset(key, field, "可以存对象");
//hget 读取单个field的值
String hget = getJedis().hget(key, field);
//直接修改已存在的值 如果field已存在则执行修改,并返回0
Long hset1 = getJedis().hset(key, field, "hash为散列类型");
//hexists 判断field是否存在 :hexists key field
Boolean hexists = getJedis().hexists(key, field);
//hsetex 如果field不存在则添加, 已存在则不会修改值, 可用来添加要求不重复的field
Long hsetnx = getJedis().hsetnx(key, "id", "3");
Long id = getJedis().hsetnx(key, "id", "hsetnx");
//hmset 批量设置或获取field-value :hmset key field value [field value ...]
Map<String, String> msets = new HashMap<>(10);
msets.put("color", "red");
msets.put("width", "100");
msets.put("height", "80");
String hmset = getJedis().hmset(key, msets);
//hmget key field [field ...]
List<String> mget = getJedis().mget(key, "color", "width", "height");
String string = Arrays.toString(mget.toArray());
//hincrBy 在整数类型值上增加, 返回修改后的值 :hincrby key field
// hincrbyfloat key field
Long hincrBy = getJedis().hincrBy(key, field, 4);
//hlen 读取field数量
Long hlen = getJedis().hlen(key);
//hkeys 读取所有field
Set<String> hkeys = getJedis().hkeys(key);
//hvals 读取所有值
List<String> hvals = getJedis().hvals(key);
//hgetAll 获取所有键值对
Map<String, String> map = getJedis().hgetAll(key);
//hdel 删除field
Long hdel = getJedis().hdel(key);
//删除多个field
Long hdel1 = getJedis().hdel(key, "color", "width", "height");
/**
* SETEX 是一个原子性(atomic)操作,
关联值和设置生存时间两个动作会在同一时间内完成,
该命令在 Redis 用作缓存时,非常实用。
SET key value
EXPIRE key seconds # 设置生存时间
*/
String value = getJedis().setex(key, 1000, "value");
}
哈希类型是指键值本身又是一个键值对结构 即 Hash类型的Value为自己的一种ZipMap,当Hash对象存的value值不多的情况下,Redis 会采用节约内存空间的方式 压缩列表 来存储Value,而不真正使用HashMap结构,这个时候值对应的redisObject 的 encoding 为 ziplist,当存的Value 越来越多,Redis会采用 字典来存储Value,此时的encoding 为 ht。
在上一篇有提到过Redis有五种对象数据类型,十种的对象编码格式,而哈希对象 对应的type则为 #define OBJ_HASH 4 。
对象编码则为:
REDIS_HASH REDIS_ENCODING_ZIPLIST