目录
数据共享
通过Redis可以实现分布式系统下的数据共享。
单点登录
什么是单点登录
参考(14条消息) 什么是单点登录?如何实现?_单点登录是什么意思_时清云的博客-CSDN博客
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一
SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
比如:淘宝、天猫都属于阿里旗下,当用户登录淘宝后,再打开天猫,系统便自动帮用户登录了天猫,这种现象就属于单点登录。
Redis怎么实现
Redis可以作为一个分布式的Session存储中心,实现单点登录的功能。具体的实现步骤如下:
- 用户登录成功后,生成一个唯一的token,并将用户信息和登录状态等信息存储到Redis中,token作为key,用户信息作为value,设置过期时间。
- 将token保存到Cookie中,或者通过其他方式传递给客户端。
- 用户携带token去访问其他资源服务器,资源服务器根据token作为key从Redis中查询用户信息和登录状态,如果存在则重新设置过期时间,并放行请求,如果不存在则拒绝请求,并跳转到登录页面。
计数器
可以使用redis中的incr或者decr来实现计数器的功能。
分布式锁
什么是分布式锁,怎么产生的
当我们的项目是单体应用的时候,遇到了多线程的问题,我们可以使用ReentrantLock或者cynchronized这些JDK自带的锁来控制对资源的访问。
但是当我们的项目是分布式系统时,我们的每个服务都是一个独立的JVM,这个时候,JDK自带的锁自能锁当前的服务,对其他的服务并不起作用,这个时候我们就迫切的需要一把锁来进行分布式系统资源访问控制,于是分布式锁就诞生了。
Redis怎么实现分布式锁
setnx可以实现分布式锁,我们请求资源前,先执行setnx语句,之后,其他的线程想要再请求资源时setnx就会返回false,从而达到锁的目的。
限流
参考(14条消息) Redis 实现限流器的三种方法_redis断路限流器配置与使用_XP-Code的博客-CSDN博客
1、基于setnx实现
setnx是不存在了才赋值,分布式锁中就利用了这个功能。那假如我们在使用setnx时给这个key设置一个值并且给他设置过期时间,比如setnx lock 10、expire lock 10。然后我们每次请求的时候都先看看有没有lock,如果没有就新建,如果有就判断它是否大于零,如果大于零九就进行减一操作。这就实现了10秒内最多执行10条线程。
当然这种做法的弊端是很多的,比如当统计1-10秒的时候,无法统计2-11秒之内,如果需要统计N秒内的M个请求,那么我们的Redis中需要保持N个key等等问题。
2、基于zset数据结构
value值保持固定,score存时间戳,当请求进来时进行score排序查询,查询十秒内的数量是否小于10,小于就zadd一个数据,然后执行操作,大于就return false。
3、基于令牌桶
使用Redis的List数据结构。
设置一个定时任务,每秒往List插入一个数据,当请求时,首先先去lpop设置的List,如果能正常得到数据,则证明没有达到最大值,如果得到的为空,则说明请求已经达到最大值。
可以看一下参考中的代码,理解更深,这个只是较浅的理解!
实时排行榜
可以使用zset数据结构来实现
使用score来存储数值,这个时候就可以实现基本的排行榜。、
如果考虑一些时间的因素,这个时候我们可以在存入score的时候加上时间戳,这样就可以满足日常所需。