redis的应用

11 篇文章 0 订阅
6 篇文章 0 订阅

一.分布式锁

可以保证操作的原子性。

1.简易版

使用set key ex 5 nx value,加锁之后如果处理时间太长,锁会自动释放,可能会被下一个线程占用。

可重入性值得是线程在持有锁的情况下再次请求加锁,可以通过ThreadLocal存储当前线程池有的锁的次数

2.Redisson

功能强大:

  • 可重入,使用ThreadLocal存储的重入次数
  • 公平锁,会按照加锁的顺序获取锁
  • 支持锁的到期自动续约,每1/3的国旗时间调用一次,剩余1/3过期时间自动雪月;宕机的话就不自动续约了,释放锁的时候活删除键
  • 支持阻塞式获取锁
  • 释放锁的时候会检查线程是否持有锁,避免死锁

二.延时队列

1.异步消息队列

  • lpush,rpush

  • blpop,brpop

    队列为空时会进入休眠状态,有数据时会立即醒过来,但是闲置过久,服务器会主动断开链接,减少资源占用,因此需要捕获异常,进行重试

2.加锁冲突失败处理

  • 直接抛出异常,稍后重试
  • sleep一会再重试
  • 将请求转至延时队列,过一会再重试

3.zset实现延迟队列

  • 使用zset实现延时队列,将消息序列化为一个字符串,作为value,消息的到期时间作为:当前时间+过期时间

  • 使用多个线程轮询zset获取到期的定时任务,使用zrangebyscore获取,如果获取为空则sleep之后继续获取

三.位图

统计365天的签到记录

1.基本命令

  • setbit

  • getbit

  • bitcount,可以统计1/0的个数

  • bitpos ,定位第一个0/1的位置

  • bitfield,批量对指定位进行处理

    bitfield key set u8 8 97

    从第8位开始,将接下来的8个位用无符号数97代替

    • set
    • get
    • incrby
      • overflow sat,饱和溢出,停留在最大/最小值
      • overflow fail,溢出失败不执行

四.HyperLogLog

统计UV数,误差率0.81%,数量达到阈值后会固定占据12K的空间

1.基本命令

  • pfadd
  • pfcount
  • pfmerge,合并多个pf

2.实现原理

使用多个桶,将数据分布到不同的桶中,然后甲醛平均低位连续0的个数,用以估计数据量

五.布隆过滤器

用来处理大数据量情况下的是否存在的问题,有一定的误判率。如爬虫对URL的去重;垃圾邮件的过滤

1.基本命令

  • bf.add, bf.madd
  • Bf.exists, bf.mexists

2.实现

实际是一个大型的位数组和几个不一样的无偏hash(hash值计算的比较均匀),添加元素时根据key计算hash值,然后按照数组长度取模获取一个位置,然后其他的hash函数也都计算出来位置,将这几个位置都置为1就完成了add操作

3…误判

返回结果是不存在,那么一定是不存在;返回结果是存在,那么可能不存在,影响因素

  • initial_size,预估元素个数,超过时误判率会升高,默认100
  • error_rate, 错误率,越低需要的空间越大,默认0.01

六.简单限流

系统处理能力有限,阻止计划外的请求继续施压。

1.实现

值设定:

  • key:userId + 时/分/秒
  • value:timestamp
  • score:timestamp

操作步骤:

  • add
  • zrangebyscore
  • zcard
  • expire

2.缺点

  • 实现复杂
  • 性能不高

七.漏斗限流

漏斗的剩余容量代表当前行为可持续进行的操作数量,漏斗的流水速率代表该系统允许行为的最大速率。

1.实现

每次流水前都会灌水,更具间隙事件和流水速率计算剩余空间,能腾出多少空间取决于过去留了多少水,空间占用是一个常量,但是该方案不具有原子性

2.可以通过redis-cells组件实现

cl.throttle key 15 30 60,参数分别代表:

  • 15:漏斗容量,初始容量
  • 30 60: 60s允许30次操作

返回值(按顺序):

  • 允许/拒绝
  • 容量
  • 剩余空间
  • 等待时间
  • 完全放空等待时间

八.GeoHash

将地图经纬度坐标映射到一维,通过zset进行维护,将score还原成坐标值就可以得到元素的原始坐标。

1.基本命令

  • geoadd添加

    geoadd company 11 22 juejin

  • geodist计算距离

    geodist company juejin xiaomi km(m,km,ml,ft)

  • geopos、geohash获取位置

    • geopos company juejin:返回经纬度

    • geohash company juejin:返回经纬度的base32编码

  • georadiusbymember获取附件

    georadiusbymember company ireader 20 km count 3 asc

2.数据量大时建议按照地区进行划分(国家、省、市)

九.scan

扫描全局key值

1.keys

支持模式匹配,一次遍历全部数据

2.scan

scan 0 match key99* count 100

参数:

  • cursor:游标,全局hash数组的下标,为0代表遍历结束

  • key的匹配模式

  • 遍历的limit hint,是遍历的卡槽数量,而不是返回的元素个数

遍历顺序:

高位加法,是由rehash的规则导致的,rehash时会将下标为xxx的数据rehash到0xxx和1xxx,而采用高位加法刚好可以顺序遍历到,同时rehash时会遍历新旧两个字典结构汇总返回数据

大key扫描:

redis-cli -h 127.0.0.1 -p --bigkey -i 0.1每隔100条就会休眠0.1秒,避免ops剧烈抬升,但是扫描时间会变长

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一种高性能的内存数据库,它被广泛用于各种应用场景。以下是几个常见的Redis应用场景: 1. 缓存:由于Redis的高性能和低延迟,它通常被用作数据缓存层,将频繁访问的数据存储在内存中,从而加快数据访问速度。 2. 会话存储:在分布式系统中,可以使用Redis存储用户会话信息,包括用户登录状态、权限等。这样可以轻松实现会话共享和负载均衡。 3. 发布/订阅系统:Redis支持发布/订阅模式,可以用于实时消息传递、事件通知等场景。发布者将消息发布到指定频道,订阅者可以接收到相关消息并做出相应处理。 4. 计数器和排行榜:Redis提供了原子操作的支持,可以用于实现计数器和排行榜功能。例如,可以使用Redis的INCR操作来实现网站的访问计数器,或者根据用户的积分进行排行。 5. 分布式锁:在分布式系统中,为了保证数据的一致性和并发控制,可以使用Redis的分布式锁功能。通过使用Redis的SETNX操作来获取锁,并使用EXPIRE设置锁的过期时间,可以有效地实现分布式锁。 6. 消息队列:Redis的列表结构可以用作轻量级的消息队列。生产者将消息推入列表,消费者则从列表中弹出消息进行处理。这种方式简单高效,适用于需要异步处理的场景。 这只是一部分常见的Redis应用场景,实际上,由于Redis的灵活性和高性能,它在各种场景下都有不同的应用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值