Redis的高级特性与应用场景(一)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis的高级特性与应用场景(一)

Redis的高级特性与应用场景(一)

 

巧用expire

redis 中可以使用 expire 命令设置一个键的生存时间,到期后 redis 会自动删除他

  • 过期时间可以设置为秒或者毫秒精度。
  • 过期时间分辨率总是 1 毫秒。
  • 过期信息被复制和持久化到磁盘,当 Redis 停止时时间仍然在计算 (也就是说 Redis 保存了过期时间)。

应用场景

  • 限时优惠活动
  • 网站热数据缓存
  • 积分排行榜
  • 手机验证码
  • 访客访问频率限制(例如:1分钟最多访问10次)

数据排序-sort

排序可以说是 redis 里面比较复杂的一个操作了

sort 命令可以对列表类型,集合类型和有序集合类型,以及hash类型键进行排序

# 命令格式
sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]

举个例子: 列表里面存储用户id, 正常键值可以存储对应用户id的分数,根据对应分数进行排序,并将排序的操作保存到新的列表里面

lpush list-t 1
lpush list-t 2
lpush list-t 3
set user:1 20
set user:2 10
set user:3 30
# 对list-t进行排序 根据user:id 的值进行排序 进行分页  将查询结果写入新的列表 list-new
sort list-t by user:* get user:* limit 0 2 store list-new

sort使用不好很容易成为性能瓶颈,所以一般都会把排序后的结果写入新的缓存

发布订阅

  • 发布:publish
  • 订阅:subscribe
  • 取消订阅:unsubscribe
  • 按照规则订阅:psubscribe
  • 按照规则取消订阅:punsubscribe

注意:使用punsubscribe命令只能退订通过psubscribe 订阅的频道。

这个场景基本不用多说,一个操作对应多个操作就可以使用


任务队列

任务队列:使用lpushrpop(brpop)可以实现普通的任务队列。brpop是列表的阻塞式(blocking)弹出原语。

它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到等待超时或发现可弹出元素为止。

当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。

  • 优先级队列:
brpop key1 key2 key3 timeout

利用redis的这个机制可以制作一个轻量级队列

限制网站访客访问频率

进行各种数据统计的用途是非常广泛的,比如想知道什么时候封锁一个IP地址。INCRBY命令让这些变得很容易,通过原子递增保持计数;GETSET用来重置计数器;过期属性expire用来确认一个关键字什么时候应该删除。

这里的getset 命令使获取和修改操作具有原子性,才能保证程序正常,如果使用先get,在set是会出现意外情况的.

例子

function checkIp($ip)
{
    $value = (int) $redis->get($ip);
    if ($value) {
        // 设置初始访问值
        $redis->set($ip, 1);
        //设置IP的生存时间为60秒,60秒内IP的访问次数由程序控制
        $redis->expire($ip, 60);
    } else {
        //如果60秒内IP的访问次数超过10,返回false,实现了超过10次禁止
        if ($value > 10) {
            return false;
        } else {
            //如果没有10次,可以自增
            $redis->incr($ip);
        }
    }
    return true;
}

巧用缓存

  • 商品维度计数

喜欢数,评论数,鉴定数,浏览数

hset good:1 visit 1
hincrby good:1 visit 1
hgetall good:1
  • 用户维度计数

动态数、关注数、粉丝数、喜欢商品数、发帖数 等

  • 存储社交关系

譬如将用戶的好友/粉丝/关注,可以存在一个sorted set中,score可以是timestamp,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。

  • 灵活运用计数实现反 spam(垃圾)

登录次数限制,支付次数限制,一分钟评论不能超过2次 可以根据业务设计很多规则

采用sorted set将最近一天用户操作记录起来(为什么不全部记录?节省memory,全部操作会记录到log,后续利用hadoop进行更全面分析统计)

日志可以持续增量到es 或者 数据库

  • 排行榜

这里采用RedisList数据结构或sorted set 结构, 方便实现最新列表or排行榜 等业务场景。

redis调优

  • 精简键名和键值

键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名。

键值:对于键值的数量固定的话可以使用0和1这样的数字来表示

  • SLOWLOG 和mysql一样 记录慢操作命令
slowlog-log-slower-than  //它决定要对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的命令进行记录
slowlog-max-len   //它决定 slowlog 最多能保存多少条日志
  • 限制redis的内存大小

通过redisinfo命令查看内存使用情况,如果不设置maxmemory或者设置为0,64位系统不限制内存,32位系统最多使用3GB内存。

maxmemory:最大内存
maxmemory-policy:内存不足时,数据清除策略

如果数据不可预估的情况下,还是需要设置一下最大使用内存,不然会抛出错误导致服务停止工作

  • 缓存技巧

尽可能的使用Hash数据结构。因为Redis在储存小于100个字段的Hash结构上,其存储效率是非常高的。所以在不需要集合(set)操作或listpush/pop操作的时候,尽可能的使用Hash结构。比如,在一个web应用程序中,需要存储一个对象表示用户信息,使用单个key表示一个用户,其每个属性存储在Hash的字段里,这样要比给每个属性单独设置一个key-value要高效的多。 通常情况下倘若有数据使用string结构,用多个key存储时,那么应该转换成单key多字段的Hash结构。 如上述例子中介绍的Hash结构应包含,单个对象的属性或者单个用户各种各样的资料。

尽可能设置key的生存时间,并指定阀值去限制Redis使用的最大内存。

若是启用了Redis快照功能,应该设置maxmemory值为系统可使用内存的45%,因为快照时需要一倍的内存来复制整个数据集,也就是说如果当前已使用45%,在快照期间会变成95%(45%+45%+5%),其中5%是预留给其他的开销。 如果没开启快照功能,maxmemory最高能设置为系统可用内存的95%

多命令使用管道 pipeline,这个下篇文章会说明

  • 好文学习

好文

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
30天前
|
监控 NoSQL Java
场景题:百万数据插入Redis有哪些实现方案?
场景题:百万数据插入Redis有哪些实现方案?
39 1
场景题:百万数据插入Redis有哪些实现方案?
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
3月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
74 0
|
21天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
55 10
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
62 4
|
1月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
105 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
215 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
2月前
|
存储 消息中间件 缓存
深入探析Redis常见数据类型及应用场景
深入探析Redis常见数据类型及应用场景
54 2
|
3月前
|
Kubernetes NoSQL Redis
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
|
3月前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
497 2