logo
publist
写文章

简介

该用户还未填写简介

擅长的技术栈

可提供的服务

暂无可提供的服务

Gee教程5.中间件

鉴权认证、日志记录等这些保障和支持系统业务属于全系统的业务,和具体的系统业务没有关联,对于系统中的很多业务都适用。因此,在业务开发过程中,为了更好的梳理系统架构,可以将上述描述所涉及的一些通用业务单独抽离并进行开发,然后以进行对接。这种方式既保证了系统功能的完整,同时又有效的将具体业务和系统功能进行解耦,并且,还可以达到灵活配置的目的。这种通用业务独立开发并灵活配置使用的组件,一般称之为"中间件"

文章图片
#中间件#http#gin
Go语言实现Redis分布式锁

本文将基于go语言,使用了一个常用的go Redis客户端一步一步探索与实现一个简单的Redis分布式锁。SETNX 命令用于在Redis中设置某个不存在的键的值。如果该键不存在,则设置成功,如果该键存在,则设置失败,不作任何动作。基于此可以实现一种简单的抢占机制。先连接redis。新建lock.go文件。创建lock结构体,加锁和解锁方法。

文章图片
#redis#分布式
Go语言实现Redis分布式锁2

注意,这里也是使用Lua脚本封装了确认锁与锁续期的操作来用于原子化,以防止误续期了其他持有者的锁。这里仍然存在一个问题:当锁的持有者任务未完成,但是锁的有效期已过,虽然持有者此时仍可以完成任务,并且也不会误删其他持有者的锁,但是此时可能会存在多个执行者同时执行临界区代码,使得数据的一致性难以保证,造成意外的后果,分布式锁就失去了意义。因此,需要一个锁的自动续期机制,分布式锁框架Redission中

文章图片
#redis#分布式#golang
2.登录业务

登录有两种方式,一种是通过手机号码发送验证码登录,另一种是通过账号密码进行登录。通过验证码登录的话,服务端就要存储该手机号码的验证码,这就键值对,还有要给验证码设置过期时间,这个就可以存储在Redis中。在config.yaml添加Redis的内容在config.go文件添加Redis配置的结构体。在db目录创建redis.go文件。使用一个常用的go在main.go中进行创建redis客户端。

文章图片
#redis#缓存
如何保证Redis双写一致性?

1.场景一:并发读写情况下产生的短暂不一致场景,业务场景要能接受。并发读写情况下,缓存正好失效且读操作耗时大于写操作而产生的数据不一致。可以通过延时删除,或者给redis设置较短的存活时间。

文章图片
#redis#缓存
到底了