快捷搜索:  汽车  科技

redis分布式锁怎样实现原子性(Redis的n种妙用分布式锁)

redis分布式锁怎样实现原子性(Redis的n种妙用分布式锁)set key 0 incr key // incr readcount::{帖子id} 每阅读一次 get key // get readcount::{帖子id} 获取阅读量 分布式全局唯一id(string)如知乎每个问题的被浏览器次数setnx key value,当key不存在时,将 key 的值设为 value ,返回1。若给定的 key 已经存在,则setnx不做任何动作,返回0。当setnx返回1时,表示获取锁,做完操作以后del key,表示释放锁,如果setnx返回0表示获取锁失败,整体思路大概就是这样,细节还是比较多的,有时间单开一篇来讲解计数器(string)

redis分布式锁怎样实现原子性(Redis的n种妙用分布式锁)(1)

本文为小编原创文章,首发于Java识堂微信公众号,一个高原创,高收藏的公众号,转载请联系小编

介绍

redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)

Redis用作缓存,主要两个用途:高性能,高并发,因为内存天然支持高并发

应用场景

分布式锁(string)

setnx key value,当key不存在时,将 key 的值设为 value ,返回1。若给定的 key 已经存在,则setnx不做任何动作,返回0。

当setnx返回1时,表示获取锁,做完操作以后del key,表示释放锁,如果setnx返回0表示获取锁失败,整体思路大概就是这样,细节还是比较多的,有时间单开一篇来讲解

计数器(string)

如知乎每个问题的被浏览器次数

redis分布式锁怎样实现原子性(Redis的n种妙用分布式锁)(2)

set key 0 incr key // incr readcount::{帖子id} 每阅读一次 get key // get readcount::{帖子id} 获取阅读量

分布式全局唯一id(string)

分布式全局唯一id的实现方式有很多,这里只介绍用redis实现

redis分布式锁怎样实现原子性(Redis的n种妙用分布式锁)(3)

每次获取userId的时候,对userId加1再获取,可以改进为如下形式

redis分布式锁怎样实现原子性(Redis的n种妙用分布式锁)(4)

直接获取一段userId的最大值,缓存到本地慢慢累加,快到了userId的最大值时,再去获取一段,一个用户服务宕机了,也顶多一小段userId没有用到

set userId 0 incr usrId //返回1 incrby userId 1000 //返回10001

消息队列(list)

在list里面一边进,一边出即可

# 实现方式一 # 一直往list左边放 lpush key value # key这个list有元素时,直接弹出,没有元素被阻塞,直到等待超时或发现可弹出元素为止,上面例子超时时间为10s brpop key value 10 # 实现方式二 rpush key value blpop key value 10

redis分布式锁怎样实现原子性(Redis的n种妙用分布式锁)(5)

猜您喜欢: