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 ...
随机推荐
- linux 下jq的使用
安装: yum install jq -y 文档: https://stedolan.github.io/jq/manual/ 更多: https://blog.csdn.net/Cheat11730 ...
- centos7桌面版安装百度网盘
百度网盘官网下载Linux版本的软件 CentOS7的软件包格式为rpm # 安装依赖 yum -y install libXScrnSaver yum -y install libstdc++.so ...
- kettle使用1-全表导入
1.新建转换 2.DB连接中,新建数据库连接 3.在输入中,选择表输入 选择连接的数据库和查询的sql的数据 4.再输出中,选择表输出 5.按住shift,建立数据连接 6.匹配数据字段映射
- 渐变颜色css设置
小说付费章节渐变颜色配置 position: absolute; top: 0; left: 0; width: 100%; height: 211px; transform: translateY( ...
- 回顾复习x学习笔记
从头回顾(截至搜索) #define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++) #define foo(x,y,z) for(int (x)=(y);( ...
- C# 程序集、模块和类型概念及关系
目录 C# 程序集.模块和类型概念及关系 概述 程序集 模块 类型 程序集.模块和类型的关系 总结 引用 C# 程序集.模块和类型概念及关系 概述 在 C# 中,程序集.模块和类型是构成 .NET 应 ...
- 记录freeswitch的一个2833问题
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 运营商内部新老系统混用,互联互通的问题较多,其中以DTMF码的问题最多,花样也多. 环境 CentOS 7.9 freeswitch ...
- Django性能优化:提升加载速度
title: Django性能优化:提升加载速度 date: 2024/5/20 20:16:28 updated: 2024/5/20 20:16:28 categories: 后端开发 tags: ...
- SASS 插值语句 #{ }的使用
在之前我们已经使用用 / 来进行计算,但如下情况不一样 例如 p{ font: 16px/30px Arial, Helvetica, sans-serif; } 如果需要使用变量,同时又要确保 / ...
- Redis高可用一(主从)
Redis高可用一(主从) 1.首先要有2或以上的Redis数据库,我这里三个redis(一主两从) 2.进入到主Redis 配置 redis.conf文件 # 主redis bind 0.0.0.0 ...