01.Redis 概述

Redis 概述

Redis (Remote Dictionary Server远程字典服务)是一个遵循BSD MIT开源协议的高性能的NoSQL。Redis 基于ANSI C语言语言编写的key-value数据库

Redis 官网地址: https://redis.io/

1. Redis 特性

  • 速度快: 10W QPS,基于内存,C语言实现
  • 单线程
  • 持久化
  • 支持多种数据结构
  • 支持多种编程语言
  • 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
  • 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
  • 主从复制
  • 支持高可用和分布式

单线程

Redis 6.0版本前一直是单线程方式处理用户的请求

单线程为何如此快?

  • 纯内存
  • 非阻塞
  • 避免线程切换和竞态消耗
  • 基于Epoll实现IO多路复用

注意事项:

  • 一次只运行一条命令
  • 避免执行长(慢)命令:keys *, flushall, flushdb, slow lua script, mutil/exec, operate big value(collection)
  • 其实不是单线程: 早期版本是单进程单线程,3.0 版本后实际还有其它的线程, 实现特定功能,如: fysnc file descriptor,close file descriptor

2. Redis 常见应用场景

  • 缓存:缓存RDBMS中数据,比如网站的查询结果、商品信息、微博、新闻、消息
  • Session 共享:实现Web集群中的多服务器间的session共享
  • 计数器:商品访问排行榜、浏览数、粉丝数、关注、点赞、评论等和次数相关的数值统计场景
  • 社交:朋友圈、共同好友、可能认识他们等
  • 地理位置: 基于地理信息系统GIS(Geographic Information System)实现摇一摇、附近的人、外卖 等功能
  • 消息队列:ELK等日志系统缓存、业务的订阅/发布系统

3. 缓存穿透,缓存击穿和缓存雪崩

  • 缓存穿透

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

    解决方法:

    接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截

    从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复 用同一个id暴力攻击

  • 缓存击穿

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

    解决方法:

    设置热点数据永远不过期。

  • 缓存雪崩

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

    解决方法:

    缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生

    如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中

    设置热点数据永远不过期

4. Pipeline 流水线

Redis 客户端执行一条命令分4个过程:

发送命令--〉命令排队--〉命令执行--〉返回结果

这个过程称为Round trip time(简称RTT, 往返时间),mget,mset指令可以一次性的批量对多个数据的执行操作,所以有效节约了RTT

但大部分命令(如hgetall)不支持批量操作,需要消耗N次RTT ,利用 Pipeline 技术可以解决这一问题。使用Pipeline执行时速度比逐条执行要快,特别是客户端与服务端的网络延迟越 大,性能体能越明显。

### 关于 `com.jd.mpaas.redis.RedisDriver` 的API文档和使用示例 对于 `com.jd.mpaas.redis.RedisDriver` 这一特定类库,官方或社区提供的具体文档可能不易获取。然而,在处理 Redis 驱动程序时,通常遵循的标准实践可以提供指导。 #### API 文档概述 Redis 客户端驱动一般会实现一组标准接口来执行命令操作、管理连接池以及配置客户端行为。虽然具体的 `com.jd.mpaas.redis.RedisDriver` 可能有其独特的特性,但大多数 Redis Java 客户端都会支持如下功能: - **建立连接**: 使用给定的主机名和端口号创建到 Redis 服务器的新连接。 - **发送命令**: 提供方法用于向 Redis 发送各种类型的命令请求并接收响应数据。 - **事务支持**: 支持多条命令作为一个原子单元提交的能力。 - **管道模式(Pipelining)**: 允许多个命令被一次性写入而不等待各自的回复,从而提高性能效率。 - **订阅/发布机制(Sub/Pub)**: 实现消息队列的功能,允许不同进程之间通过频道交换信息[^1]。 由于缺乏针对该特定包的确切资料链接,建议查阅京东云平台或其他相关资源网站上的说明文件以获得最准确的帮助指南。如果此组件基于流行的 Redis 库如 Jedis 或 Lettuce,则可参考这些通用库的手册作为补充参考资料。 #### 使用实例 下面给出一段假设性的代码片段展示如何初始化并利用此类与 Redis 数据库交互: ```java import com.jd.mpaas.redis.RedisDriver; public class RedisExample { public static void main(String[] args) throws Exception { try (// 创建一个新的 RedisDriver 对象实例 RedisDriver redisClient = new RedisDriver("localhost", 6379)) { // 设置键 "testKey" 值为 "hello world" String setResult = redisClient.set("testKey", "hello world"); // 获取存储在键 "testKey" 中的内容 String getResult = redisClient.get("testKey"); System.out.println("Set result:" + setResult); System.out.println("Get result:" + getResult); // 删除指定的 key-value 记录 Boolean delResult = redisClient.del("testKey"); System.out.println("Delete result:" + delResult); } } } ``` 请注意上述例子中的参数设置应当依据实际环境调整,并且需要确保所使用的版本兼容性问题得到妥善解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值