Redis中hash数据结构

1,hash数据结构:

数组+链表的形式

2,hash的value只能是字符串

3,hash可以用来存储对象信息。可以对对象中每一个属性进行单独存储

例如,可以存放用户信息:

如下图代码所示

    @Test
    public void jedisUser(){
        User user = new User();
        user.setAge(18);
        user.setName("Wayne");

        Map<String,String> tempMap = new HashMap<String, String>();

        tempMap.put("name",user.getName());
        tempMap.put("age",user.getAge()+"");

        jedis.hmset("user",tempMap);
        Map<String, String> user1 = jedis.hgetAll("user");
        System.out.println(user1);
    }

这样做的好处,可以只访问该对象的某个属性,节省网络流量。

 

Redishash数据结构是一个string数据类型的域和值的映射表,常用来存储对象的信息,每个hash数据结构可以存储2^32 - 1个键值对 [^1]。 在Redis中,哈希类型指值本身又是一个键值对结构,形如key="key",value={{field1,value1},{field2,value2},...,{fieldN,valueN}} [^2]。几乎所有主流编程语言都提供了类似的哈希类型,只是叫法可能不同,如哈希、字典、关联数组、映射等 [^2]。 hash数据结构和JDK中的hash有相似之处,定位一个元素需要由缓存的key + hash的key - field [^3]。以下是Java代码示例,展示了获取和添加元素的操作: ```java import org.springframework.data.redis.core.RedisTemplate; public class RedisHashExample { private RedisTemplate<String, Object> redisTemplate; public RedisHashExample(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } /** * 获取hash中field对应的值 * * @param key * @param field * @return */ public String hget(String key, String field) { Object val = redisTemplate.opsForHash().get(key, field); return val == null ? null : val.toString(); } /** * 添加or更新hash的值 * * @param key * @param field * @param value */ public void hset(String key, String field, String value) { redisTemplate.opsForHash().put(key, field, value); } } ``` hash数组中元素(dictEntry)是真正的数据节点,包括key、value和next节点 [^4]。 关于扩容,在dict->rehashidx == -1 ,也就是字典没有正在进行扩容/缩容的前提下,以下三种情况会对哈希表进行扩容并标记dict->rehashidx字段为0,且扩展的哈希表的数组大小是第一个hash表长度的2倍 [^4]: 1. 字典已使用节点数和数组大小之间的比率至少为1:1,并且dict_can_resize为true。 2. 已使用节点数和字典大小之间的比率超过dict_force_resize_ratio,该值默认为5。 3. 哈希表刚初始化完,是个空表,给哈希数组设置默认大小DICT_HT_INITIAL_SIZE (4)。 扩容方式为:为ht[1]分配长度为ht[0] 2倍长度,rehashIdx设置为0表示正在进行扩容rehash,采取渐进式rehashRedis对一个字典的rehash操作,不是一次性把该字典dict->ht[0]哈希表上所有哈希数组里的哈希数组元素全部重新哈希到dict->ht[1],而是将全部的rehash操作分散到对该字典操作的各个命令上,每次进行“一步”哈希操作(增加k/v,删除k/v,查找key,随机返回key)。下标从dict->rehashidx开始,在dict->ht[0].table数组中找到第一个不为NULL的项,将该项链表上的所有元素全部hash映射到ditct->ht[1]上,每重新映射一个元素,dict->ht[0].used --,dict->ht[1].used ++,该项链表处理完后,将dict->rehashidx ++ [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值