redis的应用

文章目录

    • 一.分布式锁
      • 1.简易版
      • 2.Redisson
    • 二.延时队列
      • 1.异步消息队列
      • 2.加锁冲突失败处理
      • 3.zset实现延迟队列
    • 三.位图
    • 四.HyperLogLog
      • 1.基本命令
      • 2.实现原理
    • 五.布隆过滤器
    • 六.简单限流
      • 1.实现
      • 2.缺点
    • 七.漏斗限流
    • 八.GeoHash
    • 九.scan
      • 1.keys
      • 2.scan

一.分布式锁

可以保证操作的原子性。

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剧烈抬升,但是扫描时间会变长

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序--小程序框架

目录 前言: 一.框架基本介绍 1.整体结构: 2.页面结构: 3.生命周期: 4.事件系统: 5.数据绑定: 6.组件系统: 7.API: 8.路由: 9.模块化: 10.全局配置&…

运维 | 如何在 Linux 系统中删除软链接 | Linux

运维 | 如何在 Linux 系统中删除软链接 | Linux 介绍 在 Linux 中,符号链接(symbolic link,或者symlink)也称为软链接,是一种特殊类型的文件,用作指向另一个文件的快捷方式。 使用方法 我们可以使用 ln…

20个SQL查询优化技巧

以下值得关注的 20个SQL查询优化技术列表: 1.在庞大的表(>1.000.000)行上创建索引 2.使用 EXIST() 代替 COUNT() 查找表中的元素 3.用 SELECT 字段代替 SELECT * 4. 4.避免在 WHERE 子句中使用子查询 5. 5.尽可能避免 SELECT DISTINCT…

前端组件封装:构建模块化、可维护和可重用的前端应用

前端组件封装:构建模块化、可维护和可重用的前端应用 前端开发领域的快速演进已经将前端应用的规模和复杂性提升到了一个新的水平。在这个背景下,前端组件封装成为了一项关键实践,旨在构建模块化、可维护和可重用的前端应用。在本文中&#…

[C国演义] 第十五章

第十五章 最长湍流子数组环绕字符串中唯⼀的⼦字符串 最长湍流子数组 力扣链接 子数组 ⇒ dp[i]的含义: 以arr[i] 结尾的所有子数组中的最长湍流子数组的长度 子数组 ⇒ 状态转移方程根据 最后一个位置来划分👇👇👇 初始化: 都初始化为…

电力物联网关智能通讯管理机-安科瑞黄安南

众所周知,网关应用于各种行业的终端设备的数据采集与数据分析,然后去实现设备的监测、控制、计算,为系统与设备之间建立通讯联系,达到双向的数据通讯。 网关可以实时监测并及时发现异常数据,同时自身根据用户规则进行…

乡村新业态 | 直播电商引领经济发展,拓世法宝AI智能直播一体机助推乡村振兴

党的二十大报告作出加快建设数字中国、全面推进乡村振兴的战略部署,为进一步加强数字乡村建设、全面推进乡村振兴指明了方向。近年来,随着乡村新业态新模式的不断涌现,以直播电商为代表的数字经济为各地的农村产业升级带来了新契机。各地政府…

【Android】adjustViewBounds 的理解和使用

理解 adjustViewBounds 是一个 ImageView 的属性,用于调整 ImageView 的边界以适应图像的尺寸。当设置为 true 时,ImageView 的边界将根据图像的宽高比例进行调整,以确保图像完全显示在 ImageView 内部。 理解和使用 adjustViewBounds 的步…

Leetcode—136.只出现一次的数字【简单】

2023每日刷题&#xff08;二&#xff09; Leetcode—136.只出现一次的数字 位运算法 实现代码 int singleNumber(int* nums, int numsSize){int i 0;int res 0;for(; i < numsSize; i) {res ^ nums[i];}return res; }运行结果 之后我会持续更新&#xff0c;如果喜欢我的…

VI/VIM的使用

1、vi的基本概念   基本上vi可以分为三种状态&#xff0c;分别是命令模式&#xff08;command mode&#xff09;、插入模式&#xff08;Insert mode&#xff09;和底行模式&#xff08;last line mode&#xff09;&#xff0c;各模式的功能区分如下&#xff1a; 1) 命令行模…

启动速度提升 10 倍:Apache Dubbo 静态化方案深入解析

作者&#xff1a;华钟明 文章摘要&#xff1a; 本文整理自有赞中间件技术专家、Apache Dubbo PMC 华钟明的分享。本篇内容主要分为五个部分&#xff1a; -GraalVM 直面 Java 应用在云时代的挑战 -Dubbo 享受 AOT 带来的技术红利 -Dubbo Native Image 的实践和示例 -Dubbo…

中国人口文化促进会社区文化推广工作委员会成立 暨2024社区春晚文艺活动新闻发布会在京成功举办

2023年10.13日&#xff0c;下午1点&#xff0c;在北京大红门国际会展中心召开了中国人口文化促进会社区文化推广工作委员会成立暨2024社区春晚文艺活动新闻发布会。来自政府相关部门、社会组织、新闻媒体和公益企业界的相关领导与代表齐聚一堂&#xff0c;共襄盛举。 本次大会由…

POI报表的入门

POI报表的入门 理解员工管理的的业务逻辑 能够说出Eureka和Feign的作用 理解报表的两种形式和POI的基本操作熟练使用POI完成Excel的导入导出操作 员工管理 需求分析 企业员工管理是人事资源管理系统中最重要的一个环节&#xff0c;分为对员工入职&#xff0c;转正&#x…

自动驾驶:控制算法概述

自动驾驶&#xff1a;控制算法概述 常见控制算法PID算法LQR算法MPC算法 自动驾驶控制算法横向控制纵向控制 参考文献 常见控制算法 PID算法 PID&#xff08;Proportional-Integral-Derivative&#xff09;控制是一种经典的反馈控制算法&#xff0c;通常用于稳定性和响应速度要…

基础知识汇总一

1.表单中Get和Post提交方法的区别? get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.简述什么是软件架构的MVC? MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码…

ue5蓝图请求接口

安装与使用 1、在虚幻商城搜索 VaRest 插件 2、选择自己项目的对应版本安装 3、查看是否安装成功 4、进入项目后&#xff0c;分别启动VaRest、JSON Blueprint Utilities两个插件&#xff08;勾选后会提示重启项目&#xff09; 5、基本用法&#xff1a;打开关卡蓝图使用&#xf…

Evaluating Open-Domain Question Answering in the Era of Large Language Models

本文是LLM系列文章&#xff0c;针对《Evaluating Open-Domain Question Answering in the Era of Large Language Models》的翻译。 大语言模型时代的开放域问答评价 摘要1 引言2 相关工作3 开放域QA评估4 评估开放域QA模型的策略5 正确答案的语言分析6 CuratedTREC上的正则表…

Kotlin笔记(一):Lambda,非空判断,函数默认参数

1. Lambda表达式 Lambda就是一小段可以作为参数传递的代码,在kotlin中的标准形式为: {参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}标准形式使用如下: val list listOf("Apple", "Banana", "Orange", "Pear", "Grape&…

Android Studio SDK manager加载packages不全

打开Android Studio里的SDK manager&#xff0c;发现除了已安装的&#xff0c;其他的都不显示。 解决方法&#xff1a; 设置代理&#xff1a; 方便复制> http://mirrors.neusoft.edu.cn/ 重启Android Studio

【Java学习之道】TCPIP套接字编程实例

引言 网络编程是Java学习中不可或缺的一部分&#xff0c;而TCP/IP套接字编程又是网络编程的基础。那么&#xff0c;初学者如何才能快速掌握TCP/IP套接字编程呢&#xff1f;今天我们就来通过一个简单的实例&#xff0c;为你揭示TCP/IP套接字编程的奥秘&#xff01; 一、什么是…