当前位置: 首页 > news >正文

Redis入门概述

Redis 概述

Redis 是速度非常快的非关系型(NoSQL)基于内存键值数据库。

键的类型只能为字符串,值可以支持五种数据类型:字符串(stirng)、列表(list)、集合(set)、散列表(hash)、有序集合(zset)。

Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能

Redis 除了做缓存之外,也经常用来做分布式锁,甚至是消息队列。

Redis & Memcached

分布式缓存主要解决的是单机缓存的容量受服务器限制并且无法保存通用信息的问题。

分布式缓存兴起时,比较常用的是 Memcached。随着 Redis 的发展,大家慢慢都转而使用更加强大的 Redis 了。现在基本没有看过还有项目使用 Memcached 来做缓存了。

两者相同点:

  • 都是基于内存的非关系型内存键值数据库,一般都用来当做缓存使用。
  • 都有过期策略
  • 性能都非常高

主要有以下不同:

  • 数据类型:

    Memcached 仅支持字符串类型,而 Redis 支持五种不同的数据类型,可以更灵活地解决问题。

  • 线程模型:

    Memcached 是多线程,非阻塞 IO 复用的网络模型,而 Redis 使用单线程的多路 IO 复用模型。

  • 删除策略:

    Memcached 过期数据的删除策略只用了惰性删除,而 Redis 同时使用了惰性删除与定期删除。

  • 数据持久化:

    Redis 支持两种持久化策略:RDB 快照和 AOF 日志,而 Memcached 不支持持久化。

  • 分布式:

    Memcached 不支持分布式,只能通过在客户端使用一致性哈希来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。

    Redis Cluster 实现了分布式的支持。

  • 内存管理机制

    • 在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘,而 Memcached 的数据则会一直在内存中。
    • Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。

使用场景

计数器

可以对 String 进行自增自减运算,从而实现计数器功能。

Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

缓存

将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。

查找表

例如 DNS 记录就很适合使用 Redis 进行存储。

查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。

分布式锁实现

在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。

可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。

其它业务场景

Bitmap 可以实现统计统计活跃用户等功能。

Set 可以实现交集、并集等操作,从而实现共同好友等功能。

ZSet 可以实现有序性操作,从而实现排行榜等功能。

使用 Redis 缓存的好处

高性能

假如用户第一次访问数据库中的某些数据的话,这个过程是比较慢,毕竟是从硬盘中读取的。但如果用户访问的数据属于高频数据并且不会经常改变的话,那么我们就可以很放心地将该用户访问的数据存在缓存中。

可以保证用户下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。不过,要保持数据库和缓存中的数据的一致性。 如果数据库中的对应数据改变的之后,需要同步改变缓存中相应的数据。

高并发

一般像 MySQL 这类的数据库的 QPS(Query Per Second,服务器每秒可以执行的查询次数)大概都在 1w 左右(4 核 8g) ,使用 Redis 缓存之后很容易达到 10 w+,甚至最高能达到 30 w+(单机 Redis 的情况,Redis 集群的话会更高)。

由此可见,直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库,也就提高了系统整体的并发。

本文由 mdnice 多平台发布

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vulnhub之serial
  • 工作中,如何有效解决“冲突”?不回避,不退让才是最佳方式
  • 盘点Hutool6.0中新增的那些方法(上)
  • Day6
  • 缓冲流练习
  • js第二天
  • 最强开源文生图模型一夜易主!SD一作、Stabililty AI核心成员Robin Rombach下场创业了,一出手就是王炸。
  • Python 爬虫项目实战(一):爬取某云热歌榜歌曲
  • E23.【C语言】练习:不创建第三个变量实现两个整数的交换
  • 锂电池生产工艺数字化的业务架构.pptx
  • 可视化图表与源代码显示的动态调整
  • vite静态资源处理,处理vite项目中src和url路径问题
  • DedeCMS-V5.7.82-UTF8织梦
  • 复现一下最近学习的漏洞(sqlab 1-10)
  • 速盾:爬虫攻击和cc攻击的区别是什么?
  • Consul Config 使用Git做版本控制的实现
  • css属性的继承、初识值、计算值、当前值、应用值
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JSDuck 与 AngularJS 融合技巧
  • js如何打印object对象
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • nodejs:开发并发布一个nodejs包
  • python大佬养成计划----difflib模块
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 安卓应用性能调试和优化经验分享
  • 从0到1:PostCSS 插件开发最佳实践
  • 电商搜索引擎的架构设计和性能优化
  • 软件开发学习的5大技巧,你知道吗?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 以太坊客户端Geth命令参数详解
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 大数据全解:定义、价值及挑战
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (35)远程识别(又称无人机识别)(二)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (四)Controller接口控制器详解(三)
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)shell调试方法
  • (转)我也是一只IT小小鸟
  • .gitignore
  • .htaccess配置重写url引擎
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 使用配置文件
  • .netcore如何运行环境安装到Linux服务器
  • .net反编译工具
  • .net分布式压力测试工具(Beetle.DT)