目录

  • 高级数据类型
  • 支持事务
  • 支持Lua脚本
  • 支持pipeline 管道|流水线
  • 支持发布/订阅
  • 可实现异步队列 | 消息队列

高级数据类型

1、Bitmap 位图

按 bit 位存储信息,常用于实现布隆过滤器

2、HyperLogLog 基数统计

提供去重计数功能,根据输入元素来计算基数,不储存输入元素本身。

优点是在数量量很大时,计算基数所需的空间总是固定 的且很小的。和Bitmap一样,不精确、有一定的错误率。

基数:一个数据集中不重复的元素个数(剔除重复元素后的元素数量)

3、Geospatial 地址空间

用于保存地理位置,可以做距离计算、根据半径范围查找等,比如计算最优地图路径、查找附近范围内的人。

支持事务

redis支持事务,可以将多个命令作为打包为事务来执行。

redis的事务只是把多个命令打包,放在一个队列中执行,只是保证了事务中指令的串行执行,并没有给事务添加原子性的保障机制,redis的事务具有隔离性但不具备原子性,执行失败时不会回滚。

#标记事务开始
multi#多个命令,依次入队
#...#执行|提交事务
exec#取消事务
discard
  • 如果在exec执行事务之前发生了错误,比如某个要入队的命令语法不对,会自动取消这个事务。
  • 如果exec执行事务时,中途某个命令执行出错,并不会回滚已执行的命令,而是跳过出错的命令继续往下执行,可以在执行结果中看到各个命令的执行结果。

支持Lua脚本

Lua脚本可以用于打包执行一些列指令

  • 关键特点:与redis事务都是打包命令,但lua脚本中的一系列操作、指令具有原子性
  • 复用方便

如果业务逻辑比较复杂或者多个指令需要具有原子性,可以将这些指令封装在lua脚本中发送给redis执行。

支持pipeline 管道|流水线


管道可以打包一批指令,一次性发送给redis服务器执行,redis服务器会一次性返回这批命令的所有执行结果,减少了与redis服务器频繁交互的网络通信的时间开销。

与redis事务相比

  • 相同点:都是将多个指令打包发送给redis服务器执行,整个操作都不具备原子性,某个指令执行失败时会继续执行后续指令,不会回滚之前的操作。
  • 不同点:redis事务是作为一个整体执行的,具有隔离性,redis服务器执行事务期间不会穿插执行其它客户端的指令;管道中的命令不是作为一个整体执行的,而是逐个指令执行,虽然事务、管道都能保证所包含命令执行的顺序性,但执行管道中命令的期间可能会穿插执行其它客户端的指令,最终执行结果可能会被影响,所以管道只适合对顺序性要求不高的场景。

原生的mset、mget实质是批量执行set、get指令,但具有原子性。

使用示例

@Autowired
private StringRedisTemplate redisTemplate;public void test() {//...//返回值list,元素对应各条命令的执行结果List<Object> resultList = redisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection redisConnection) throws DataAccessException {//打开一个pipelineredisConnection.openPipeline();redisConnection.set("name".getBytes(), "chy".getBytes());redisConnection.set("tel".getBytes(), "188xxxxxx".getBytes());redisConnection.set("email".getBytes(), "xxxxxxx@qq.com".getBytes());//不要调用redisConnection的closePipeline()关闭pipeline,也不要关闭连接欸,不然拿不到返回的执行结果//返回null即可return null;}});//...}

不要一次性组装发送太多指令,或者发送big key这种大key,可能导致网络拥塞,可以将大量指令拆分到小的pipeline中分批完成。

支持发布/订阅

发布/订阅(publish/subscribe)是一种消息通信模式,redis客户端订阅redis服务器上的一个或多个channel(管道、频道),客户端发布消息到redis服务器中的某个channel后,redis服务器会将消息推送给所有订阅了此channel的redis客户端。

发布/订阅常用命令

subscribe  channel1  channel2   #订阅一个或多个频道psubscribe CCTV1  #p即pattern,用正则表达式指定要订阅的频道,会订阅所有匹配的频道
psubscribe CCTV*  #订阅所有以CCTV开头的频道
psubscribe *TV  #订阅所有以TV结尾的频道
psubscribe CCTV* CNTV*  #可以指定多个匹配模式,订阅以CCTV开头的所有频道、订阅所有以CNTV开头的所有频道unsubscribe  channel1  channel2   #退订一个或多个频道punsubscribe CCTV* CNTV*  #退订以CCTV开头的所有频道、退订以CNTV开头的所有频道publish  channel1  "hello"  #往某个频道里推送消息

说明

  • channel不需要手动创建
  • redis客户端无需订阅channel就可以直接往任意channel中发布消息
  • 客户端订阅的channel列表是作为session存储在redis服务器上的,订阅只在本次会话期间有效,断开与redis服务器的连接后订阅失效,所以客户端每次启动连接到redis服务器时都需要重新订阅。
  • redis发布/订阅的消息类似于广播,是在线即时消息,只有在线的订阅者(已连接到redis服务器的客户端)才会收到推送。若客户端当时不在线,后续连接到服务器时,服务器也不会再次推送之前的消息。

redis的发布订阅不能提供可靠的消息投递,一般只用于日志、流水等对消息投递可靠性要求不高的场景。

可实现异步队列 | 消息队列

redis实现异步|消息队列有2种方式

1、使用发布/订阅模式实现

  • 可以让多个消费者同时消费消息。消费者集群部署时,消息会被每个消费者节点进行消费,存在重复消费
  • 无法保证消息送达(不可靠)

2、使用list实现

  • 生产者用rpush实现消息入队,消费者用blpop阻塞获取list中的元素实现消息出队
  • list有序,可以实现顺序消息
  • 消息只会被一个消费者进行消费

3、使用zset实现延时队列

  • 把消息内容作为key,消息发送的时间转换为时间戳作为score,使用zadd指令实现消息入队
  • 消费者间隔指定时间用 zrangebyscore 指令获取当前时间范围内的key进行处理。

实现消息队列尽量用rabbitmq、kafka等更专业的消息中间件,功能更加强大。

Redis的高级特性相关推荐

  1. Redis进阶实践之五Redis的高级特性

    一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性,虽然 ...

  2. Redis的高级特性哨兵

    一.哨兵介绍 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入.哨兵的核心功能是主节点的自动故障转移.下面是Redis官方文档对于哨兵功能的描述: 监控(Monitor ...

  3. Redis之高级特性

    一 慢查询分析 通过慢查询分析,可以扎到有问题命令,然后进行分析.一般而言都是设置一个阀值,当查询时间超过这个阀值,就会将这个语句或者命令记录下来. 而且需要注意的是,慢查询只是针对命令执行阶段,而不 ...

  4. Redis05:Redis的高级特性:expire 生存时间、pipeline 管道、info命令、Redis的持久化、Redis 的安全策略、Redis监控命令-monitor

    一.expire 生存时间 Redis中可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它. 它的一个典型应用场景是:手机验证码 我们平时在登录或者注册的时候,手机会接收到一 ...

  5. 一文通透讲解Redis高级特性,多线程/持久化/淘汰机制等统统搞定

    Redis 是一个开源的,基于内存的可持久化的非关系型数据库存储系统.在实际项目中可以用 Redis 做缓存或消息服务器,Redis 也是目前互联网中使用比较广泛的非关系型数据库,下面就来深入分析Re ...

  6. Redis 高级特性(2)—— 发布 订阅模式

    Redis 高级特性 -- 发布订阅 1. 发布-订阅介绍 "发布-订阅"模式包含两种角色,分别为发布者和订阅者.订阅者可以订阅一个或者若干个频道(channel),而发布者可以向 ...

  7. Redis 高级特性(1)—— 事务 过期时间 排序

    1. Redis 高级特性 -- 事务 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执 ...

  8. Redis 宝典 | 基础、高级特性与性能调优

    转载:Redis 宝典 | 基础.高级特性与性能调优 本文由 DevOpsDays 本文由简书作者kelgon供稿,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长. 作者:kelgon 链接: ...

  9. Redis 基础、高级特性与性能调优 | 高薪必备

    来源:http://c7.gg/fxqAK 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护 ...

最新文章

  1. html表格数据循环展示,MVC在View中循环数据在table中显示
  2. java中常用的定位方式有哪些_java-selenium八种元素定位方式
  3. LeetCode OJ - Candy
  4. REVERSE-COMPETITION-0xGame2021
  5. BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
  6. 负载均衡mysql的使用_使用负载均衡集群集化 MySQL - Azure Virtual Machines | Microsoft Docs...
  7. oracle迁移性能对比,SQL Server 2015与Oracle性能对比.doc
  8. 微信小程序必看api demo源码
  9. zip与rar的区别
  10. 织梦dede canonical 标签页面设置(最新完美修改)
  11. 计算机网络 路由协议的配置_瑞尔森大学计算机网络专业
  12. 论文阅读《Characterizing BDS signal-in-space performance from integrity perspective》1
  13. Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
  14. php实现手机投屏到电视机,手机画面投屏到电视机/投影仪,最常用最简单的3种方法!...
  15. MySQL删除注册表的卸载方式
  16. 求职路要敢于学习亮剑精神
  17. 游戏引擎 白鹭(egret)学习总结(一)
  18. Linux下导入导出 MySQL 数据库表结构数据
  19. BZOJ 4605: 崂山白花蛇草水 树套树 权值线段树套kdtree
  20. 川崎机器人总线通信_川崎机器人技术干货之机器人Profinet从站设定说明

热门文章

  1. GameFramework篇:StarForce资源热更新讲解(一:基本流程)
  2. 资产配置那些事-信用卡
  3. 战士、魔法师与怪兽的战斗游戏
  4. ffmpeg h264转avi
  5. python cls什么意思_pythonself,cls,decorator的理解
  6. 今天工作的效率不高,才写了一个打印管理类
  7. 送给她超浪漫的表白信——她感动哭了(.html)
  8. 2020年流动式起重机司机考试内容及流动式起重机司机考试APP
  9. 全球物联网发展趋势-信通院 物联网白皮书 2020学习记录
  10. Oracle的SCN和LSN