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的几种应用实战的更多相关文章

  1. Redis和消息队列使用实战

    消息队列是在乐视这边非常普遍使用的技术.在我们部门内部,不同的项目使用的消息队列实现也不一样.下面是支付系统的流转图(部门兄弟画的,借用一下): 从图中可以看到,里面用到了kafka消息队列.作用是做 ...

  2. 详细介绍Redis的几种数据结构以及使用注意事项(转)

    原文:详细介绍Redis的几种数据结构以及使用注意事项 1. Overview 1.1 资料 <The Little Redis Book>,最好的入门小册子,可以先于一切文档之前看,免费 ...

  3. Redis系列(二):Redis的5种数据结构及其常用命令

    上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法, 没看过的同学可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. 本篇博客我们来 ...

  4. Python操作Redis的5种数据类型

    1.连接redis(两种方式) # decode_responses=True: 解决获取的值类型是bytes字节问题 r = redis.Redis(host=', db=0, decode_res ...

  5. Redis 的几种数据结构&五种数据类型对象

    先看几种数据结构 通过分析底层的数据结构,学习如何根据场景选型和设计 1,简单动态字符串 redis使用的字符串SDS有别于C语言中的字符串 a, 结构 free字段为已分配但未使用的空间 len为已 ...

  6. [转载] redis 的两种持久化方式及原理

    转载自http://www.m690.com/archives/371 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串 ...

  7. Redis的两种持久化方式-快照持久化和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...

  8. redis的两种安装方法

    原:https://www.cnblogs.com/caokai520/p/4409712.html C# Redis   概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦 ...

  9. Jedis操作笔记 redis的五种存储类型

    常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 String是最简单的类型,一个key对应一个val ...

  10. Redis 中 5 种数据结构的使用场景介绍

    这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String.Hash.List.Set.Sorted Set做了讲解,需要的朋友可以参考下 一.redis ...

随机推荐

  1. 【GUI软件】小红书指定博主批量采集笔记,支持多博主同时采集!

    目录 一.背景介绍 1.1 爬取目标 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景介绍 1.1 爬取目标 ...

  2. gitignore文件不生效的问题解决

    如何添加 git的忽略文件 .gitignore 在使用git过程中,我们可能有些文件不需要上传上去,比如一些缓存文件,生成的图片,运行环境的一些配置等等,这时就需要用到.gitignore忽略掉这些 ...

  3. 远程控制软件 Teamviewer、Splashtop、向日葵哪个好用

    ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) 好用的远程控制软件,我一般只推荐这三个经典品牌: Teamviewer.Splashtop.向日葵. Teamviewer 来自德国,妥妥 ...

  4. .NET使用P/Invoke来实现注册表的增、删、改、查功能

    注册表可以用来进行存储一些程序的信息,例如用户的权限.或者某些值等,可以根据个人需要进行存储和删减. 当前注册表主目录: 引用包 Wesky.Net.OpenTools 1.0.5或者以上版本 操作演 ...

  5. kubernetes 二次开发-认证,鉴权(1)

    基于webhook的认证 授权过程 认证授权服务需要满足如下kubernetes的规范 kubernetes api-server组件发送 http post 请求 url:https://authn ...

  6. Java遍历Map集合的方法

    Java中遍历Map集合的常用方式主要有以下几种: 1.使用keySet()方法遍历 遍历Map的key集合,然后通过key获取value. Map<String, Integer> ma ...

  7. makedown快速入门

    Makedown学习 Makedown 作为一个强大文本编辑语言,学习并熟悉应用是写好一篇优秀博客的基础 那么接下来我将介绍makedown语言最常用的几个语法 标题 +"space&quo ...

  8. 无需搭建环境,零门槛带你体验Open-Sora文生视频应用

    本文分享自华为云社区<Open-Sora 文生视频原来在AI Gallery上也能体验了>,作者:码上开花_Lancer. 体验链接:Open-Sora 文生视频案例体验 不久前,Open ...

  9. php程序出现乱码

      // 1, PHP程序中的 中文乱码         //    php7.0以下程序,没有默认设定 编码格式 , 需要添加响应头         //    header("Conte ...

  10. npm包管理器 切换npm源 使用nrm来管理npm镜像源

    npm是NodeJs项目模块管理工具,它已经集成了nodejs安装包中,在npm从从5.2版开始,增加了 npx 命令(解决的主要问题,就是调用项目内部安装的模块,很多工具不再需要npm -g 全局来 ...