Redis进阶

更新缓存的问题

[主动]需要操作人员去操作,或者定时调度 
[被动]由用户触发更新 
[预加载]提前加载好数据

 

  • 方案1
    • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存;
    • 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验

 


 

  • 方案2
    • [被动]前台获取数据时发现没有缓存数据就会去数据库同步数据到缓存
    • 问题:当并发请求获取缓存数据不存在的时候,就会产生并发的查询数据的操作。

 


 

  • 方案3
    • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,这里不删除缓存,通过遍历数据覆盖和删除掉无效的数据
    • 问题:逻辑相对麻烦,而且更新机制无法通用;

 

  • 方案4(推荐
    [主动][预加载]前台获取缓存的时候需要先得到缓存数据对应的Redis Key(简称:[ShowingKey]),然后根据[ShowingKey]去读取缓存数据(简称:[缓存];
    • 需要两块数据:
      • [ShowingKey](可以是最近一次更新缓存的时间戳或者根据自己规则自定义)
      • [缓存](需要缓存的数据,如:DB数据等)

    • 举例: 
      我们现在有个业务需要缓存今日上新商品数据,缓存到Hash中
      • [缓存]对应Redis Key 规则
        • Hash Key=Goods:Todays:{0} {0}=时间戳
      • [ShowingKey]对应的Redis Key
        • Key string key=Goods:Todays:ing 内容=最近一次的更新时间戳

      更新逻辑:

      后台编辑人员操作完数据的时候点击更新按钮,获取服务器当前时间=1469938351000=[更新时间戳],然后获取DB数据,缓存到Goods:Todays:1469938351000中,添加缓存数据成功后,获取Goods:Todays:ing中的时间戳1449538371020=[上一次更新时间戳],更新Goods:Todays:ing值=[更新时间戳]=1469938351000,更新成功后可以把[上一次更新时间戳]对应的缓存设置过期时间,我一般是设置5秒后过期。(注意旧数据一定要设置过期时间,不能直接删除,因为在切换[ShowingKey]的过程中可能还有业务在使用)

总结

  • 第1种更新方案影响用户体验一般不推荐使用
  • 第2种更新方案可以通过程序锁,锁住更新操作只能有一个进入DB查询,可以避免问题
  • 第3种更新方案不会有第1,2 的问题,但是更新逻辑写起来比较麻烦,而且更新方案不能抽象通用
  • 第4种更新方案使用提前加载到缓存,然后在切换需要显示的缓存数据,可以完美解决1,2,3中的问题

redis内存不足,滥用

  • 问题
    1. 数据不断累加,无效数据未清理,缓存未设置过期时间
    2. 存储数据中包含未使用到字段,整个对象序列化到redis中
    3. 冷数据,或者根本不会再去使用的无效数据没有清理
  • 解决
    1. 数据区分无效时间,设置过期时间,使无效数据过期;(如:通过日期后缀命名Key)
    2. 区分冷数据,清理掉冷数据;
    3. 缓存数据从简,redis key命名从简,数据字段命名从简,无效字段不添加在缓存中;

键命名规范

  • 内存数据库,键名长度影响有限内存空间,所以命名应该控制长度,简短易懂;
  • 大小写规范
  • 根据业务命名,相同业务统一的Key前缀

 

转载于:https://www.cnblogs.com/yudis/articles/5764205.html

### Redis 的高级用法和特性 #### 1. 使用带有自动补全和语法高亮的交互式 CLI 为了更高效地管理和操作 Redis 数据库,可以采用具备自动完成命令以及提供语法高亮特性的客户端工具。这种增强型CLI能够显著提升用户体验,在执行复杂查询时尤为有用[^1]。 ```bash # 安装并运行支持自动完成与语法高亮特性的Redis CLI pip install interactive-redis-cli interactive_redis_cli ``` #### 2. 启用多种持久化机制保障数据安全 通过配置 `redis.conf` 文件中的设置项来激活 RDB (快照) 和 AOF (追加仅文件) 这两种不同的持久化策略。这有助于防止意外断电或其他异常情况造成的数据丢失风险。当容器启动时指定挂载外部卷用于存储这些持久化的数据库副本,从而实现跨重启后的状态保持[^2]。 ```dockerfile # Docker Compose 或者直接使用Docker指令启动带持久化的Redis实例 docker run --name redis \ -v /local/path/to/data:/data \ -v /local/path/to/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -p 6379:6379 -d redis \ redis-server /usr/local/etc/redis/redis.conf ``` #### 3. 创建受限账户提高安全性 对于生产环境下的 Redis 实例来说,创建一个专门的服务账号是非常重要的一步。该账号不具备 shell 访问权限,并且其家目录也被移除以减少潜在的安全威胁。此外还将 Redis 可执行程序及其工作路径赋予此特定用户组所有权,确保只有授权人员才能对其进行修改或访问[^3]。 ```bash # 添加不具Shell登录能力也不拥有Home Directory的新用户 sudo useradd -M -s /sbin/nologin redis # 更改Redis安装目录所属权给新建立的用户 chown -R redis:redis /path/to/installation/ ``` #### 4. 构建分布式集群架构扩展性能 随着业务增长带来的负载压力增大,单机版 Redis 很难满足需求。此时可以通过构建多节点组成的集群模式来进行横向扩容。每个节点负责处理一部分键空间内的读写请求,而整个系统的吞吐量则取决于所有成员共同协作的结果。在实际部署过程中需注意各服务器间网络连接质量及延迟等因素的影响[^4]。 ```bash # 分别于不同主机上依次启动多个Redis服务端进程作为集群组成部分之一 /usr/local/redis/src/redis-server /etc/redis/node-01.conf /usr/local/redis/src/redis-server /etc/redis/node-02.conf ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值