redis记录

优点:

1在内存中 ,读写比较快

2:持久化 :aof  rdb 两种

3 string list set zset hash

4 支持主从复制,读写分裂

 

 

删除机制

1定时过期:

 2惰性过去

3定期过期

 

二、缓存穿透

       描述:

       缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

      解决方案:

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

  1. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

三、缓存击穿

      描述:

      缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

四、缓存雪崩

      描述:

      缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,        缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

     解决方案

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  3. 设置热点数据永远不过期。

    

 

### 如何使用 Redis 实现日志记录功能 #### 使用 Redis 记录日志的核心概念 Redis 提供了多种数据结构,其中 `list` 数据类型非常适合用于实现日志记录的功能。通过将日志消息存储到 Redis 列表中,可以快速高效地管理大量日志条目[^4]。 #### 日志记录的具体实现方式 以下是基于 Redis 的日志记录实现方案: 1. **利用 Redis List 存储日志** 可以创建一个名为 `log_queue` 的列表作为日志队列,并通过 `LPUSH` 或 `RPUSH` 命令向该列表追加新的日志项。例如: ```python import redis r = redis.StrictRedis(host='localhost', port=6379, db=0) log_message = "Error occurred at 2023-10-01T12:00:00" r.rpush('log_queue', log_message) ``` 2. **设置日志长度限制** 为了避免日志占用过多内存,可以通过 `LTRIM` 命令限制日志队列的最大长度。例如,保留最近的 100 条日志记录: ```python r.ltrim('log_queue', -100, -1) ``` 3. **读取日志** 当需要查看日志时,可以从 Redis 中获取整个日志队列的内容。例如,使用 `LRANGE` 获取所有日志项: ```python logs = r.lrange('log_queue', 0, -1) for log in logs: print(log.decode('utf-8')) ``` 4. **结合慢查询日志机制优化性能监控** 如果希望进一步增强日志系统的功能性,还可以集成 Redis 自带的慢查询日志功能。这有助于捕获执行时间过长的命令并将其写入日志文件[^1]。 5. **配合其他工具完成持久化** 虽然 Redis 支持临时存储日志,但如果需要长期保存这些日志,则应考虑与其他日志管理系统(如 ELK Stack)相结合。此外,也可以通过配置 XML 文件定义日志归档策略[^3]。 #### 示例代码展示 下面是一个完整的 Python 示例程序,演示如何用 Redis 进行简单的日志记录操作: ```python import redis def add_log(redis_client, message): """ 将日志消息推送到 Redis list """ redis_client.rpush('log_queue', message) def trim_logs(redis_client, max_length=100): """ 截断日志队列至指定大小 """ redis_client.ltrim('log_queue', -max_length, -1) def fetch_logs(redis_client): """ 获取当前所有的日志记录 """ return [msg.decode('utf-8') for msg in redis_client.lrange('log_queue', 0, -1)] if __name__ == "__main__": client = redis.StrictRedis(host='localhost', port=6379, decode_responses=True) # 添加几条测试日志 add_log(client, 'Info: System started') add_log(client, 'Warning: Disk space low') add_log(client, 'Error: Failed to connect database') # 控制日志数量不超过 50 条 trim_logs(client, max_length=50) # 打印现有日志 all_logs = fetch_logs(client) for idx, log in enumerate(all_logs, start=1): print(f"{idx}. {log}") ``` #### 总结 上述方法展示了如何借助 Redis 的高性能特性构建一套简易的日志记录系统。它不仅能够满足实时性的需求,还支持灵活扩展与维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值