
Redis
文章平均质量分 56
Redis数据的学习手记
至学者
有道无术,术尚可求,有术无道,止于术!
展开
-
回顾Redis实现验证码功能
一 60s防刷功能//1、接口防刷String redisCode = stringRedisTemplate.opsForValue().get(SmsConstant.SMS_CODE_CACHE_PREFIX + phone);Boolean existKey = false;if (!StringUtils.isEmpty(redisCode)) { //活动存入redis的时间,用当前时间减去存入redis的时间,判断用户手机号是否在60s内发送验证码 long原创 2022-01-23 01:40:57 · 1495 阅读 · 0 评论 -
Redis的序列化配置
一 源码概述public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware { private boolean enableTransactionSupport = false; private boolean exposeConnection = false; private boolean ini原创 2021-08-02 08:55:52 · 3855 阅读 · 0 评论 -
Redis缓存常见问题
一 缓存雪崩reids缓存key同一时间大量失效,导致大量请求全部访问数据库,造成数据库压力过大宕机。解决方案: 设置缓存的不同过期时间,是的缓存不会在同一时间失效,导致所有的请求都直接访问数据库。 redis采用集群部署,将一些热点的key进行集群化部署,使得热点的key平均的分布在不同的redis系统中。 通过定时任务对缓存进行刷新缓存,同时将新的缓存设置失效时间。二 缓存穿透 指缓存和数据库中都没有的...原创 2021-08-01 16:02:04 · 147 阅读 · 0 评论 -
RedisTemplate之opsForValue简单使用与源码分析
一 概述对于开发来说,redis是常用的一个开源组件,这里简单的讲解一些基于RedisTemplate中的opsForValue对Redis的操作。二 基于RedisTemplate中的opsForValue对Redis的一些操作获取k(key对应的值)redisTemplate.opsForValue().get(Object k);将key 为 var1,value为var2的键值对存入redisredisTemplate.opsForValue().set(K var1,原创 2021-05-08 20:36:21 · 1477 阅读 · 0 评论 -
剖析Redis常用数据类型对应的数据结构
一 概述Redis是一种键值(Key-Value)数据库。相对于关系型数据库(如MySQL),Redis也被称作关系型数据库。像MySQL这样的关系型数据库,表结构比较复杂,包含的字段较多,可以通过SQL语句实现复杂的查询需求。而Redis中只包含“键”和“值”两部分,只能通过“键”来查询“值”。由于这种简单的存储结构,让Redis的读写效率非常高。除此之外,Redis主要是作为内存数据库来使用,也就是说,数据是存储在内存中的。尽管它经常被用作内存数据库,但是,它也支持将数据存储在硬盘中。Red原创 2020-10-13 10:57:39 · 226 阅读 · 0 评论 -
Redis有序集合中的跳表数据结构
一 概述跳表(Skip List)是一种各个方面性能都比较优秀的动态数据结构,它可以支持快速插入,删除,查找操作,写起来也不复杂。在Redis中的有序集合(Sorted Set)就是用跳表来实现的。二 跳表对于一个存储的数据是有序的链表来说,如果我们想要在该链表中查找某个数据,也必须从头到尾遍历链表,这样查询的效率就会很低,时间复杂度为O(n)。 为了提高查询效率,我们对链表建立一级"索引",查找起来就会快一些,每两个结...原创 2020-10-08 10:36:39 · 282 阅读 · 0 评论 -
Redis中的Pipeline
一 概述Redis中的Pipeline类似于Linux操作系统中的管道机制。二 Redis中Pipeline原理Redis基于请求/响应(Request/Response)模型,每个请求处理需要一一应答,当需要处理多条命令的时候,需要等待上一条命令应答之后,再执行之后命令的应答,此过程中不仅会存在很多来回交互的时间,而且会频繁的调用系统I/O,并发送网络请求。此时Pipeline就登场了,Pipeline支持一次执行多条命令,而不需要等待上一条命令的结果,客户端首先将需要执行的命令写入缓存中或者原创 2020-08-18 16:51:59 · 278 阅读 · 0 评论 -
Redis持久化方案之AOF
一 概述AOF(Append-Only-File)持久化,保持写状态,通过保持Redis的写状态来记录数据库的增量指令,RDB相当于备份数据库状态,而AOF是备份数据库接收到的指令,所有写入AOF中的命令都是以Redis的协议格式来保存,在AOF的持久化文件中,数据库会记录下所有变更数据库的命令,除了指定数据库的查询命令,其他的命令都是来自客户端请求,这些命令会以追加即(append)的形式保存在文件中。二 AOF配置与解析appendonly no //由Redis的配置可知,AOF持久化方原创 2020-08-18 16:37:57 · 227 阅读 · 0 评论 -
Redis的数据实现主从同步的机制
一 概述在Redis主从同步中,一般只有一个Master进行数据的写操作,而会有多个slave进行读操作,定期的数据备份也是通过一个单独的slave进行实现,使得Redis的性能能够最大程度发挥出来,为了支持数据的弱一致性和最终一致性,我们并不需要保证Master与Slave之间的数据是实时同步,但是在一段时间后它们保存的数据是趋于同步的,从而满足最终一致性。二 Redis主从同步的机制第一次同步到时候,主节点(Master节点)会执行一次BGSAVA操作,并将后续的修改操作记录到内存的缓存中,原创 2020-08-18 15:59:39 · 1240 阅读 · 0 评论 -
Redis实现集群的原理
一 概述在高并发的系统中当我们需要从海量的数据中快速找到所需符合要求的数据,我们可以按照某种规则对海量数据进行划分,将其分散存储在多个Reids服务结点上,从而通过实现数据分片来降低Redis服务当节点的压力。二 Redis集群Redis集群采用无中心结构,每个Redis服务器结点保存一定的数据和整个集群的状态,同时每个Redis服务器结点同其他服务器结点通过Gossip协议去传播信息,以及发现新增的Redis服务器结点,Redis集群的主要作用是将不同的key分散的存储于不同的Redis结点中原创 2020-08-18 15:24:28 · 394 阅读 · 0 评论 -
Copy-On-Write
一 概述Copy-On-Write,顾名思义为写时复制。二 Copy-On-Write的实现系统调用fork()系统调用创建进程,linux中的fork()系统调用实现Copy-on-Write写时复制,一般情况下,fork()系统调用会在创建子进程时,会将资源全部复制给子进程,这样效率比较低,而且有些资源对子进程没有用处。所以为了降低创建子进程的成本,Linux优化了fork()函数的实现方式,当父进程创建子进程时,内核只为子进程创建虚拟空间,且父子进程使用的时相同的物理空间,只有父子进程修改原创 2020-08-18 12:30:02 · 603 阅读 · 0 评论 -
Redis持久化方案之RDB
一 概述RDB(Redis DataBase),RDB持久化方案保存某个时间点的全量数据快照写入磁盘,也是老版本中的默认持久化方式,它将内存中的数据以快照的方式写入二进制文件(默认文件名为dump.rdb)。二 Redis中RDB的相关配置快照保存策略:save 900 1 //该配置为Redis在900秒内存在如果一次写入操作(set操作)就会保存一次快照 save 300 10 //该配置为Redis在300秒内存在如果写入操作(set操作)达到十次就会保存一次快照,否则执行1 s原创 2020-08-18 12:13:32 · 287 阅读 · 0 评论 -
Gossip协议
一 概述Gossip 算法又被称为反熵(Anti-Entropy),熵是物理学上的一个概念,代表杂乱无章,而反熵就是在杂乱无章中寻求一致,这充分说明了 Gossip 的特点:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节可以通过网络连通,最终他们的状态都是一致的,当然这也是疫情传播的特点。简单的描述下这个协议,首先要传播谣言就要有种子节点。种子节点每秒都会随机向其他节点发送自己原创 2020-08-17 22:59:57 · 196 阅读 · 0 评论 -
Redis实现异步队列
一 概述异步是指,当前线程执行的时间比较长,在这段时间过程中,可以完成其他工作。二 Redis实现异步队列可以利用Redis中的List作为队列的数据结构,RPUSH生产消息,LPOP消费消息。RPUSH key value //在列表的尾部插入数据LPOP key //从头部衣出数据注意,LPOP命令没有任何消息返回时,说明队列中的消息已经被消费完毕,且RPUSH还没有及时生产新消息。面对此过程的时候,我们可以通过应用层引入Sleep机制去调用LPOP重试。BLPOP k原创 2020-08-16 22:47:00 · 1930 阅读 · 0 评论 -
通过Redis实现分布式锁
一 概述在分布式系统环境中,一个方法在同一时间只能被一个机器的一个线程执行。所以系统中应设计出高可用的获取锁与释放锁,高性能的获取锁与释放锁,具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误),具备锁失效机制,防止死锁。二 Redis实现分布式锁锁的特性:互斥性:任意时刻只能有一个客户端获取锁,不能存在两个客户端获取锁 安全性:锁只能由持有锁的客户端删除,不能由其他客户端删除 防死锁:获取锁的客户端由于某种原因而宕机,未能释放锁,其他客户端也无法获取该锁,从而原创 2020-08-16 22:14:20 · 176 阅读 · 0 评论 -
从海量key中查询出某一固定前缀的key
一 概述在此我想提一个问题:从海量的key中查询出以某一固定前缀的key中的海量数据指的具体范围是是多小,即具体的数据规模或者是数据的边界是什么。二 比较容易得到的方案通过KEYS pattern来查找所有符合给定模式pattern的key,这个我们是可以得到想要的结果的,而且KEYS指令会一次性返回所有匹配的key,使用KEYS命令查询大量的key会对正在运行的业务造成影响,因为一次性返回数量过大的时候会使得服务变得卡顿。三 利用SCAN增量式迭代命令解决问题SCAN cursor原创 2020-08-16 21:38:37 · 411 阅读 · 0 评论 -
Redis支持的基本数据结构以及常用操作
一 概述Redis是目前较为主流的NoSQL数据库,它不仅仅支持简单的key-value类型的数据,同时还提供了String,List,hash,set,zset等数据结构的存储。二 不同数据类型的CURD操作1 Stringset key value //设置指定key的值,或者将key之前指定的值修改为当前值 get key //获取指定key的值 2 Hashhset key field value//将哈希表ke...原创 2020-08-16 18:41:31 · 160 阅读 · 0 评论 -
多路I/O复用模型
一 概述让应用程序可以同时对多个I/O端口进行监控以判断于其有关的操作是否可以进行,从而达到时间复用目的,例如:监控来自10条不同火车路线(I/O端口)是否有列车到达(即是否可读),那么需要10个人(相当于10个线程或10处代码)来完成这项任务。如果利用某种技术(如摄像监控技术)将10条路线的情况监控情况统一传达至某一点(如监控室),那么就只需要一个人(一条线程)在监控室就可监控10条路线的列车情况。类似于select或者epoll这样的多路I/O复用机制就如同摄像头,它们能够将多个I/O端口的状况反馈原创 2020-08-16 17:01:20 · 1477 阅读 · 0 评论 -
Redis线程与性能概述
一概述Redis可以达到100000+的QPS(Query per second,每秒查询次数)。查看Redis源码可知,Redis是基于C语言实现的NoSQL数据库,绝大部分请求是存粹的内存操作,读写的时候不会受到磁盘读写I/O性能的限制。类似于HashMap,HashMap的查询和存储的时间复杂度均为O(1)。二 Redis的底层数据结构Redis中的5种数据类型分别为String,List,Hash,set,zset(有序集合),每种数据类型基于底层数据类型进行构造。三 Redis原创 2020-08-16 13:12:11 · 188 阅读 · 0 评论 -
缓存架构及Memcache,Redis的比较
一 概述缓存架构的存在使得客户端访问服务端时的速度得到很大的改进,因为当客户端向服务端发送请求的时候,先向缓存层发送请求,如果请求的数据存在于缓存中,则直接将其返回。如果缓存中没有对应的数据就会实现缓存穿透,去存储层查询,当在存储层查询到数据后会回写到缓存层,以便下次可以在缓存层查询相同信息,同时返回给客户端。当存储器无法响应客户端发送的请求的时候,会触发熔断机制,即客户端访问服务端时,无论是否有数据都会直接返回,保证服务的可用性。二 常见的缓存架构图三 常见的缓存方案在实际看法的过程中原创 2020-08-16 11:04:36 · 255 阅读 · 0 评论 -
Redis如何存储对象
一 概述Redis中String类型是组基本的数据类型,最大值可以存储512M的数据,同时String是二进制安全的,也就是说Redis中的String可以包含任何数据,如jpg图片或者序列化的对象。Redis是基于内存中的数据进行操作。二 Redis保存对象的结构Redis底层是由C语言编写的,但是其并没有使用C语言传统的字符串表示(即以空字符\0结尾的字符数组)。而是自己构建了一种名为简单动态字符串(SimpleDynamicString,SDS)的抽象类型,并将SDS用作Redis的默认字原创 2020-08-15 22:30:43 · 2989 阅读 · 4 评论