Redis-01-核心数据结构及应用

136 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

核心数据结构及应用

从本节开始将介绍Redis缓存。Redis是项目中非常常用的基于内存的缓存中间件,本节将介绍Redis是什么以及它的核心数据结构及应用。

Redis是什么?

Redis是一个基于内存的数据库,由于读写都发生在内存因此速度非常快,不仅如此Redis还为使用者设计了常用的数据结构,比如字符串,集合,Hash字典等,对这些数据结构的修改都是单线程且原子性的,同时还支持持久化,多种集群模式,内存淘汰机制等。接下来将开始介绍Redis的几种核心数据结构及其应用。

String

可以用来存储字符串,整数或者浮点数,这也是最基本的一种数据结构。

SET msg "hello world"
-OK
GET msg
-"hello world"
APPEND msg " again!"
-"hello world again!"

还可以通过MSET进行批量设置,可以实现存储对象功能

MSET user:1:name derek user:1:age 18
MGET user:1:name user:1:age

String的用处很多

可以用来计数,由于Redis执行命令是单线程的,因此不用担心会出现并发的问题,在如库存,点赞,观看量,转发等都可以进行应用

SET article:readcount:{文章id} 0
INCR article:readcount:{文章id}
GET article:readcount:{文章id}

在高并发下还可以用来做分布式锁

SETNX lock:1 true //返回1代表加锁成功
业务内容...
DEL lock:1

//为防止死锁还可以给它加上过期时间
SET lock:1 true NX PX 10000

在分布式的系统中,单纯的Session是无法满足的,因为Session会存储在各自的WEB服务器中,因此可以使用Redis存储Session,获取Session时统一往Redis获取。

Hash

Hash是一个键值对集合,通过其中的value=[{field1, value1}...{fieldn, valuen}],因此特别适合用来存储对象。

和String存储对象的方式不同

截屏2023-01-14 23.06.05.png

HSET user:1 name derek age 18
HGET user:1 name
-derek
HGETALL user:1
-"name"
-"derek"
-"age"
-"18"

//因此可见Hash的设置值格式为
HSET key field value

由于此特性,Hash可以用来作为电商购物车的缓存,用户id作为key,商品id作为field,商品的数量作为value,刚好时购物车需要的三个字段。

//添加商品
HSET cart:1 1234 1
//添加数量
HINCRBY cart:1 1234 1
//购物车内的商品总数
HLEN cart:1
//删除商品
HDEL cart:1 1234
//获取购物车内所有商品
HGETALL cart:1

List

List就是简单字符串的列表,可以从列表的头部和尾部插入数据。

由于List头尾部都可以插入数据,因此可以通过List去实现队列和栈。

//实现队列LPUSH+RPOP
LPUSH list 1 2 3
RPOP list
-1

//实现栈LPUSH+LPOP
LPUSH list 1 2 3
LPOP list
-3

List可以用来作为微博或微信公众号的消息流

//关注的对象发送了一条消息,id为1234
LPUSH msg:{user-id} 1234
//关注的对象发送了一条消息,id为1235
LPUSH msg:{user-id} 1235
//查看最新的五条消息
LRANGE msg:{user-id} 0 4

SET

SET类型为无序且键值唯一的集合对象,存储顺序不按照先后顺序进行存储。并且还可以做集合对应的运算,比如交集,并集和差集。

//添加元素
SADD key member
//移除元素
SREM key member
//展示所有元素
SMEMBERS key
//集合内元素个数
SCARD key

可以利用SET值唯一的特性去做点赞的功能

//检查用户是否点赞
SISMEMBER msg:{id} {userID}
//点赞
SADD msg:{id} {userID}
//取消点赞
SREM msg:{id} {userID}
//还可获得所有点赞人以及点赞个数
SMEMBERS msg:{id}
SCARD msg:{id}

像一些抽奖也可以用SET去做

//添加抽奖人
SADD roll:{id} {userID}
//抽取五名参与者
SRANDMEMBER roll:{id} 0 4

同时还可以利用集合运算去实现一些社交服务功能

//用户A和用户B共同关注的人(求交集)
SINTER user:{Aid} user:{Bid}
//用户A可能认识的人(求差集)
SDIFF user:{Bid} user:{Aid}

ZSET

ZSET和SET一样都是集合类型,但是ZSET比SET多出一个score字段,ZSET可以通过这个score对内部数据进行排序。ZSET只支持并集和交集。

//添加元素
ZADD key score member
//移除元素
ZREM key member
//为元素加分
ZINCRBY key increment member
//正序返回start到stop的元素
ZRANGE key start stop
//逆序返回start到stop的元素
ZREVRANGE key start stop
//正序返回分数在min到max间的元素(逆序同理)
ZRANGEBYLEX key min max

ZSET很适合去做排行榜的功能,比如说微博的热度榜

//添加话题
ZADD hot:{id} 0 title
//点击进入话题,热度+1
ZINCRBY hot:{id} 1 title
//展示热度最高的十个话题
ZREVRANGE hot:{id} 0 9 WITHSCORES

总结

本节介绍了Redis中的几种核心数据结构,包括String,Hash,List,Set和ZSet,同时也介绍了这几种数据结构应用场景和具体实现,更加底层的数据结构后续会出,敬请期待哦!

感谢观看!