开启掘金成长之旅!这是我参与「掘金日新计划 · 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存储对象的方式不同
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,同时也介绍了这几种数据结构应用场景和具体实现,更加底层的数据结构后续会出,敬请期待哦!
感谢观看!