Redis知识整理(五) -- Hash&Set类型

Redis知识整理(五) – Hash&Set类型

Hash类型

一、数据格式

Hash类型指的是value的类型

所以Hash类型指的是 value的类型是 key - value

类似于HashMap中嵌套了一层HashMap

二、常用命令

# 为key对应的value的某个属性赋值
> hset lisi name lisi
(integer) 1

# 为key对应的value中的多个属性一起赋值
> hmset lisi age 11 address beijing
OK

# 获取key对应的value的某个属性值
> hget lisi name
"lisi"

# 获取多个key对应的value中的属性值
> hmget lisi age name
1) "11"
2) "lisi"

# 获取key对应的value的所有属性值
> hkeys lisi
1) "name"
2) "age"
3) "address"

# 获取key对应的value的所有的属性对应的值
> hvals lisi
1) "lisi"
2) "11"
3) "beijing"

# 获取key对应的value的值
> hgetall lisi
1) "name"
2) "lisi"
3) "age"
4) "11"
5) "address"
6) "beijing"

# 对key对应的value中的某个属性进行计算
> HINCRBYFLOAT lisi age 0.5
"11.5"
> hget lisi age
"11.5"
> HINCRBYFLOAT lisi age -1
"10.5"

三、常见应用

存储对象

    或者说存储一种简单的document 好处在于:一次调用可以直接返回整体对象,否则需要至少两次(keys xxx* mget xxxxx) 同时可以直接在redis做数据的计算

Set类型

一、数据格式

List类型和Hash类型的区别

    set是无序的(插入和弹出是无序的) set不允许出现重复数据,天然是去重的

二、常用命令

# 往k1对应的set添加元素 注意:set不允许重复数据添加
> sadd k1 tom sean peter ooxx tom xxoo
(integer) 5

# 查看k1对应的set的所有元素,注意:元素是无序的
> SMEMBERS k1
1) "sean"
2) "tom"
3) "ooxx"
4) "peter"
5) "xxoo"

# srem删除set的对应元素
> srem k1 ooxx xxoo
(integer) 2
> SMEMBERS k1
1) "tom"
2) "peter"
3) "sean"

# 计算set的交集
# 注意: SINTER直接返回结果 SINTERSTORE将结果存储到给出的key,不直接返回结果
# 好处在于: 如果需要存储交集,直接使用SINTERSOTRE避免进入IO,还多一次交互
> sadd k2 1 2 3 4 5 
> sadd k3 4 5 6 7 8
> SINTER k2 k3
1) "4"
2) "5"
> SINTERSTORE dest k2 k3
(integer) 2
> SMEMBERS dest
1) "4"
2) "5"

# 计算交集
# 注意:结果同样是去重的
> SUNION k2 k3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
> SUNIONSTORE dest2 k2 k3
(integer) 8

# 计算差集
# 注意: 通过前后key的顺序表达差集的结果
> SDIFF k2 k3
1) "1"
2) "2"
3) "3"
> SDIFF k3 k2
1) "6"
2) "7"
3) "8"

# 取随机数
> sadd kn tom ooxx xxoo xoxo oxox xoox oxxo
# 数为正数时 保证取出3个结果 且为去重的 前提是结果集不少于3
> SRANDMEMBER k1 3
1) "ooxx"
2) "tom"
3) "xoox"
# 数为负数时 保证取出3个结果 且不为去重的 结果集少于3个也会出3个 有重复的
> SRANDMEMBER k1 -3
1) "xoox"
2) "xoxo"
3) "xoox"
# 取出数大于候选集size 负数 出满足个数的可重复的结果集
> SRANDMEMBER k1 -10
1) "xxoo"
2) "xoxo"
3) "oxox"
4) "ooxx"
5) "ooxx"
6) "ooxx"
7) "oxxo"
8) "oxxo"
9) "xxoo"
10) "xoxo"

# 弹出则从set中消失
> SPOP k1
"oxox"
> SPOP k1
"xoxo"
> SMEMBERS k1
1) "tom"
2) "ooxx"
3) "oxxo"
4) "xoox"
5) "xxoo"

三、常见应用

1. 抽奖(例如:微博抽奖 – 礼物少人多)

利用SRANDMEMBER命令

可以控制取出3个不同的粉丝 还是3个有可能相同的粉丝

2.抽奖(礼物多人少)

同样利用SRANDMEMBER命令

n个礼物,以人为结果集,抽出n个人即可

3.抽象(年会抽奖)

不重复出现,中奖后则从奖池中删除

利用SPOP命令,依次随机弹出(Set本身就是无序的,所以可以保证随机)

经验分享 程序员 微信小程序 职场和发展