Redis的几种应用实战
1.分布式锁:
实现:用set key value ex time nx指令实现,这个指令以及其参数是原子性的操作。释放锁用del key,释放之前先比较一下value是否与当前的value一样,原因见后面。key为锁名。value为随机数并用一个变量记录这个随机数。ex是个set指令的参数,代表time秒后该key自动删除。nx是set指令的参数,代表没有该key时才设置它的值。
说明:设置过期时间是防止占有锁的线程出现异常,导致一直不释放锁。value使用随机数的原因:超时后,新的线程获取锁了并为key设置了新的随机数,原先的线程还一直在执行逻辑,最后并执行了del指令,如果使用了随机数,在删除前比较了,就不会把key给删了。防止了其他线程释放了当前线程的锁。
2.消息队列:
实现:用list列表类型去作为消息队列使用。一端push加入消息,另一端用阻塞读brpop或blpop指令去获取消息并执行。还要做一个异常处理,如果阻塞读长时间没有消息,Redis为了减少空闲资源占用,会断开连接,这时候br(l)pop会报错,报错后需要重新去阻塞读。如果需要实现延时队列可以使用zset,score作为到期处理时间,然后通过轮询,比较当前时间和score,到时间了就取出消息去执行。
说明:使用阻塞读而不是轮询是为了防止队列空了,做大量无用的空轮询。
3.使用位图存储bool类型数据:
说明:位图的详细指令可自行搜索。首先解释一下位图,位即bit的中文名称,位图的最小存储单位就是bit,结构属于数组,通过索引设置数据。一个bit就是二进制里面的0或1,一个字节(byte)等于8个bit。一个英文字母等于一个byte。汉字就不一定,不同的编码占用不同的字节,有的是两个字节有的是三个字节。可以用setbit设置位,比如setbit key 1 1,意为在第二个位置上设置为1,0的话不用设置,默认就是0。
实现:Redis提供了bitcount和bitpos指令来统计和查找位图类型数据,后面可以加start和end参数选择范围。bool类型的数据正好只要0和1,在有大量的这种bool数据时,使用位图可以节约非常大的空间。应用场景应该类似于登录记录、签到记录等这种纯bool类型数据。例如,某人A第3天时签到了,就执行setbit Akey 2 1。以此类推,想统计签到天数时就执行bitcount Akey。返回的是1的个数,也就是签到天数。bitpos获取的是第一次出现1的位置,如bitpos Akey 1.返回的是第一次出现1的位置,也就是A第一天签到是什么时候。
4.HyperLogLog统计UV:
说明:HyperLogLog是Redis的高级数据结构,作用是统计基数,比如元素有1,2,3,4,5,5,6。HyperLogLog只会统计基数6,即1,2,3,4,5,6不重复的元素的个数,最重要的是,即使元素非常大,它所占有的内存也是固定的,每个HyperLogLog只需花费12KB。它的指令很少。主要有:pfadd key element添加元素。pfcount key统计基数。
实现:在做UV时,即统计独立访客数就可以用上他,针对全网站、单独页面都可以。我们只需要把ip(或用户id)和日期(精确到天)添加进去就行了,有更多其他信息也行,反正HyperLogLog只会统计基数。只要保证当天内一个用户的信息绝对一样就行了,它会自动去重,也就是一天内不管这个用户访问多少次,都只算一次。
5.用scan搜索特定的key:
说明:在数据量不是很大时,可以直接用keys这个简单的指令,按照一定的规则搜索对应key。但当数据量大了以后显然就不可取了,最主要的是keys是阻塞的,它会去遍历所有的key直到找出符合条件的key,时间复杂度是O(n)。scan的时间复杂度虽然也是O(n),但是它不会阻塞线程,可以限定返回的个数。scan是一系列的指令,针对不同的基本数据类型都有对应的一些指令,搜索key只是最基本的用法,更详细的用法可以查找官方api文档。
实现:使用指令scan start match key* count limit。start是游标开始的地方,正是因为使用的是游标,所以不会造成线程阻塞。match后面接正则表达式。count后面接限定的返回数量。比如:scan 0 match person* count 1000,游标从0开始,返回最多1000条person开头的key。会返回两个结果,一个是游标停止的地方,是个整数,下次就把0换成这个整数接着找。另一个就是找到的key了。
Redis的几种应用实战的更多相关文章
- Redis和消息队列使用实战
消息队列是在乐视这边非常普遍使用的技术.在我们部门内部,不同的项目使用的消息队列实现也不一样.下面是支付系统的流转图(部门兄弟画的,借用一下): 从图中可以看到,里面用到了kafka消息队列.作用是做 ...
- 详细介绍Redis的几种数据结构以及使用注意事项(转)
原文:详细介绍Redis的几种数据结构以及使用注意事项 1. Overview 1.1 资料 <The Little Redis Book>,最好的入门小册子,可以先于一切文档之前看,免费 ...
- Redis系列(二):Redis的5种数据结构及其常用命令
上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法, 没看过的同学可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. 本篇博客我们来 ...
- Python操作Redis的5种数据类型
1.连接redis(两种方式) # decode_responses=True: 解决获取的值类型是bytes字节问题 r = redis.Redis(host=', db=0, decode_res ...
- Redis 的几种数据结构&五种数据类型对象
先看几种数据结构 通过分析底层的数据结构,学习如何根据场景选型和设计 1,简单动态字符串 redis使用的字符串SDS有别于C语言中的字符串 a, 结构 free字段为已分配但未使用的空间 len为已 ...
- [转载] redis 的两种持久化方式及原理
转载自http://www.m690.com/archives/371 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串 ...
- Redis的两种持久化方式-快照持久化和AOF持久化
Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...
- redis的两种安装方法
原:https://www.cnblogs.com/caokai520/p/4409712.html C# Redis 概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦 ...
- Jedis操作笔记 redis的五种存储类型
常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 String是最简单的类型,一个key对应一个val ...
- Redis 中 5 种数据结构的使用场景介绍
这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String.Hash.List.Set.Sorted Set做了讲解,需要的朋友可以参考下 一.redis ...
随机推荐
- SpringBoot序列化、反序列化空字符串为null的三种方式
一.需求:接收前端传入的""空字符串参数,有时候我们需要把它转为null SpringBoot项目 方式:①Jackson(推荐).②切面+反射.③注解+切面+反射 后两种方式,未 ...
- linux导出安装包
linux导出安装包 1 背景 部署企业内网环境,主机无法连通外网.不能直接使用yum install安装程序.针对此种情况有如下两个安装办法 源码安装(需要编译环境,安装复杂,容易出错,不推荐) 使 ...
- Asynq 实现 Go 异步任务处理
目录 Asynq 实现 Go 异步任务处理 一.概述 二.快速开始 1. 准备工作 2. 安装asynq软件包 3. 创建项目asynq_task 2. Redis连接项 4. Task任务 5. 编 ...
- WEB服务与NGINX(3)-NGINX基础及配置文件
WEB服务与NGINX(3)-NGINX基础及配置文件 目录 WEB服务与NGINX(3)-NGINX基础及配置文件 1. NGINX初识与安装 1.1 NGINX特性 1.2 NGINX功能和应用场 ...
- ICESat-2 ATL03光子数据读取
ICESat-2数据处理的方式一般为将光子数据投影到沿轨距离和高程的二维空间.如下图: ATL03数据读取 H5是一种数据存储结构,读取原理就是按照该结构获取数据,这里给出两种读取方式. ATL03的 ...
- Sublime快速在当前目录下新建文件(advanceNewfile插件)
1.ctrl+shift+p,输入pci,选择第一个,回车 2.输入 advanceNewfile 安装 3.ctrl+alt+n 新建文件自动保存在当前目录下
- 一个问题:六位八段数码管(Verilog)
[基本信息] 需求:verilog程序,显示任意六位字符或数值,包含点号,且能够按需点亮位数.(学习篇) 芯片型号:cyclone Ⅳ EP4CE10F17C8 数码管属性:六位.八段 [最终成果图] ...
- MySQL学习笔记-数据控制语言
SQL-数据控制语言(DCL) DCL语句用于管理数据库用户,控制数据库的访问权限 一. 管理用户 1. 查询用户 # 访问mysql数据库 use mysql; #查询user表 select * ...
- itest work(爱测试) 开源接口测试&敏捷测试管理平台 9.5.0 发布,接口测试及脑图用例升级
(一)itest work 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...
- js 实现简易时钟效果
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...