正文
.129
:6379
>
incr
age
(
integer
) 21
192
.168
.2
.129
:6379
>
set
age1
"20"
OK
192
.168
.2
.129
:6379
>
get
age1
"20"
192
.168
.2
.129
:6379
>
incr
age1
(
integer
) 21
192
.168
.2
.129
:6379
>
incrby
age
3
(
integer
) 24
从上面的结果可以看出,我们对int型的age和string型的age1都能进行incr操作时,
实际上type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如"20"这样的字符串,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。如果你试图对name进行incr操作则报错。
192.168
.
2.129
:
6379
> incr
name
(error) ERR value
is
not
an integer
or
out
of
range
(5)decr && decrby——decr对key对应的值进行减减操作,并返回新的值;decrby减指定值
192
.168
.2
.129
:6379
>
decr
age
(
integer
) 23
192
.168
.2
.129
:6379
>
decrby
age
3
(
integer
) 20
192
.168
.2
.129
:6379
>
(6)其他命令
Hash类型
Hash是一个String类型的field和value之间的映射表,即redis的Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap,因此Hash特别适合存储对象。相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存。
Hash 数据类型内部结构示意图
当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
应用场景
用一个对象来存储用户信息,商品信息,订单信息等等。
常用命令
(1)hset——设置key对应的HashMap中的field的value
(2)hget——获取key对应的HashMap中的field的value
192
.168
.2
.129
:6379
>
hset
myhash
name
zhangsan
(
integer
) 1
192
.168
.2
.129
:6379
>
hset
myhash
age
20
(
integer
) 1
192
.168
.2
.129
:6379
>
hget
myhash
name
"
zhangsan
"
192
.168
.2
.129
:6379
>
hget
myhash
age
"20"
192
.168
.2
.129
:6379
>
(3)hgetall——获取key对应的HashMap中的所有field的value
192
.168
.2
.129
:6379
>
hgetall
myhash
1) "
name
"
2) "
zhangsan
"
3) "
age