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. EasyRepro与测试自动化( 一) 概览

    EasyRepro是一个框架,允许在特定的Dynamics 365组织上执行自动化UI测试.你可以使用它来自动化冒烟测试.回归测试和负载测试等.该框架是由开源项目Selenium构建的,Seleniu ...

  2. GOLANG-配置nginx反向代理端口 配置域名

    目录 配置/etc/nginx/nginx.conf文件 新建/etc/nginx/conf.d/doc.haimait.conf文件 重启nginx服务 解析自己的域名到服务器的公网ip 配置/et ...

  3. 如何使用Tushare+ Backtrader进行股票量化策略回测

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 典型股票量化回测流程 典型的股票量化策略回测流程包括以下几个步骤: 数据获取:首先需要获取所需的股票市场 ...

  4. installshield 安装jdk并配置环境变量

    今天来通过installshield安装jdk以及配置环境变量,本质上是调用第三方安装程序. 首先将jdk的安装文件添加到我们的安装程序中 然后编写我们的脚本 选择BEHAVIOR AND LOGIC ...

  5. JDK源码阅读-------自学笔记(二十二)(java.util.ArrayList自定义晋级,ArrayList实战详解)

    简介(Introduction)   上篇文章主要介绍了ArrayList自行模仿建立的方式,那么,其实这个类不是一次性就那么完美的,现在做一个一步步变成那样完整的ArrayList的版本升级测试. ...

  6. 鸿蒙HarmonyOS实战-Stage模型(UIAbility组件)

    一.UIAbility组件 1.概述 HarmonyOS中的Stage模型是一种基于UIAbility组件的应用程序架构.UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一.它 ...

  7. [kernel] 带着问题看源码 —— 进程 ID 是如何分配的

    前言 在<[apue] 进程控制那些事儿>一文中,曾提到进程 ID 并不是唯一的,在整个系统运行期间一个进程 ID 可能会出现好多次. > ./pid fork and exec c ...

  8. 痞子衡嵌入式:从JLink V7.62开始优化了手动增加新MCU型号支持方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是JLink 7.62优化了手动增加新MCU型号支持方法. JLink 工具可以说是搞单片机开发的必备神器,JLink 包括一个硬件仿真器 ...

  9. 使用docker 5分钟搭建一个博客(mysql+WordPress)

    目录 一.系统环境 二.前言 三.搭建博客 3.1 创建wordpress和mysql容器 3.2 在wordpress界面设置个人博客信息 3.3 WordPress容器创建命令的简化版本 一.系统 ...

  10. C# winform GDI+ 五子棋 (一):基本界面和胜负判断

    棋盘和棋子采用GDI+画上去的.棋盘18*18.棋子是用DrawElipse画的,白棋和黑棋分两个List集合存储,方便判断五子连线的情况. 主要说一下,五子连线的思路,把集合按行和按列以及按正斜和反 ...