了解Redis数据结构——哈希

Redis中哈希结构就如同Java的map一样,一个对象里面有许多键值对,它是特别适合存储对象的,如果内存足够大,那么一个Redis的hash结构可以存储40多亿。在Redis中,hash是一个String类型的field和value的映射表,因此我们存储的数据实际在Redis内存中都是一个个字符串而已。
假设角色有3个字段:编号(id)、角色名称(roleName)和备注(note),这样就可以使用一个hash结构保存它。它的内存结果如下所示:

role_1

id:  001
roleName:role_name_001
note:note_001

在Redis中他就是这样的结构,其中role_1代表的是这个hash结构在Redis内存的key,通过它就可以找到这个hash结构,而hash结构由一系列的field和value组成。hash的键值对在内存中是一种无序的状态,我们可以通过键找到对应的值。
Redis hash结构命令:

  • hdel key field1 [field2…]:删除hash结构中的某个或某些字段,可以进行多个字段的删除。(删)
  • hexists key field:判断hash结构中是否存在field字段,存在返回1,否则返回0。
  • hgetall key:获取所有hash结构中的键值,返回键和值。(查)
  • hincrby key field increment:指定给hash结构中的某个字段加上一个整数,要求该字段也是整数字符串。
  • hincrbyfloat key field imcrement:指定给hash结构中的某个字段加上一个浮点数,要求该字段是数字型字符串。
  • hkeys key:返回hash中所有的键。(查)
  • hlen key:返回hash中键值对的数量。(查)
  • hmget key field1 [field2…]:返回hash中指定的键的值,可以是多个,依次返回值。(查)
  • hmset key field1 value1 [field2 value2…]:hash结构设置多个键值对。(增,改)
  • hset key field value:在hash结构中设置键值对,单个设值。(增)
  • hsetnx key field value:当hash结构中不存在对应的键,才设置值。(增)
  • hvals key:获取hash结构中所有的值。(查)

现在我们用一个例子来使用Spring去操作Redis得hash结构,由于Spring对Redis进行了封装,所以有必要对RedisTemplate的配置项进行修改。代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="50" />
        <property name="maxTotal" value="100" />
        <property name="maxWaitMillis" value="20000" />
    </bean>

    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />

    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="localhost" />
        <property name="port" value="6379" />
        <property name="password" value="123456" />
        <property name="poolConfig" ref="poolConfig" />
    </bean>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultSerializer" ref="stringRedisSerializer" />
        <property name="keySerializer" ref="stringRedisSerializer" />
        <property name="valueSerializer" ref="stringRedisSerializer" />
    </bean>
</beans>

然后我们编写一个方法去操作Redis。代码如下:

package com.ssm.redis1.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.*;

public class testRedisHash {
    public static void main(String[] args){
        ApplicationContext applicationContext=new 
        							ClassPathXmlApplicationContext("redisSpring-cfg.xml");
        RedisTemplate redisTemplate=applicationContext.getBean(RedisTemplate.class);
        String key="hash";
        Map<String,String> map=new HashMap<String,String>();
        map.put("f1","val1");
        map.put("f2","val2");
        //相当于hmset命令
        redisTemplate.opsForHash().putAll(key,map);
        //相当于hset命令
        redisTemplate.opsForHash().put(key,"f3","6");
        printValueForhash(redisTemplate,key,"f3");
        //相当于hexists key filed命令
        boolean exists=redisTemplate.opsForHash().hasKey(key,"f3");
        System.out.println(exists);
        //相当于hgetall命令
        Map keyValMap=redisTemplate.opsForHash().entries(key);
        //相当于hincrby命令
        redisTemplate.opsForHash().increment(key,"f3",2);
        printValueForhash(redisTemplate,key,"f3");
        //相当于hincrbyfloat命令
        redisTemplate.opsForHash().increment(key,"f3",0.88);
        printValueForhash(redisTemplate,key,"f3");
        //相当于hvals命令
        List valueList=redisTemplate.opsForHash().values(key);
        //相当于hkeys命令
        Set keyList=redisTemplate.opsForHash().keys(key);
        List<String> fieldList=new ArrayList<>();
        fieldList.add("f1");
        fieldList.add("f2");
        //相当于hmget命令
        List valueList2=redisTemplate.opsForHash().multiGet(key,keyList);
        //相当于hsetnx命令
        boolean success=redisTemplate.opsForHash().putIfAbsent(key,"f4","val4");
        System.out.println(success);
        //相当于hdel命令
        Long result=redisTemplate.opsForHash().delete(key,"f1","f2");
        System.out.println(result);

    }

    private static void printValueForhash(RedisTemplate redisTemplate, String key, String f3) {
        //相当于hget命令
        Object value=redisTemplate.opsForHash().get(key,f3);
        System.out.println(value);
    }
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值