Redis数据类型--散列类型

夫陶公清风千古,余又何人,敢称庶几
在这里插入图片描述


介绍

Hashes,由field和关联的value组成的mapfieldvalue都是字符串的, hash 可以存储 2^32^ - 1 键值对(40多亿

一、基本命令

命令 介绍
HSET key field value 一次设置单个键值
HGET key field 一次获得单个值
HMSET key field value [field value …] 同时设置多个键值
HMGET key field [field …] 同时获取多个键值
HGETALL key 一次获取所有的键值
HEXISTS key field 判断字段是否存在
HSETNX key field value 当字段不存在时赋值
HINCRBY key field increment 增加数字
HDEL key field [field …] 删除字段

1. 赋值与取值

HSET key field value
HGET key field
HMSET key field value [FIELD VALUE …]
hget key field [field …]
HGETALL key // 获取所有字段的值

  • HSET/HGET
    一次只能设置和获取一个字段的值。
127.0.0.1:6379> hset user id 1001
(integer) 1
127.0.0.1:6379> hset user name breez
(integer) 1
127.0.0.1:6379> hset user age 22
(integer) 1
127.0.0.1:6379> hget user id
"1001"
127.0.0.1:6379> hget user name
"breez"
127.0.0.1:6379> keys *
1) "user"

解释:案例中user为键,idnameage为属性,在面向对象中,user相当于类,其他三个字段相当于成员属性

实践:使用Java操作Redis数据库:HSET、HGET

@Test
    public void testHSETAndHGET() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        jedis.hset("user", "id", "1001");
        jedis.hset("user", "name", "breez");
        jedis.hset("user", "age", "22");
        
        String id = jedis.hget("user", "id");
        String name = jedis.hget("user", "name");
        String age = jedis.hget("user", "age");

        System.out.println("id:" + id);
        System.out.println("name:" + name);
        System.out.println("name:" + age);
    }
id:1001
name:breez
name:22
  • HMSET/HMGET
    一次可以同时设置和获取多个字段的值
127.0.0.1:6379> hmset user id 1001 name breez age 22
OK
127.0.0.1:6379> hmget user id name age
1) "1001"
2) "breez"
3) "22"
127.0.0.1:6379> hmget user id
1) "1001"
127.0.0.1:6379> hmget user name
1) "breez"
127.0.0.1:6379> hmget user age
1) "22"
127.0.0.1:6379> keys *
1) "user"
  • HGETALL
    同时获取所有字段的值
127.0.0.1:6379> keys *
1) "user"
127.0.0.1:6379> hgetall user
1) "id"
2) "1001"
3) "name"
4) "breez"
5) "age"
6) "22"

实践:使用Java操作Redis数据库:HMSET、HMGET

@Test
    public void testHMSETAndHMGET() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        HashMap<String, String> map = new HashMap<>();
        
        map.put("id", "1001");
        map.put("name", "breez");
        map.put("age", "22");
        
        jedis.hmset("user", map);
        List<String> user = jedis.hmget("user", new String[]{
    
    "id", "name", "age"});
        user.forEach(u -> System.out.println(u));
    }
1001
breez
22

2. 判断字段是否存在

HEXISTS key field

此命令用来判断一个字段是否存在。如果存在返回1,不能存在返回0,如果不存在也返回0.

127.0.0.1:6379> keys *
1) "user"
127.0.0.1:6379> hgetall user
1) "id"
2) "1001"
3) "name"
4) "breez"
5) "age"
6) "22"
127.0.0.1:6379> hexists user name //name字段存在返回 1
(integer) 1
127.0.0.1:6379> hexists user other //other字段不存在返回0
(integer) 0
127.0.0.1:6379> hexists other other //other键不存在返回0
(integer) 0

实践:使用Java操作Redis数据库:HEXISTS

@Test
    public void testHEXISTS() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Boolean user_name = jedis.hexists("user", "name");
        Boolean user_other = jedis.hexists("user", "other");
        Boolean other_other = jedis.hexists("other", "other");
        System.out.println("user_name:" + user_name);
        System.out.println("user_other:" + user_other);
        System.out.println("other_other:" + other_other);
    }
user_name:true
user_other:false
other_other:false

3.当字段不存在时赋值

HSETNX key field value

HSETNX 命令与HSET 命令类似,区别在于如果字段已经存在,HSETNX命令将不执行任何操作。

127.0.0.1:6379> keys *
1) "user"
127.0.0.1:6379> hgetall user
1) "id"
2) "1001"
3) "name"
4) "breez"
5) "age"
6) "22"
127.0.0.1:6379> hsetnx user id 1001 //id字段存在
(integer) 0
127.0.0.1:6379> hsetnx user id 1002 //id字段存在
(integer) 0
127.0.0.1:6379> hsetnx user sex male //sex 字段不存在
(integer) 1

实践:使用Java操作Redis数据库:HSETNX

@Test
    public void testHSETNX() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Set<String> keys = jedis.keys("*");
        Map<String, String> user = jedis.hgetAll("user");
        
        System.out.println("所有的键:" + keys);
        System.out.println("user键中所有的键值:" + user);
        
        Long hsetnx_1 = jedis.hsetnx("user", "id", "1001");
        Long hsetnx_2 = jedis.hsetnx("user", "id", "1002");
        Long hsetnx_sex = jedis.hsetnx("user", "sex", "male");
        
        System.out.println(hsetnx_1);
        System.out.println(hsetnx_2);
        System.out.println(hsetnx_sex);
    }
所有的键:[user]
user键中所有的键值:{
    
    name=breez, age=22, id=1001}
0
0
1

4.增加数字

HINCRBY key field increment

此命令的默认值为0.

127.0.0.1:6379> keys *
1) "user"
127.0.0.1:6379> hgetall user
1) "id"
2) "1001"
3) "name"
4) "breez"
5) "age"
6) "22"
7) "sex"
8) "male"
127.0.0.1:6379> hincrby user score 20
(integer) 20
127.0.0.1:6379> hget user score
"20"
127.0.0.1:6379> hincrby user score 30
(integer) 50
127.0.0.1:6379> hget user score
"50"
127.0.0.1:6379> hgetall user
 1) "id"
 2) "1001"
 3) "name"
 4) "breez"
 5) "age"
 6) "22"
 7) "sex"
 8) "male"
 9) "score"
10) "50"

实践:使用Java操作Redis数据库:HINCRBY

@Test
    public void testHINCRBY() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);

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

        Long score_20 = jedis.hincrBy("user", "score", 20);
        Long score_30 = jedis.hincrBy("user", "score", 30);

        System.out.println(score_20);
        System.out.println(score_30);
        
        System.out.println(jedis.hgetAll("user"));
    }
{
    
    name=breez, age=22, id=1001, sex=male}
20
50
{
    
    name=breez, score=50, id=1001, age=22, sex=male}

5.删除字段

HDEL key field [field …]

HDEL命令可以删除一个多个字段,返回值是被删除字段的个数

127.0.0.1:6379> hgetall user //获取所有字段值
 1) "id"
 2) "1001"
 3) "name"
 4) "breez"
 5) "age"
 6) "22"
 7) "sex"
 8) "male"
 9) "score"
10) "50"
127.0.0.1:6379> hdel user score //删除score字段
(integer) 1
127.0.0.1:6379> hgetall user //获取所有的字段
1) "id"
2) "1001"
3) "name"
4) "breez"
5) "age"
6) "22"
7) "sex"
8) "male"
127.0.0.1:6379> hdel user age sex //同时删除字段age、 sex
(integer) 2
127.0.0.1:6379> hgetall user //获取所有的字段
1) "id"
2) "1001"
3) "name"
4) "breez"

实践:使用Java操作Redis数据库:HDEL

@Test
    public void testHDEL() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Map<String, String> user = jedis.hgetAll("user");
        System.out.println(user);
        
        Long hdel = jedis.hdel("user", new String[]{
    
    "name", "age"});
        System.out.println(hdel);
        
        System.out.println(jedis.hgetAll("user"));
    }
{
    
    name=breez, age=22, id=1001}
2
{
    
    id=1001}

二、命令进阶

命令 解释
HKEYS key 只获取字段名
HVALS key 只获取字段值
HLEN key 获得字段数量

1.只获取字段名或字段值

HKEYS key
HVALS key

  • HKEYS
127.0.0.1:6379> hgetall user //获取所有的键值
1) "id"
2) "1001"
3) "name"
4) "breez"
5) "age"
6) "22"
127.0.0.1:6379> hkeys user //获取所有的键
1) "id"
2) "name"
3) "age"

实践:使用Java操作Redis数据库:HKEYS

@Test
    public void testHKEYS() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        System.out.println(jedis.hgetAll("user"));
        Set<String> user_keys = jedis.hkeys("user");
        System.out.println("所有的键:" + user_keys);
    }
{
    
    name=breez, age=22, id=1001}
所有的键:[name, age, id]
  • HVALS
127.0.0.1:6379> hgetall user //获取所有的键值
1) "id"
2) "1001"
3) "name"
4) "breez"
5) "age"
6) "22"
127.0.0.1:6379> hvals user //获取所有的值
1) "1001"
2) "breez"
3) "22"

实践:使用Java操作Redis数据库:HVALS

@Test
    public void testHVALS() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        System.out.println(jedis.hgetAll("user"));
        List<String> user_values = jedis.hvals("user");
        System.out.println("所有的值:" + user_values);
    }
{
    
    name=breez, age=22, id=1001}
所有的值:[1001, breez, 22]

2. 获得字段数量

HLEN key

127.0.0.1:6379> hkeys user
1) "id"
2) "name"
3) "age"
127.0.0.1:6379> hlen user
(integer) 3

实践:使用Java操作Redis数据库:HLEN

@Test
    public void testHLEN() {
    
    
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Set<String> user_keys = jedis.hkeys("user");
        System.out.println("所有的键:" + user_keys);
        Long user_len = jedis.hlen("user");
        System.out.println("键的长度:" + user_len);
    }
所有的键:[name, age, id]
键的长度:3

Redis中文官方网站:http://www.redis.cn


未完待续,持续更新中...

未完待续,持续更新中...

猜你喜欢

转载自blog.csdn.net/qq_43073558/article/details/113831097
今日推荐