迅闻网
让更多人看到你

Redis各种业务场景下的使用

  Redis各种业务场景下的使用

Redis作为一种内存型的非联系型的数据库,不管在互联网大厂,小厂,大项目和小项目中,简直都会被运用。为什么Redis会遭到如此喜爱呢?关于这个问题,可能许多的程序员仅仅看着他人用而用,缺少对Redis一个全面的了解。
Redis运用场景
缓存
缓存现在简直是所有中大型网站都在用的必杀技,合理的运用缓存不仅能够提高网站拜访速度,还能大大下降数据库的压力。Redis供给了键过期功用,也供给了灵敏的键筛选战略,所以,现在Redis用在缓存的场合非常多。
排行榜
许多网站都有排行榜运用的,如京东的月度销量榜单、产品按时刻的上新排行榜等。Redis供给的有序调集数据类构能完成各种复杂的排行榜运用。
计数器
什么是计数器,如电商网站产品的阅读量、视频网站视频的播放数等。为了确保数据实时效,每次阅读都得给+1,并发量高时假如每次都请求数据库操作无疑是种挑战和压力。Redis供给的incr指令来完成计数器功用,内存操作,功用非常好,非常适用于这些计数场景。
分布式会话
集群模式下,在运用不多的状况下一般运用容器自带的session复制功用就能满足,当运用增多相对复杂的体系中,一般都会建立以Redis等内存数据库为中心的session服务,session不再由容器办理,而是由session服务及内存数据库办理。
分布式锁
在许多互联网公司中都运用了分布式技能,分布式技能带来的技能挑战是对同一个资源的并发拜访,如全局ID、减库存、秒杀等场景,并发量不大的场景能够运用数据库的失望锁、达观锁来完成,但在并发量高的场合中,运用数据库锁来操控资源的并发拜访是不太抱负的,大大影响了数据库的功用。能够运用Redis的setnx功用来编写分布式的锁,假如设置回来1阐明获取锁成功,不然获取锁失利,实践运用中要考虑的细节要更多。
交际网络
点赞、踩、重视/被重视、一起老友等是交际网站的基本功用,交际网站的拜访量通常来说比较大,而且传统的联系数据库类型不适合存储这种类型的数据,Redis供给的哈希、调集等数据结构能很便利的的完成这些功用。
最新列表
Redis列表结构,LPUSH能够在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接依据ID去到对应的内容页即可。
音讯体系
音讯行列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的音讯行列中间件,首要用于事务解耦、流量削峰及异步处理实时性低的事务。Redis供给了发布/订阅及堵塞行列功用,能完成一个简略的音讯行列体系。别的,这个不能和专业的音讯中间件相比。
怎么运用
上面提到了各种运用场景,在这些场景运用中,无非便是对Redis数据类型的操作。就需要对Redis数据类型有所了解。在Redis中有这些数据类型。String、Hash、List、Set、Zset、GEO、Stream、HyperLogLog、BitMap。

Redis
数据运用场景
String类型
String类型是一种字符串类型,类似一种键值对的方式。
一般咱们用String类型用来存储产品数量、用户信息和分布式锁等运用场景。
存储产品数量。
setgoods:count:11233
setgoods:count:2100
用户信息。
setuser:1″{“id”:1,”name”:”张三”,”age”:12}”
setuser:2″{“id”:2,”name”:”李四”,”age”:12}”
分布式锁。
#设置一个不存在的键名为id:1值为10,过期时刻为10秒。
127.0.0.1:6379>setid:110ex10nx
OK
127.0.0.1:6379>getid:1
“10”
#当时的键还未过期,在次设置则不会设置成功。
127.0.0.1:6379>setid:110ex10nx
(nil)
#当10秒之后去获取,当时的键则为空。
127.0.0.1:6379>getid:1
(nil)
用Redis完成分布式锁的原理,当一个键存在则设置失利。
hash类型
hash类型是一种类似联系型数据库结构的数据结构。有一个键名,键存的内容是以键值对的方式存在。
运用hash结构,咱们能够用来存储用户信息、目标信息等事务场景。
存用户信息。
127.0.0.1:6379>hsetuser:1id1namezhangsanage12sex1
(integer)4
127.0.0.1:6379>hsetuser:2id2namelisiage14sex0
(integer)4
127.0.0.1:6379>hmgetuser:1idnameagesex
1)”1″
2)”zhangsan”
3)”12″
4)”1″
存储目标信息。
127.0.0.1:6379>hsetobject:useridpublic-1nameprivate-zhangsan
(integer)2
127.0.0.1:6379>hmgetobject:uesridname
1)(nil)
2)(nil)
127.0.0.1:6379>hgetobject:userid
“public-1″
127.0.0.1:6379>
这儿存储一个user目标,目标里面有两个特色,别离是id和name字,别离存储的是特色的拜访权限和默认值拼接。
list类型
list类型是一个列表类型的数据结构。用一个键,依照顺序排列数据。
list一般用在的场景是行列、栈和秒杀等场景。
行列。
127.0.0.1:6379>lpushlist:10123456
(integer)7
127.0.0.1:6379>rpoplist:11
1)”0″
127.0.0.1:6379>rpoplist:11
1)”1″
127.0.0.1:6379>rpoplist:11
1)”2”
运用list完成行列,是由于行列遵从先进先出的特色。
栈。
127.0.0.1:6379>lpushlist:13456
(integer)3
127.0.0.1:6379>lpoplist:1
“6”
127.0.0.1:6379>lpoplist:1
“5”
127.0.0.1:6379>lpoplist:1
“4”
127.0.0.1:6379>lpoplist:1
“3”
运用list完成行列,是由于行列遵从后进先出的特色。
秒杀。
127.0.0.1:6379>lpushorder:user111214151617
(integer)6
在秒杀场景下,咱们能够将秒杀成功的用户先写进行列,后续的事务在依据行列中数据进行处理。
set类型
zet是一种调集类型,而且这种调集内的元素是无需且不会重复的。
set类型一般能够用在用户报到、网站拜访核算、用户重视标签、老友引荐、猜奖、随机数生成等事务场景。
某日用户报到状况。
127.0.0.1:6379>saddsign:2020-01-1612345678
(integer)8
127.0.0.1:6379>smemberssign:2020-01-16
1)”1″
2)”2″
3)”3″
4)”4″
5)”5″
6)”6″
7)”7″
8)”8″
键为详细某日,存储的值则是报到用户的id。
用户重视标签。
127.0.0.1:6379>sadduser:1:friend123456
(integer)6
127.0.0.1:6379>sadduser:2:friend11227456
(integer)6
127.0.0.1:6379>sinterstoreuser:relationuser:1:frienduser:2:friend
(integer)3
127.0.0.1:6379>smembersuser:relation
1)”4″
2)”5″
3)”6″
用户1重视了id为1,2,3,4,5,6的栏目。用户2重视了id为11,22,7,4,5,6的栏目。这儿取两个用户一起重视的栏目。
猜奖。
127.0.0.1:6379>spopuser:2:friend1
1)”5″
用set完成猜奖,首要是运用了随机抛出调集类的元素的特色。
zset类型
zset类型和set类型都是属于调集类型,两者不同点,在设置zset数据时要设置一个分数,这个分数能够用来做数据排序,而且zset类型的数据是有序的,因此zset也被叫做有序调集。
zset除了能够用在set能够用的场景下,更多的是能够用在排序的场景,如排行榜、延迟行列,就像未付出的订单在多少时刻内就失效。
报到排行榜。
127.0.0.1:6379>zaddgoods:order16108129871
(integer)1
127.0.0.1:6379>zaddgoods:order16108129802
(integer)1
127.0.0.1:6379>zaddgoods:order16108129503
(integer)1
127.0.0.1:6379>zaddgoods:order16108149504
(integer)1
127.0.0.1:6379>zcardgoods:order
(integer)4
127.0.0.1:6379>zrangebyscoregoods:order16108129501610812987
1)”3″
2)”2″
3)”1″
将用户的报到时刻作为排行的分数,最终查询指定范围内报到用户的id。
Bitmaps类型
Bitmaps底层存储的是一种二进制格式的数据。在一些特定场景下,用该类型能够极大的削减存储空间,由于存储的数据只能是0和1。为了便于了解,能够将这种数据格式了解为一个数组的方式存储。
运用该特色,能够将该类型用在一些拜访核算、报到核算等场景。
某个用户一个月的报到记载。
127.0.0.1:6379>setbituser:2020-0101
(integer)0
127.0.0.1:6379>setbituser:2020-0111
(integer)0
127.0.0.1:6379>setbituser:2020-0121
(integer)0
127.0.0.1:6379>bitcountuser:2020-0104
(integer)3
核算出该用户这个月只要4天报到。
核算某一天网站的报到数量。
127.0.0.1:6379>setbitsite:2020-01-1711
(integer)0
127.0.0.1:6379>setbitsite:2020-01-1731
(integer)0
127.0.0.1:6379>setbitsite:2020-01-1741
(integer)0
127.0.0.1:6379>setbitsite:2020-01-1761
(integer)0
127.0.0.1:6379>bitcountsite:2020-01-170100
(integer)4
127.0.0.1:6379>getbitsite:2020-01-175
(integer)0
这儿将用户的id作为偏移量,报到便是1。能够核算出详细拜访的总数,一起能够依据某个用户的id查询是否在当时报到。假如依据偏移量重复设置一个值,此刻不会被重复增加,仅仅Redis会回来1表明当时现已存在。
核算某段时刻内,都报到的用户数量。
127.0.0.1:6379>setbitsite:2020-01-1861
(integer)0
127.0.0.1:6379>setbitsite:2020-01-1841
(integer)0
127.0.0.1:6379>setbitsite:2020-01-1871
(integer)0
127.0.0.1:6379>bitopandcontinue:sitesite:2020-01-18site:2020-01-17
(integer)1
运用该场景,是由于该数据类型能够核算出多个key的交集(and)。一起能够取并集(or),或(or),异或(xor)。
HypefLogLog类型
HypefLogLog类型从运用上来说,有点类似于调集类型。该类型实践是一种字符串类型的数据结构。运用该类型最大的好处便是削减空间、但是也存在一定的误差率。该类型也是不允许同一个key存在重复元素。该类型也支撑合并多个key的值。
该数据类型一般用在一些不需要精确核算的核算类场景。
用户报到核算。
127.0.0.1:6379>pfadd2020:01:sgin12345678
(integer)1
#测验重复增加
127.0.0.1:6379>pfadd2020:02:sgin12345678
(integer)0
127.0.0.1:6379>pfadd2020:02:sgin9
(integer)1
127.0.0.1:6379>pfadd2020:02:sgin10
(integer)1
127.0.0.1:6379>pfadd2020:02:sgin11
(integer)1
127.0.0.1:6379>pfcount2020:02:sgin
(integer)11
GEO类型
GEO类型是一种存储地理信息的数据格式,基于该数据特色。能够用在一些间隔核算、附近引荐等事务场景。
间隔核算
127.0.0.1:6379>geoaddcity:distancenx121.3242.36beijing121.2038.56
shanghai100.3638.56sichuan
(integer)3
127.0.0.1:6379>geoposcity:distancebeijingshanghaisichuan
1)1)”121.32000178098678589″
2)”42.36000020595371751″
2)1)”121.19999974966049194″
2)”38.55999947301710762″
3)1)”100.3599974513053894″
2)”38.55999947301710762″
#核算出北京到上海的间隔
127.0.0.1:6379>geodistcity:distancebeijingshanghaikm
“422.7819”
Stream类型
Stream类型是Redis在5.0之后版别新增的一种数据结构。该数据结构首要用户音讯行列的场景。Redis自身是有一个Redis发布订阅(pub/sub)来完成音讯行列的功用,但它有个缺陷便是音讯无法持久化,假如呈现网络断开、Redis宕机等,音讯就会被丢掉。
音讯行列
#增加音讯行列
127.0.0.1:6379>xaddmessage*namezhangsanage12
“1610873104343-0″
127.0.0.1:6379>xrangemessage-+
1)1)”1610873104343-0″
2)1)”name”
2)”zhangsan”
3)”age”
4)”12″
#获取音讯行列
127.0.0.1:6379>xrevrangemessage+-count1
1)1)”1610873104343-0″
2)1)”name”
2)”zhangsan”
3)”age”
4)”12″

未经允许不得转载:迅闻网 » Redis各种业务场景下的使用
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

迅闻网-让更多人看到你

登录/注册返回首页