专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Redis数据类型及应用场景

Redis数据类型及应用场景

更新时间:2022-04-13 10:17:09 来源:动力节点 浏览1068次

数据类型

Redis 共有五种类型,结合其他类型,几乎是相同的 8 种类型。即String、hash、list、set、zset、geo、bitmaps、hyperLogLog和Stream。

字符串类型

String 类型是Redis字符串类型,类似于键值对的一种形式。

通常我们使用 String 类型来存储商品的数量、用户信息和分布式锁等应用场景。

1.入库货品数量。

set goods:count:1 1233
set goods:count:2 100

2.用户信息。

set user:1 "{"id":1, "name":" Zhang San ", "age": 12}"
set user:2 "{"id":2, "name":" Li Si ", "age": 12}"

3.分布式锁。

# Set a nonexistent key named id:1 The value is 10, The expiration date is 10 second .
127.0.0.1:6379> set id:1 10 ex 10 nx
OK
127.0.0.1:6379> get id:1
"10"
# The current key has not expired yet , If it is set at this time, it will not be set successfully .
127.0.0.1:6379> set id:1 10 ex 10 nx
(nil)
# When 10 Get it in seconds , The current key is empty .
127.0.0.1:6379> get id:1
(nil)

哈希类型

hash 类型是一种类似于关系数据库结构的数据结构。有一个键名,键存储的内容以键值对的形式存在。

利用哈希结构,我们可以用它来存储用户信息、对象信息等业务场景。

1.保存用户信息。

127.0.0.1:6379> hset user:1 id 1 name zhangsan age 12 sex 1
(integer) 4
127.0.0.1:6379> hset user:2 id 2 name lisi age 14 sex 0
(integer) 4
127.0.0.1:6379> hmget user:1 id name age sex
1) "1"
2) "zhangsan"
3) "12"
4) "1"

2.存储对象信息。

127.0.0.1:6379> hset object:user id public-1 name private-zhangsan
(integer) 2
127.0.0.1:6379> hmget object:uesr id name
1) (nil)
2) (nil)
127.0.0.1:6379> hget object:user id
"public-1"
127.0.0.1:6379>

列表类型

list 类型是一种列表类型的数据结构。用一个键,按顺序排列数据。

list 最常见的场景是 queue 、 Stack 和秒杀等。

1.排队。

127.0.0.1:6379> lpush list:1 0 1 2 3 4 5 6
(integer) 7
127.0.0.1:6379> rpop list:1 1
1) "0"
127.0.0.1:6379> rpop list:1 1
1) "1"
127.0.0.1:6379> rpop list:1 1
1) "2"

2. 堆叠。

127.0.0.1:6379> lpush list:1 3 4 5 6
(integer) 3
127.0.0.1:6379> lpop list:1
"6"
127.0.0.1:6379> lpop list:1
"5"
127.0.0.1:6379> lpop list:1
"4"
127.0.0.1:6379> lpop list:1
"3"

3.秒杀。

127.0.0.1:6379> lpush order:user 11 12 14 15 16 17
(integer) 6

设置类型

zet 是一个集合类型,而且这个集合中的元素是不必要的,不会重复。set Type可用于用户签到、网站访问统计、用户关注标签、好友推荐、猜谜游戏、随机数生成等业务场景。

1. 某天用户签到。

127.0.0.1:6379> sadd sign:2020-01-16 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> smembers sign:2020-01-16
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"

2. 用户关注标签。

127.0.0.1:6379> sadd user:1:friend 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> sadd user:2:friend 11 22 7 4 5 6
(integer) 6
127.0.0.1:6379> sinterstore user:relation user:1:friend user:2:friend
(integer) 3
127.0.0.1:6379> smembers user:relation
1) "4"
2) "5"
3) "6"

3.玩猜谜游戏。

127.0.0.1:6379> spop user:2:friend 1
1) "5"

zset 类型

zset 的 type 和 set 类型都是集合类型,两者的区别,设置 zset 为数据设置一个分数,这个分数可以用于数据排序,同时 zset 类型的数据也是有序的,因此 zset 也称为有序集合。

zset 除了可以用在 set 一个可用的场景中,更多的可以用在排序的场景中,比如排行榜、延迟队列,就好像一个未付款的订单会失效多久。

1.签到排行榜。

127.0.0.1:6379> zadd goods:order 1610812987 1
(integer) 1
127.0.0.1:6379> zadd goods:order 1610812980 2
(integer) 1
127.0.0.1:6379> zadd goods:order 1610812950 3
(integer) 1
127.0.0.1:6379> zadd goods:order 1610814950 4
(integer) 1
127.0.0.1:6379> zcard goods:order
(integer) 4
127.0.0.1:6379> zrangebyscore goods:order 1610812950 1610812987
1) "3"
2) "2"
3) "1"

位图类型

位图底层存储是二进制格式的数据。在某些特定情况下,使用这种类型,可以大大减少存储空间,因为存储的数据只能是0和1。为了便于理解,这种数据格式可以理解为数组。

利用这个特性,你可以在一些访问统计、签到统计等中使用这个类型。

1. 用户一个月的签到记录。

127.0.0.1:6379> setbit user:2020-01 0 1
(integer) 0
127.0.0.1:6379> setbit user:2020-01 1 1
(integer) 0
127.0.0.1:6379> setbit user:2020-01 2 1
(integer) 0
127.0.0.1:6379> bitcount user:2020-01 0 4
(integer) 3

2.统计某天网站的签到数。

127.0.0.1:6379> setbit site:2020-01-17 1 1
(integer) 0
127.0.0.1:6379> setbit site:2020-01-17 3 1
(integer) 0
127.0.0.1:6379> setbit site:2020-01-17 4 1
(integer) 0
127.0.0.1:6379> setbit site:2020-01-17 6 1
(integer) 0
127.0.0.1:6379> bitcount site:2020-01-17 0 100
(integer) 4
127.0.0.1:6379> getbit site:2020-01-17 5
(integer) 0

3.计算一段时间内,登录的用户数。

127.0.0.1:6379> setbit site:2020-01-18 6 1
(integer) 0
127.0.0.1:6379> setbit site:2020-01-18 4 1
(integer) 0
127.0.0.1:6379> setbit site:2020-01-18 7 1
(integer) 0
127.0.0.1:6379> bitop and continue:site site:2020-01-18 site:2020-01-17
(integer) 1

HypefLogLog 类型

HypefLogLog 类型在使用方面,有点像集合类型。这种类型实际上是一个字符串类型的数据结构。使用这种类型最大的好处就是减少了空间、但也有一定的错误率。这种类型也不允许同一个 key 有重复的元素。此类型还支持合并多个键 Value 。

这种数据类型一般用于一些不需要精确计算的统计场景。

1.用户登录统计。

127.0.0.1:6379> pfadd 2020:01:sgin 1 2 3 4 5 6 7 8
(integer) 1
# Try adding... Repeatedly
127.0.0.1:6379> pfadd 2020:02:sgin 1 2 3 4 5 6 7 8
(integer) 0
127.0.0.1:6379> pfadd 2020:02:sgin 9
(integer) 1
127.0.0.1:6379> pfadd 2020:02:sgin 10
(integer) 1
127.0.0.1:6379> pfadd 2020:02:sgin 11
(integer) 1
127.0.0.1:6379> pfcount 2020:02:sgin
(integer) 11

GEO类型

GEO Type是一种存储地理信息的数据格式,基于数据的特性。可以用于一些距离计算、附近推荐等业务场景。

1.距离计算
 

127.0.0.1:6379> geoadd city:distance nx 121.32 42.36 beijing 121.20 38.56
shanghai 100.36 38.56 sichuan
(integer) 3
127.0.0.1:6379> geopos city:distance beijing shanghai sichuan
1) 1) "121.32000178098678589"
2) "42.36000020595371751"
2) 1) "121.19999974966049194"
2) "38.55999947301710762"
3) 1) "100.3599974513053894"
2) "38.55999947301710762"
# Calculate the distance between Beijing and Shanghai
127.0.0.1:6379> geodist city:distance beijing shanghai km
"422.7819"

流类型

Stream 类型是 Redis 在 5.0 以后的版本中增加了新的数据结构。这种数据结构主要用于用户消息队列场景。Redis 本身有一个发布订阅(pub/sub)来实现消息队列的功能,但是有个缺点就是消息不持久,如果有网络disconnect 、Redis Downtime 等,消息会被丢弃。

1. 消息队列

# Add message queue
127.0.0.1:6379> xadd message * name zhangsan age 12
"1610873104343-0"
127.0.0.1:6379> xrange message - +
1) 1) "1610873104343-0"
2) 1) "name"
2) "zhangsan"
3) "age"
4) "12"
# Get message queue
127.0.0.1:6379> xrevrange message + - count 1
1) 1) "1610873104343-0"
2) 1) "name"
2) "zhangsan"
3) "age"
4) "12"

以上就是关于“Redis数据类型及应用场景”的介绍,大家如果对此比较感兴趣,想了解更多相关知识,不妨来关注一下动力节点的Redis教程,里面的课程内容细致全面,通俗易懂,很适合没有基础的小白学习,希望对大家能够有所帮助哦。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>