Redis基础(Hash)

Posted caocw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis基础(Hash)相关的知识,希望对你有一定的参考价值。

Redis数据类型:

Redis中存储数据是通过key-value格式存储数据的,其中value可以定义五种数据类型:

  • String(字符类型)
  • Hash(散列类型)
  • List(列表类型)
  • Set(集合类型)
  • SortedSet(有序集合类型简称zset

注意:在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。

赋值

语法:SET key value

127.0.0.1:6379> set test 123
OK

取值

语法:GET key

127.0.0.1:6379> get test
"123“

取值并赋值

语法:GETSET key value

127.0.0.1:6379> getset s2 222
"111"
127.0.0.1:6379> get s2
"222"

数值增减

注意实现:

1、 当value为整数数据时,才能使用以下命令操作数值的增减。

2、 数值递增都是原子操作。

非原子性操作示例:
	int i = 1;
	i++;
	System.out.println(i)

  

递增数字

 

语法:INCR key.

127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3

增加指定的整数

 

 

语法:INCRBY key increment

127.0.0.1:6379> incrby num 2
(integer) 5
127.0.0.1:6379> incrby num 2
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9

递减数值

语法:DECR key

127.0.0.1:6379> decr num
(integer) 9
127.0.0.1:6379> decr num
(integer) 8

减少指定的整数

语法:DECRBY key decrement

127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> decr num
(integer) 5
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> decrby num 3
(integer) -1

仅当不存在时赋值:

使用该命令可以实现分布式锁的功能

语法setnx key value

redis> EXISTS job                # job 不存在

(integer) 0

redis> SETNX job "programmer"    # job 设置成功

(integer) 1

redis> SETNX job "code-farmer"   # 尝试覆盖 job ,失败

(integer) 0

redis> GET job                   # 没有被覆盖

"programmer"

向尾部追加值:

APPEND命令,向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。 

语法:APPEND key value

127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str 
"hello world!"

  

获取字符串长度:

STRLEN命令,返回键值的长度,如果键不存在则返回0。

语法:STRLEN key

127.0.0.1:6379> strlen str 
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str 
(integer) 5

同时设置/获取多个键值:

语法:

MSET key value [key value …]

MGET key [key …]

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k1 k3
1) "v1"
2) "v3"

 应用场景之自增主键 

需求商品编号、订单号采用INCR命令生成。

设计key命名要有一定的设计

实现定义商品编号key:items:id

192.168.101.3:7003> INCR items:id

(integer) 2

192.168.101.3:7003> INCR items:id

(integer) 3

hash介绍

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:

技术图片

 

命令:

赋值

HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。

一次只能设置一个字段值

语法:HSET key field value

127.0.0.1:6379> hset user username zhangsan 
(integer) 1

一次可以设置多个字段值 

语法:HMSET key field value [field value ...]

127.0.0.1:6379> hmset user age 20 username lisi 
OK

当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作

语法:HSETNX key field value

127.0.0.1:6379> hsetnx user age 30	如果user中没有age字段则设置age值为30,否则不做任何操作
(integer) 0

取值

一次只能获取一个字段值

语法:HGET key field

127.0.0.1:6379> hget user username
"zhangsan“

一次可以获取多个字段值

语法:HMGET key field [field ...]

127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"

获取所有字段值

语法:HGETALL key

127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"

删除字段

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

 

语法:HDEL key field [field ...]

127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1 

  

增加数字

 

语法:HINCRBY key field increment

127.0.0.1:6379> hincrby user age 2	将用户的年龄加2
(integer) 22
127.0.0.1:6379> hget user age		获取用户的年龄
"22“

以上是关于Redis基础(Hash)的主要内容,如果未能解决你的问题,请参考以下文章

Redis基础(Hash)

Redis 基础 -- Redis数据类型之hashredis原则string存储对象和hash存储对象对比

Redis 基础 -- 散列 Hash 类型 和 Hash 类型的常用命令

一文理清 Redis 基础及进阶知识!(附高清大图)

面试基础-redis

Redis:hash/hset/hget 命令源码解析