缓存—Redis

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 谈及缓存,在软件开发时经常用到缓存是Redis,算是使用最广法的缓存中间件。当然,在面试的过程中,Redis也是经常被询问的题目

谈及缓存,在软件开发时经常用到缓存是Redis,算是使用最广法的缓存中间件。

当然,在面试的过程中,Redis也是经常被询问的题目

Redis是单线程吗?

redis的单线程,是指Redis的网络I/O线程,以及键值的SET和GET等读写操作都由一个线程完成

但是,在Redis持久化、集群同步等操作,是由其他线程来执行

Redis单线程为什么快?

  • Redis的大部分操作都是在内存中完成
  • 采用了高效的数据结构,比如Hash、跳表
  • 单线程模型,避免了多线程间切换的产生的其他时间和性能开销
  • 单线程模型,也不用去考虑因多线程导致死锁的问题
  • Redis采用了I/O多路复用机制处理大量的客户端Socket请求,使得Redis更高效进行网络通信(重要因素)

注意点:

Redis 4.0版本后,增加多线程支持,主要体现在大数据的异步删除功能

Redis 6.0版本后,新增多线程I/O的读写并发能力(即采用了多个I/O线程来处理网络请求)

Redis持久化

面试时,经常会被提问:如何保持数据不丢失?其主要是考察Redis持久化问题,如何去做持久化?

什么情况Redis数据会丢失?

缓存数据在内存中,如果服务器重启时,内存中的数据就会丢失。为了保证数据不丢失,将数据存储到磁盘中,以便服务器重启后,能够从磁盘中恢复原有的数据。

持久化的三种方式:

  • AOF日志(Append only File 文件追加方式):记录所有的操作命令,并以文本形式追加到文件中
  • RDB快照(Redis DataBase):将某时刻的内存数据,以二进制形式写入磁盘
  • 混合持久化方式:redis4.0版本后新增的混合持久化方式

Redis 数据类型

基础数据类型

String

  • 常用命令:set/get/decr/incr/mget
  • 使用场景:普通的key/value存储

Hash

  • 常用命令:hget/hset/hgetall
  • 使用场景:存储某对象数据

List

  • 常用命令:lpush/rpush/lpop/rpoplrange
  • 使用场景:存储列表数据(如微博关注列表/粉丝列表等)

Set(集合)

  • 常用命令:sadd/spop/smembers/sunion等
  • 使用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的

Sorted set(有序集合)

  • 常用命令:zadd/zrange/zrem/zcard等
  • 使用场景:和set一样,但是有序集合通过用户额外提供一个优先级score的参数来为成员排序,并且插入也是有序

特殊数据类型(进阶)

Bitmap 位图

  • 使用方法:

    • setbit key index 0/1 设置某位的值
    • getbit key index 获取某位的值
    • bitcount key start end 获取指定范围内为1的数量
  • 使用场景:统计用户一年活跃天数

GeoHash地理位置

  • 使用方法:

    • geoadd key longitude latitude element(后面可配置多个三元组) 添加元素
    • geodist key element1 element2 unit 计算两个元素的距离
    • geopos key element [element] 获取元素的位置
    • geohash key element 获取元素hash
  • 使用场景:常用于计算附近的人,附近商店

HyperLogLog 基数统计

  • 使用方法:

    • pfadd key element 添加
    • pfcount key 计算
    • pfmerge destkey sourcekey1 sourcekey2 ... 合并
  • 使用场景:提供不精确的去重技术方案

bloomFilter布隆过滤器

  • 使用方法

    • bf.add key element 添加
    • bf.exists key element 判断是否存在
    • bf.madd key element1 element2 ... 批量添加
    • bf.mexists key element1 element2 ... 批量判断
  • 使用场景:网站去重,垃圾邮件过滤,缓存穿透
相关实践学习
基于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
目录
相关文章
|
1天前
|
缓存 NoSQL 中间件
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?epoll、poll和select + Reactor模式
【5月更文挑战第18天】`epoll`、`poll`和`select`是Linux下多路复用IO的三种方式。`select`需要主动调用检查文件描述符,而`epoll`能实现回调,即使不调用`epoll_wait`也能处理就绪事件。`poll`与`select`类似,但支持更多文件描述符。面试时,重点讲解`epoll`的高效性和`Reactor`模式,该模式包括一个分发器和多个处理器,用于处理连接和读写事件。Redis采用单线程模型结合`epoll`的Reactor模式,确保高性能。在Redis 6.0后引入多线程,但基本原理保持不变。
12 2
|
2天前
|
缓存 NoSQL Redis
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?--epoll调用和中断
【5月更文挑战第18天】`epoll`包含红黑树和就绪列表,用于高效管理文件描述符。关键系统调用有3个:`epoll_create()`创建epoll结构,`epoll_ctl()`添加/删除/修改文件描述符,`epoll_wait()`获取就绪文件描述符。`epoll_wait()`可设置超时时间(-1阻塞,0立即返回,正数等待指定时间)。当文件描述符满足条件(如数据到达)时,通过中断机制(如网卡或时钟中断)更新就绪列表,唤醒等待的进程。
27 6
|
3天前
|
NoSQL Redis 缓存
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
【5月更文挑战第17天】Redis常被称为单线程,但实际上其在处理命令时采用单线程,但在6.0后IO变为多线程。持久化和数据同步等任务由额外线程处理,因此严格来说Redis是多线程的。面试时需理解Redis的IO模型,如epoll和Reactor模式,以及其内存操作带来的高性能。Redis使用epoll进行高效文件描述符管理,实现高性能的网络IO。在讨论Redis与Memcached的线程模型差异时,应强调Redis的单线程模型如何通过内存操作和高效IO实现高性能。
30 7
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
|
6天前
|
缓存 NoSQL 关系型数据库
【Redis】Redis 缓存重点解析
【Redis】Redis 缓存重点解析
17 0
|
6天前
|
缓存 NoSQL 关系型数据库
【Redis】Redis作为缓存
【Redis】Redis作为缓存
8 0
|
6天前
|
存储 缓存 监控
利用Redis构建高性能的缓存系统
在现今高负载、高并发的互联网应用中,缓存系统的重要性不言而喻。Redis,作为一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。本文将深入探讨Redis的核心特性,以及如何利用Redis构建高性能的缓存系统,并通过实际案例展示Redis在提升系统性能方面的巨大潜力。
|
6天前
|
存储 缓存 NoSQL
【技术分享】求取列表需求的redis缓存方案
【技术分享】求取列表需求的redis缓存方案
24 0
|
6天前
|
缓存 NoSQL 安全
Redis经典问题:缓存击穿
本文探讨了高并发系统中Redis缓存击穿的问题及其解决方案。缓存击穿指大量请求同一未缓存数据,导致数据库压力过大。为解决此问题,可以采取以下策略:1) 热点数据永不过期,启动时加载并定期异步刷新;2) 写操作加互斥锁,保证并发安全并设置查询失败返回默认值;3) 预期热点数据直接加缓存,系统启动时加载并设定合理过期时间;4) 手动操作热点数据上下线,通过界面控制缓存刷新。这些方法能有效增强系统稳定性和响应速度。
255 0
|
6天前
|
消息中间件 缓存 NoSQL
Redis经典问题:缓存雪崩
本文介绍了Redis缓存雪崩问题及其解决方案。缓存雪崩是指大量缓存同一时间失效,导致请求涌入数据库,可能造成系统崩溃。解决方法包括:1) 使用Redis主从复制和哨兵机制提高高可用性;2) 结合本地ehcache缓存和Hystrix限流降级策略;3) 设置随机过期时间避免同一时刻大量缓存失效;4) 使用缓存标记策略,在标记失效时更新数据缓存;5) 实施多级缓存策略,如一级缓存失效时由二级缓存更新;6) 通过第三方插件如RocketMQ自动更新缓存。这些策略有助于保障系统的稳定运行。
306 1
|
6天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。