![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
SONNIE在路上
韶华易逝
展开
-
谈谈布隆过滤器的原理和实现
谈谈布隆过滤器(Bloom Filter)?我们都知道布隆过滤器对于缓存穿透是一个很好的解决方案。那什么是布隆过滤器呢?布隆过滤器是一个用一定的误判率来换取空间效率的概率性数据结构。它本身是一个很长的二进制数组,只存储0和1,主要用于判断某个元素是否存在:0代表不存在,1代表存在。布隆过滤器存入数据的过程1.通过K个哈希函数计算,然后返回K个已经计算出的hash值;2.这这K个hash值映射到对应的二进制数组的下标;3.将这K个下标对应的二进制数据改成1。布隆过滤器查询数据的过程1.原创 2021-04-18 20:16:15 · 390 阅读 · 0 评论 -
Redis和Memcached的简单对比
Redis和Memcached的对比Redis相比Memcache要有更多的数据类型,支持更丰富的数据操作;Redis6.0之前是单线程,而Memcache是多线程,因此,Redis在存储小数据时候性能要比Memcache更高;Memcache没有原生的集群模式,需要依靠客户端来实现集群中分片写入数据,但Redis是原生支持集群的。...原创 2021-05-04 18:11:45 · 49 阅读 · 0 评论 -
Redis如何实现延时队列?
Redis如何实现延时队列?使用ZSet,拿时间戳作为score,消息内容作为key,调用zadd来生产消息,消费者用zrangebyscore指令获取指定时间之前的数据轮询进行处理。原创 2021-04-08 17:57:56 · 213 阅读 · 0 评论 -
如何使用Redis实现异步队列?
如何使用Redis实现异步队列?一般使用list作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。对方追问可不可以不用sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。对方追问能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。对方追问pub/sub有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。...原创 2021-04-08 17:55:49 · 287 阅读 · 0 评论 -
Redis里面有1亿个google的guava包来实现了核心算法,key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?
Redis里面有1亿个google的guava包来实现了核心算法,key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?可以使用keys指令扫出指定格式的key列表。对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?这个时候你要回答redis关键的一个特性:redis是单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定格式的k原创 2021-04-08 17:50:35 · 105 阅读 · 0 评论 -
缓存雪崩&缓存穿透&缓存击穿
1.缓存雪崩缓存雪崩是指缓存同一时间大面积的失效,而查询数据量巨大,造成数据库压力过大而崩掉。解决方案基于不同的业务数据,设置不同的超时时间;对于并发量不是特别大的地方,使用加锁排队;对于业务数据量不是很大的场景,可以设置缓存数据为永久存储2.缓存穿透缓存穿透是指用户不断请求缓存和数据库中都没有的数据,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。解决方案接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直原创 2021-04-08 17:45:43 · 55 阅读 · 0 评论 -
Redis事务是否支持原子性?
Redis事务是否支持原子性?因为 Redis 事务不支持事务回滚机制,所以如果事务执行中出现了命令执行错误(例如对 String 类型的key执行 LPUSH 操作),只会返回当前命令执行的错误给客户端,并不会影响下面命令的执行。因此很多人就觉得和关系型数据库(MySQL) 不一样,所以大家认为 Redis 事务不支持原子性。但其实Redis意义上支持原子性的。正常情况下,它也是要不所有命令执行成功,要不一个命令都不执行。即使 Redis 不支持事务回滚机制,但是它会检查每一个事务中的命令是否错误。原创 2021-04-08 17:32:16 · 1754 阅读 · 0 评论 -
Redis事务是否支持Rollback机制?
Redis事务是否支持Rollback机制?不支持。首先,MySQL 和 Redis 的定位不一样,一个是关系型数据库,一个是 NoSQL。MySQL 的 SQL 查询是可以相当复杂的,而且 MySQL 没有事务队列这种说法,SQL 真正开始执行才会进行分析和检查,MySQL 不可能提前知道下一条 SQL 是否正确。所以支持事务回滚是非常有必要的。但是,Redis 使用了事务队列来预先将执行命令存储起来,并且会对其进行格式检查的,提前就知道命令是否可执行了。所以如果只要有一个命令是错误的,那么这个事原创 2021-04-08 17:29:58 · 149 阅读 · 0 评论 -
Redis事务是如何实现的?
Redis事务是如何实现的?Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个命令实现的。1)MULTI:用于开启一个事务,它总是返回OK。 MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令会被放到队列中;2)EXEC:当EXEC命令被调用时,队列中的命令才会被执行;按命令执行的先后顺序排列。 当操作被打断时,返回空值。3)DISCARD:调用DISCARD,客户端可以清空事务队列,并放弃执行事务, 客户端会从事务状态中退出。4)WA原创 2021-04-08 17:22:03 · 660 阅读 · 0 评论 -
Redis线程模型
Redis线程模型1.文件事件处理器File Event Handler,文件事件处理器是Redis基于reactor模式开发的网络事件处理器。文件处理器由4部分组成,分别是多个套接字,IO多路复用程序,文件事件分派器,事件处理器。由于文件事件分派器队列的消费是单线程的,所以Redis被叫做单线程模型。2.消息处理流程文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据这个套接字所执行的任务来为套接字关联不同的事件处理器。当被监听的套接字准备好执行应答、读取、写入、关闭等操作时,与操原创 2021-04-08 17:15:02 · 62 阅读 · 0 评论 -
Redis内存相关问题
1.生产上redis内存设置为多少比较合适?由于Redis底层借鉴了哈希算法,因此推荐将内存设置为物理内存的四分之三。2.如何配置、修改redis的内存大小?通过修改文件配置(永久生效):修改 maxmemory 字段,单位为字节通过命令修改(重启失效):config set maxmemory 104857600 设置 redis 最大占用内存为 100MB,config get maxmemory 获取 redis 最大占用内存3.如何通过命令查看 redis 内存使用情况?通过 i原创 2021-04-08 16:43:08 · 532 阅读 · 0 评论 -
Redis如何删除设置了过期时间的key?
Redis如何删除设置了过期时间的key?问:如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中被被删除呢?如果回答是,那么面试官就会问你:????自己走还是我送你?其实Redis对于过期key共有三种不同的删除策略:定时删除,惰性删除,定期删除;1.定时删除定时删除可以保证内存中数据的最大新鲜度,因为它会将过期的键值立马删掉,其所占用的内存也随即释放,但这样恰恰对于CPU而言是不友好的,原因是删除操作会占用CPU的时间,如果刚好碰上CPU繁忙的时候,就会给CPU造成额外的负担,从而产生原创 2021-04-08 16:29:28 · 541 阅读 · 0 评论 -
谈谈Redis的持久化机制?
谈谈Redis的持久化机制?因为Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,一旦服务器进程退出,服务器中的数据库状态也会随之消失,因此Redis提供了两种持久化机制:RDB、AOF。RDB在指定时间周期内把内存中的数据集快照保存到硬盘的二进制文件中,对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。执行流程:Redis会单独创建一个子进程来进行持久化,然后先将内存中的数据集写入到一个临时文件中,等到持久化完成之后,再替换上次持久化好的文件,然后原创 2021-04-07 22:12:40 · 161 阅读 · 2 评论 -
Redis常用数据类型及其应用场景
Redis常用数据类型及其应用场景String字符类型利用其自增自减运算,从而实现计数器功能应用场景: 文章阅读量、点赞数和在看数List列表类型List 可以作为一个双向链表,通过 rpush和 lpop 写入和读取消息应用场景:使用List做异步队列,rpush生产消息,lpop消费消息,当lpop没有消息时,可以sleep一段时间,然后检查有没有消息,或者也可以使用blpop,在没有消息的情况下,一直阻塞直到有消息进来。Set无序集合类型Set 可以实现交集、并集等操作应用场景原创 2021-04-07 22:09:56 · 141 阅读 · 0 评论 -
为什么要使用 Redis?Redis为什么这么快?
1.为什么要使用 Redis?主要从高并发、高性能两个层面看待这个问题。高并发直接操作缓存能够承受的请求压力是远远大于直接访问数据库的;高性能用户第一次访问数据库中的某些数据,由于是从硬盘上读取的,这个过程会比较慢。如果将用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,因此速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!2.Redis为什么这么快?Redis完全基于内存,非常快速;采用原创 2021-04-07 22:04:22 · 129 阅读 · 0 评论 -
Redis——单线程?多线程?
1.Redis是单线程还是多线程的?Redis6.0之前是单线程的,6.0是多线程的。其实严格来说,Redis6.0之前也并非只有一个线程,只是Redis在处理客户端请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都是由一个串行的主线程来处理,这就是所谓的“单线程”。但它的其他功能比如持久化,异步删除,集群同步都是采用额外的线程来完成的。2. Redis6.0之前为什么一直不使用多线程?使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内原创 2021-04-07 21:57:57 · 356 阅读 · 0 评论 -
什么是Redis?简述它的优缺点?
什么是Redis?简述它的优缺点?Redis(全称是:Remote Dictionary Server)是一个开源的Key-Value类型的高性能缓存数据库,整个数据库全部加载在内存中进行操作;支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;支持多种数据类型;支持master-slave 模式的数据备份。优点由于是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作;支持丰富的数据类型Redis 单个操作是原子性的;多个操作支持事务(原创 2021-04-07 21:45:45 · 2642 阅读 · 0 评论 -
Redis集成Mybatis实现分布式缓存
缓存1.1什么是缓存?缓存就是存在于计算机内存中的一段数据;针对于我们的程序而言,缓存就是存在于JVM(JVM也存在于内存中)中的一段数据。1.2缓存/内存中数据的特点a、读写快b、断电既失1.3使用缓存的好处a、提高网站响应速度,优化网站的运行b、减轻访问数据库时给数据库带来的压力1.4缓存的应用环境缓存一般应用于查询较多,增删极少的业务领域1.5项目中开发缓存模块项目结构[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tgv5o9xq-16063原创 2020-11-25 22:23:32 · 197 阅读 · 0 评论