redis
文章平均质量分 78
韩未零
这个作者很懒,什么都没留下…
展开
-
redis || 内存策略
Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。当内存使用达到上限时,就无法存储更多数据了。为了解决这个问题,Redis提供了一些策略实现内存回收:-- 内存过期策略-- 内存淘汰策略。原创 2023-09-08 23:07:46 · 80 阅读 · 0 评论 -
redis || 通信协议
Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub):-- 客户端(client)向服务端(server)发送一条命令-- 服务端解析并执行命令,返回响应结果给客户端因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。而在Redis中采用的是RESP(Redis Serialization Protocol)协议:1. Redis 1.2版本引入了RESP协议。原创 2023-09-08 22:49:38 · 201 阅读 · 0 评论 -
redis || 网络模型
select模式存在的三个问题:1. 能监听的FD最大不超过10242. 每次select都需要把所有要监听的FD都拷贝到内核空间3. 每次都要遍历所有FD来判断就绪状态poll模式的问题:-- poll利用链表解决了select中监听FD上限的问题,但依然要遍历所有FD,如果监听较多,性能会下降。epoll模式中如何解决这些问题的?1. 基于epoll实例中的红黑树保存要监听的FD,理论上无上限,而且增删改查效率都非常高。原创 2023-09-08 22:24:55 · 31 阅读 · 0 评论 -
redis || 数据结构(五种数据类型)
String是Redis中最常见的数据存储类型:-- 其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。-- 如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。-- 如果存储的字符串是整数值,并且大小在LONG_MAX范围内,则会采用INT编码:直接将数据保存在RedisObject的ptr指针位置(刚好8字节),不再需要SDS了。原创 2023-09-08 21:37:06 · 54 阅读 · 0 评论 -
redis || 数据结构(QuickList、SkipList、RedisObject)
问题1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办?为了缓解这个问题,我们必须限制ZipList的长度和entry大小。问题2:但是我们要存储大量数据,超出了ZipList最佳的上限该怎么办?我们可以创建多个ZipList来分片存储数据。问题3:数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系?Redis在3.2版本引入了新的数据结构QuickList,它是一个双端链表,只不过链表中的每个节点都是一个ZipList。原创 2023-09-08 18:17:28 · 41 阅读 · 0 评论 -
redis || 数据结构(dict、ZipList)
Dict的结构:-- 类似java的HashTable,底层是数组加链表来解决哈希冲突-- Dict包含两个哈希表,ht[0]平常用,ht[1]用来rehashDict的伸缩:1、当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时,Dict扩容2、当LoadFactor小于0.1时,Dict收缩3、扩容大小为第一个大于等于used + 1的2^n4、收缩大小为第一个大于等于used 的2^n。原创 2023-09-08 18:00:49 · 34 阅读 · 0 评论 -
redis || 数据结构(SDS、IntSet)
我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:1、获取字符串长度的需要通过运算2、非二进制安全3、不可修改Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS。那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含“jack”的SDS。原创 2023-09-08 17:27:17 · 38 阅读 · 0 评论 -
redis || 服务端优化
Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销。原创 2023-09-08 16:34:09 · 26 阅读 · 0 评论 -
redis || 批处理优化
一次命令的响应时间 = 1次往返的网络传输耗时 + 1次Redis执行命令耗时。原创 2023-09-08 16:09:41 · 35 阅读 · 0 评论 -
redis || 键值设计
BigKey通常以Key的大小和Key中成员的数量来综合判定,例如:-- Key本身的数据量过大:一个String类型的Key,它的值为5 MB。-- Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。-- Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1,000个但这些成员的Value(值)总大小为100 MB。推荐值: 单个key的value小于10KB;原创 2023-09-08 15:58:03 · 37 阅读 · 0 评论 -
redis || 消息队列
STREAM类型消息队列的XREADGROUP命令特点:-- 消息可回溯-- 可以多消费者争抢消息,加快消费速度-- 可以阻塞读取-- 没有消息漏读的风险-- 有消息确认机制,保证消息至少被消费一次。原创 2023-09-08 15:19:05 · 45 阅读 · 0 评论 -
redis || Redisson
不可重入Redis分布式锁:- 原理:利用setnx的互斥性;利用ex避免死锁;释放锁时判断线程标示- 缺陷:不可重入、无法重试、锁超时失效可重入的Redis分布式锁:- 原理:利用hash结构,记录线程标示和重入次数;利用watchDog延续锁时间;利用信号量控制锁重试等待- 缺陷:redis宕机引起锁失效问题Redisson的multiLock:- 原理:多个独立的Redis节点,必须在所有节点都获取重入锁,才算获取锁成功- 缺陷:运维成本高、实现复杂。原创 2023-09-08 14:36:25 · 20 阅读 · 0 评论 -
redis || 分布式锁
基于Redis的分布式锁实现思路:- 利用set nx ex获取锁,并设置过期时间,保存线程标示- 释放锁时先判断线程标示是否与自己一致,一致则删除锁特性:- 利用set nx满足互斥性- 利用set ex保证故障时锁依然能释放,避免死锁,提高安全性- 利用Redis集群保证高可用和高并发特性。原创 2023-09-08 12:02:49 · 50 阅读 · 0 评论 -
redis || 缓存
缓存更新策略的最佳实践方案:低一致性需求:使用Redis自带的内存淘汰机制高一致性需求:主动更新,并以超时剔除作为兜底方案读操作:缓存命中则直接返回缓存未命中则查询数据库,并写入缓存,设定超时时间写操作:先写数据库,然后再删除缓存要确保数据库与缓存操作的原子性。原创 2023-09-07 21:22:37 · 26 阅读 · 0 评论 -
redis || 事务
Redis事务(Transaction)通过将多个Redis操作封装为一个原子性的操作序列,确保在事务执行过程中,不会受到其他客户端的干扰。从而在保证数据一致性的同时,协调并发,提高数据操作的效率和性能。Redis 事务实际开发中使用的非常少,功能比较鸡肋,不要将其和我们平时理解的关系型数据库的事务混淆了。除了不满足原子性和持久性之外,事务中的每条命令都会与 Redis 服务器进行网络交互,这是比较浪费资源的行为。原创 2023-09-07 21:05:59 · 16 阅读 · 0 评论 -
redis || Canal
Canal [kə'næl],译意为水道/管道/沟渠。canal是阿里巴巴旗下的一款开源项目,基于Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。GitHub的地址:https://github.com/alibaba/canalCanal是基于mysql的主从同步来实现的。MySQL主从同步的原理1. MySQL master 将数据变更写入二进制日志( binary log),其中记录的数据叫做binary log events。原创 2023-09-07 18:28:28 · 28 阅读 · 0 评论 -
redis || 缓存同步
大多数情况下,浏览器查询到的都是缓存数据,如果缓存数据与数据库数据存在较大差异,可能会产生比较严重的后果。所以我们必须保证数据库数据、缓存数据的一致性,这就是缓存与数据库的同步。缓存数据同步的常见方式有三种:1、设置有效期:给缓存设置有效期,到期后自动删除。再次查询时更新优势:简单、方便缺点:时效性差,缓存过期之前可能不一致场景:更新频率较低,时效性要求低的业务2、同步双写:在修改数据库的同时,直接修改缓存优势:时效性强,缓存与数据库强一致缺点:有代码侵入,耦合度高;原创 2023-09-07 17:57:03 · 29 阅读 · 0 评论 -
redis || 缓存预热
冷启动:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。我们数据量较少,可以在启动时将所有数据都放入缓存中。原创 2023-09-07 17:47:11 · 105 阅读 · 0 评论 -
redis || OpenResty®使用
请求地址是localhost,端口是80,就被windows上安装的Nginx服务给接收到了。OpenResty的很多功能都依赖于其目录下的Lua库,需要在nginx.conf中指定依赖库的目录,并导入依赖。windows上的nginx用来做反向代理服务,将前端的查询商品的请求代理到OpenResty集群。我们需要在OpenResty中编写业务,查询商品数据并返回到浏览器。但是这次,我们先在OpenResty接收请求,返回假的商品数据。在lua文件夹下,新建文件:item.lua。原创 2023-09-07 17:29:00 · 30 阅读 · 0 评论 -
redis || OpenResty®
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。原创 2023-09-07 16:32:24 · 25 阅读 · 0 评论 -
redis || Lua
function 函数名( argument1, argument2..., argumentn)-- 函数体return 返回值end例如:定义一个函数(打印数组)endend。原创 2023-09-07 15:47:04 · 21 阅读 · 0 评论 -
redis || 实现JVM进程缓存
利用Caffeine实现下列需求:1、给根据id查询商品的业务添加缓存,缓存未命中时查询数据库2、给根据id查询商品库存的业务添加缓存,缓存未命中时查询数据库3、缓存初始大小为1004、缓存上限为10000。原创 2023-09-07 14:58:18 · 24 阅读 · 0 评论 -
redis || 本地进程缓存和 Caffeine
Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。Caffeine相当于一个缓存工厂,可以创建出多个缓存实例 Cache。这些缓存实例都继承了 Caffeine 的参数配置,Caffeine 是如何配置的,这些缓存实例就具有什么样的特性和功能。Caffeine 是目前性能最好的本地缓存,目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine。原创 2023-09-07 14:47:33 · 275 阅读 · 0 评论 -
redis || 多级缓存
传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题:1、请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈2、Redis缓存失效时,会对数据库产生冲击。原创 2023-09-07 14:22:16 · 30 阅读 · 0 评论 -
redis || 散列插槽、集群伸缩、故障转移、数据迁移
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上。原创 2023-09-07 12:28:21 · 95 阅读 · 0 评论 -
redis || 分片集群
Redis 分片集群是一种将 Redis 数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性。在分片集群中,数据被分为多个片段,每个片段存储在不同的节点上,这些节点可以是物理服务器或虚拟服务器。Redis 分片集群的主要目的是将数据分布在多个节点上,以便可以通过并行处理来提高读写吞吐量。每个节点负责处理一部分数据,并且在需要时可以进行扩展以适应更多的负载。此外,分片集群还提供了故障容错和高可用性的功能,即使其中一个节点发生故障,其他节点仍然可以继续工作。原创 2023-09-05 20:59:11 · 165 阅读 · 0 评论 -
redis || 搭建哨兵集群
搭建三个节点形成sentinel集群,来监控redis集群。原创 2023-09-05 18:21:35 · 84 阅读 · 0 评论 -
redis || 哨兵的作用和原理
Redis提供了Sentinel哨兵机制来解决master节点宕机问题。原创 2023-09-05 17:34:12 · 33 阅读 · 0 评论 -
redis || 主从复制
主从第一次同步是全量同步。原创 2023-09-05 17:07:30 · 26 阅读 · 0 评论 -
redis || 持久化
1. 数据丢失问题Redis是内存存储,服务重启可能会丢失数据2.并发能力问题单节点Redis并发能力虽然不错,但也无法满足如双11这样的高并发场景3.故障恢复问题如果Redis宕机,则服务不可用,需要一种自动的故障恢复手段4.存储能力问题Redis基于内存,单节点能存储的数据量难以满足海量数据需求。原创 2023-09-05 16:30:21 · 22 阅读 · 0 评论 -
redis || 数据类型(hash、list、set、sortedset)
hash类型,也叫散列,其value是一个无序字典string结构是将对象序列化为json字符串后存储,当需要修改对象某个字段时很不方便hash结构可以将对象中的每个字段独立存储,可以针对单个字段做crud。原创 2023-08-29 15:43:12 · 38 阅读 · 0 评论 -
redis || 通用命令和数据类型(string)
也就是字符串类型,是redis中最简单的存储类型。redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下。不管是那种格式,底层都是字节数组成形式存储,只不过是编码方式不同。keys:查看符合模板的所有key,不建议在生产环境设备上使用。这个格式并非固定,也可以根据自己的需求来删除或添加词条。给一个key设置有效期,有效期到期时key会被自动删除。float:浮点类型,可以做自增、自减操作。int:整数类型,可以做自增、自减操作。查看一个key的剩余有效期。删除一个指定的key。原创 2023-08-29 11:54:56 · 26 阅读 · 0 评论 -
redis || 基本操作
redis默认有16个数据库默认使用的是第0个;可以使用select进行切换数据库清除当前数据库的内容 flushdb清除全部数据库的内容 flushall。原创 2023-08-28 22:15:16 · 30 阅读 · 0 评论 -
redis || redis-benchmark
redis-benchmark是官方自带的Redis性能测试工具,用来测试Redis在当前环境下的读写性能。在使用Redis的时候,服务器的硬件配置、网络状况、测试环境都会对Redis的性能有所影响,我们需要对Redis实时测试以确定Redis的实际性能。原创 2023-08-28 20:56:03 · 500 阅读 · 0 评论 -
redis || 命令行客户端和图形化界面客户端
语法常见的options-h 172.16.3.152 #指定要连接的redis节点的ip地址,默认是127.0.0.1-p 6379 # 指定端口号-a 123456 # 指定密码ping #与redis服务端做心跳测试,服务端正常会返回pong。原创 2023-08-28 20:47:47 · 192 阅读 · 0 评论 -
redis || 简介和安装
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。Redis是一种键值型的NoSql数据库,这里有两个关键字:- 键值型- NoSql其中**键值型**,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json。除了上述四点以外,在存储方式、扩展性、查询性能上关系型与非关系型也都有着显著差异,总结如下:- 存储方式- 关系型数据库基于磁盘进行存储,会有大量的磁盘IO,对性能有一定影响。原创 2023-08-28 18:34:49 · 36 阅读 · 0 评论