Redis哈希

本文详细介绍了Redis哈希结构的基本概念及其常用命令,并通过Spring框架的实际应用案例展示了如何操作Redis哈希结构,包括数据的增删改查及数值运算。

Redis哈希

哈希结构如同Java中的Map一样,一个对象里面有许多键值对,特别适合存储对象

Redis hash结构命令

命令说明备注
HDEL key field1 [field2]删除hash结构中的某个(些)字段可以进行多个字段删除
HEXISTS key field判断hash结构中是否存在field字段存在返回1,否则返回0
HGETALL key获取所有hash结构中的键值返回键和值
HGET key field获取存储在哈希表中指定字段的值
HINCRBY key field increment指定给hash结构中的某一字段加上一个整数要求该字段也是整数字符串
HINCRBYFLOAT key field increment指定给hash结构中的某一字段加上一个浮点数要求该字段是数字型字符串
HKEYS key返回hash中所有的键
HLEN key返回hash中键值对的数量
HMGET key field1 [field2]返回hash中指定键的值,可以是多个依次返回值
HMSET key field1 value1 [field2 value2 ]同时将多个 field-value (域-值)对设置到哈希表 key 中
HSET key field value将哈希表 key 中的字段 field 的值设为 value
HSETNX key field value只有在字段 field 不存在时,设置哈希表字段的值
HVALS key获取哈希表中所有值

如下的例子,Role有三个字段:

  • id
  • roleName
  • note

设置role

可能出现的问题【redis】WRONGTYPE Operation against a key holding

使用Spring去操作Redis的hash结构

首先先修改RedisTemplate的配置,如下,修改默认序列化器为字符串序列化:

    <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>

如果想为hash结构指定序列化器,可以使用RedisTemplate提供的属性:

  • hashKeySerializer
  • hashValueSerializer

通过如下的例子来说明:

    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.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"); //6

        //相当于hexist key field命令
        boolean exists = redisTemplate.opsForHash().hasKey(key, "f3");
        System.out.println(exists); //true

        //相当于hgetall命令
        Map keyValMap = redisTemplate.opsForHash().entries(key);
        System.out.println(keyValMap); //{f1=val1, f3=6, f2=val2}

        //相当于hincrby命令
        redisTemplate.opsForHash().increment(key, "f3", 2);
        printValueForhash(redisTemplate, key, "f3"); //8

        //相当于hincrbyfloat命令
        redisTemplate.opsForHash().increment(key, "f3", 0.88);
        printValueForhash(redisTemplate, key, "f3"); //8.88

        //相当于hvals命令
        List valueList = redisTemplate.opsForHash().values(key);
        System.out.println(valueList); //[val1, val2, 8.88]

        //相当于hkeys命令
        Set keyList = redisTemplate.opsForHash().keys(key);
        System.out.println(keyList); //[f1, f2, f3]

        //相当于hmget命令
        List<String> fieldList = new ArrayList<String>();
        fieldList.add("f1");
        fieldList.add("f2");
        List valueList2 = redisTemplate.opsForHash().multiGet(key, fieldList);
        System.out.println(valueList2); //[val1, val2]

        //相当于hsetnx命令
        boolean success = redisTemplate.opsForHash().putIfAbsent(key, "f4", "value4");
        System.out.println(success); //true

        //相当于hdel命令
        Long result = redisTemplate.opsForHash().delete(key, "f1", "f2");
        System.out.println(result); //2


    }

    private static void printValueForhash(RedisTemplate redisTemplate, String key, String field){
        //相当于hget命令
        Object value = redisTemplate.opsForHash().get(key, field);
        System.out.println(value);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值