Great article as usual.
but I have to comments:
1- in go mutex example you have to send the mutex by example in order not to create new instance with each pass which will result in no real locking, more details here: eli. thegreenplace. net/2018/beware-of-copying-mutexes-in-go/
2- (I know this shouldn't be in the article since it is introduction :D) in redis example, the unlock function may result in a problem if one thread is stuck longer than the lock time and when back it deletes the lock, then it may have deleted another thread lock.
a solution for this problem is described here: redis .io/commands/set/