夫陶公清风千古,余又何人,敢称庶几
介绍
Hashes
,由field
和关联的value
组成的map
。field
和value
都是字符串的, 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
为键,id
、name
、age
为属性,在面向对象中,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
未完待续,持续更新中...