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

Redis及其他缓存

    1.NOSQL、Redis概述,通用命令,redis五大数据类型,三大特殊数据类型

              NOSQL概述:

                     (NOT ONLY SQL-不仅仅是SQL),泛指非关系型数据库,为解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用问题

                     常见nosql:redis,hbase。

                     和关系型数据的对比区别:数据之间没有关联关系,数据存储在内存中,操作数据相对较快。关系型数据库数据之间存在关联关系,数据存储在磁盘中,操作数据非常耗时。

                     优点:成本低、查询速度快、支持多种数据格式(基本数据类型、集合、对象、图片、文档等格式)、扩展性相对关系型数据库较好。

                     非关系型数据库优势:复杂查询较方便,事务的支持导致安全性很高。

                     总结:关系型数据库和非关系型数据库并非对立而是互补的关系,从而弥补对方的劣势。一般将数据存储在关系型数据库中,非关系型数据库中备份关系型数据库的数据(热点数据、高频访问且不常修改的数据)。

                     主流的nosql:

                            key-value存储数据库:redis。典型用于内容缓存,处理大量数据的高访问负载

                            列存储数据库:Hbase。典型用于分布式的文件系统

                            文档型数据库:Mongdb。典型用于web应用

                            图形数据库:Neo4J。典型用于社交网络

              Redis概述:

                     C语言开发的高性能键值对数据库,在内存中就是一个Map集合。支持多种键值数据类型。key为字符串,value可是任意类型。

                     value类型分类:

                            字符串类型-String:Map<String,String>

                            散列类型-hash:Map<String,Map<String,String>>

                            列表类型-list:Map<String,List<String>> 数据可重复

                            集合类型-set:Map<String,Set<String>>   数据不可重复

                            有序集合类型-sortedset:Map<String,sortedset<String>> 数据不可重复,支持排序

                     应用场景:缓存、聊天室好友在线列表、任务队列(秒杀、抢购、12306抢票)、应用排行榜、网站访问统计、数据过期处理、分布式集群架构中session分离

                     相关指令

                            数据库操作指令:

                                   启动redis,默认16个库(编号从0至15),select 编号 选择指定库

                                   清空当前库:FLUSHDB

                                   清空全部库:FLUSHALL

                                   客户端显示中文:./redis-cli -p 700 --raw

                            操作key相关指令:

                                   DEL KEY[KEY...] 删除单个或多个Key,返回删除数量,不存在的key忽略

                                   EXISTS KEY;判断key是否存在,存在返回1,否则返回0

                                   EXPIRE KEY seconds;为key设置生存时间,秒为单位,生存时间为0自动删除。成功返回1

                                   KEYS PATTERN;查找符合pattern的key

                                   MOVE KEY DB;将Key移动到指定db中

                                   PEXPIRE KEY milliseconds;为key设置生存时间,毫秒为单位。成功返回1,否则返回0

                                   PEXPIREAT KEY milliseconds-timestap;为Key设置生存时间,以毫秒为单位设置过期的时间戳

                                   TTL KEY ;以秒为单位,返回指定key的剩余存活时间

                                   PTTL KEY ;以毫秒为单位,返回指定key的剩余存活时间

                                   RANDOMKEY;随机返回一个key

                                   RENAME KEY NEWKEY;将Key命名修改为newkey

                                   TYPE KEY ;返回KEY对应VALUE的类型。none(key不存在),string,list(列表),set(集合),zset(有序集合),hash(哈希表)

                     5种数据类型

                            String:基础存储类型,在redis中二进制安全,存入和取出数据相同,最大容纳数据长度512M。

                                   常用命令:

                                          set key value;例如:set company "sunny";key存在则进行覆盖,返回 OK

                                          get key;返回key对应的值

                                          del key;删除 key

                            哈希类型-hash:适合存储值对象信息,value是一个键值对,key 无序

                                   常用命令

                                          hset key field value 为指定key设置field/value键值对。给同一个field设置,后者会覆盖前者

                                          hmset key1 field/value key2 field/value 为多个key设定field/value

                                          hget key field 返回指定Key中field的值

                                          hmget key field1 field2 field3 返回指定Key中多个field的值

                                          hdel key field [field … ] 删除1个或多个字段,返回被删除字段的个数

                                          hgetall key 获取Key的所有数据

                            列表类型-list:有序可重复,类似双端队列的数据结构,可作为redis实现消息队列的数据结构

                                   常用命令:

                                          lpush key values[value1 value2…] 在指定key关联的list头部添加这些元素,如果key不存在,则新建元素。添加成功,返回元素个数

                                          lpop key 返回key关联链表的头部元素

                                          rpop key 从尾部弹出元素

                                          lrange key start end 输出该key的所有数据。示例:lrange key 0 10;输出key对应list的索引0至索引10的数据,即前11个元素

                            列表类型-set(无序且不可重复)

                                   常用命令:

                                          sadd key values[value1、value2…] 向key对应set中添加数据

                                          smembers key 显示key对应set中所有数据

                                          srem key members[member1、member2…] 删除key对应set中指定数据

                            有序列表类型-zset(sortedSet,可排序,可保证不重复),value中的每个元素都会关联一个double类型的份数,redis中正式通过分数来为元素实现从小到大的排序

                                   特点:可排序的set集合,相当于java中的treeSet

                                   常用命令:

                                          zadd key values[value1、value2…] 向key对应set添加元素

                                          zrange key start end  通过索引区间返回指定范围内的元素,升序

                                          zrevrange key start end 通过索引区间返回指定范围内的元素,降序

                                          zrange key start end  [withscores]  通过索引区间返回指定范围内的元素及其对应score数字,升序

                                          zrevrange key start end [withscores] 通过索引区间返回指定范围内的元素及其对应score数字,降序

                     redis通用命令

                            key pattern ;pattern表示格式,作用是获取与pattern匹配的Key。* 表示任意1个或多个字符,?表示任意1个字符

                            exists key ;判断key是否存在,存在返回1 否则返回0

                            type key ;返回key对应的value数据类型。none、string、list、set、zset、hash

                            expire key time;设置key的存活时间

                     3种特殊数据类型

                            Hyperloglog 基数统计算法,类似于set数据类型,允许容错,使用此类型。不允许容错使用set即可

                            Bitmap 位存储,操作二进制位来记录。

                            Geospatial 地理位置

    2.redis持久化机制、RDB持久化、AOF持久化

              REDIS持久化概述:

                     redis高性能原因是因为将数据保存在内存中,为了保证redis重启后数据不丢失,将数据从内存保存到硬盘中,过程称为持久化。

                     持久化支持RDB和AOF两种方式,可以单独使用1种,也可以将2种进行结合使用。

                     默认支持RDB持久化,无序配置。此机制是在固定时间间隔将内存的数据集快照写入磁盘。

                     AOF持久化以日志的形式记录服务器所处理的写操作,在redis启动之初会读取此文件来重建redis数据库。以保证重启后数据完整。

                     持久化可通过配置来禁用

                     可同时使用RDB和AOF持久化

              RDB持久化,也称快照(Snapshot)

                     RDB持久化特点:将内存种数据以一定时间间隔,将内存数据写入硬盘中,默认持久化的方式,保存的文件以.rdb为后缀

                     快照生成方式:客户端方式(BGSAVE和SAVE指令)、服务器配置自动触发

                            客户端方式之BGSAVE操作(并行操作):客户端使用BGSAVE命令创建快照,当redis服务器收到客户端发送的BGSAE命令,服务器会调用fork创建1个子线程,

                                                                                    子线程负责快照写入磁盘,主线程继续处理命令请求  

                            客户端方式之SAVE操作(串行操作):客户端使用SAVE命令创建快照,redis服务器收到客户端发送的SAVE命令,服务器在快照完毕之前不会响应其他命令。此模式不常用

                            配置自动触发:和Mysql的redo机制类似。如果在redis.conf种设置了save配置选项,redis会在选项满足之后自动触发一次BGSAVE命令,如果设置多个save配置选项,

                                                 其中一个满足,也会执行一次BGSAVE命令

                            服务器接受客户端shutdown指令:服务器收到客户端的shutdown指令后,会执行一个save命令,阻塞所有客户端,不再执行任何客户端命令,并再save命令执行完毕后关闭服务器

                     配置生成快照名称和位置:

                            修改生成快照名称:dbfilename dump.rdb

                            修改生成位置 dir./

                     RDB(快照)持久化的缺点:

                            无法保证系统高可用性质,即无法避免最大程度的数据丢失。因为一旦在持久化之前出现服务宕机,未来得及保存进入磁盘的数据就会丢失

              AOF只追加日志文件

                     特点:可将客户端执行的所有set命令记录到日志文件中,AOF持久化会将被执行的写命令保存到AOF文件的末尾,以此来记录数据变化;

                                   恢复内存数据,只需要将AOF文件中包含的写命令从头到尾执行一次即可;

                                   redis服务器启动之初会读取该文件,来重新构建redis数据库,从而保证数据完整

                     开启AOF持久化:

                            redis.conf默认配置中的AOF持久化机制是关闭的,需要配置中开启。

                            开启步骤:修改 appendonly yes 开启持久化;修改appendfilename "appendonly.aof"; 指定生成文件名称

                     日志追加频率:

                            always:每次写操作,都写入磁盘,可最大程度减少数据的丢失,但是此同步策略需要对磁盘大量操作,因此redis处理速度会受到磁盘性能的限制。谨慎使用

                            everysec:每秒执行一次同步,显式的将多个命令存入磁盘。使用此方式和不使用此方式时性能相差无几,同时每秒一次即便系统崩溃也只会丢失1S的数据。 推荐使用

                            no:由操作系统决定何时同步。不会对性能带来影响,但是会丢失不定量数据。不推荐

                     修改同步频率:通过 appendfsync always/everysec/no 指定

              AOF文件的重写

                     AOF(日志文件)的缺点:持久化文件越来越大,为了压缩AOF持久化文件,redis提供了AOF重写(ReWriter)机制

                     AOF重写可在一定程度上减小AOF文件的体积

                     触发重写方式

                            客户端方式触发重写:执行 BGREWRITEAOF 命令,不会阻塞redis服务

                            服务端方式配置自动重写:修改redis.conf文件中的 auto-aof-rewrite-percentage和auto-aof-rewrite-min-size。

                                   例如:auto-aof-rewrite-percentage值为100和auto-aof-rewrite-min-size 64mb。在开启AOF持久化时,当AOF文件大于64M,并且AOF文件比上次重写后体积大了至少几倍,自动触发

                     重写原理:将内存中的数据库用命令的方式重写生成了一个AOF文件,来替换原来的文件

                     重写流程:

              持久化总结

                     RDB和AOF两种方案可同时使用,也可单独使用,也可都不使用。使用那种取决于用户的数据和应用决定

                     无论是使用RDB还是AOF,持久化文件都是保存在磁盘的,有必要除了持久化外,还应该对持久化文件进行备份(最好备份在多个地方)

                     RDB和AOF的选择问题:

                            对数据非常敏感,选择AOF。但是文件体积较大,恢复速度较慢

                            数据呈现阶段有效性,选择rdb,可做到阶段内数据无丢失,恢复速度较快。但是利用RDB实现紧凑的持久化会使得redis性能降低很多

                            总之如果不能承受数分钟以内的数据丢失,对业务数据非常敏感选择AOF;可以承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选择RDB。

                            灾难恢复选用RDB

                            双重保险策略,同时开启AOF和RDB,重启后先使用AOF进行数据恢复,降低丢失数据,两者同时开启,数据恢复时会选择忽略RDB,选择AOF进行恢复,从而避免数据不一致或重复问题

    3.java操作redis、jedis连接池、使用redis缓存不常修改的数据

              jedis基本使用:

                     redis不仅可通过命令操作,主流语言都有客户端支持。官方推荐java客户端使用jedis和redisson。企业中jedis使用居多

                     实现步骤:引入jedis依赖;创建jedis对象;调用jedis对方的方法实现对string、list、set、zset、hash的操作

              jedis连接池的基本概念:jedis资源的创建和消费非常消耗性能,jedis提供了池化技术,jedispool在创建时初始化一些连接资源存储到池中,使用jiedis连接资源时间无需创建,从连接池中获取,使用完毕后将jedis还给连接池,供其他请求使用。使用GenericObjectPoolConfig 和JedisPool来创建连接池

    4.spring boot整合redis核心api

              springboot data redis 提供了stringredistemplate和redistemplate,stringredistemplate是redistemplate的子类。

              区别在于stringredistemplate的key和value只能是string,而redistemplate的key和value可以是object任意类型的数据。

              使用redistemplate默认是将对象序列化到redis中,因此放入的对象必须实现对象序列化接口 serializable

              实现步骤:引入依赖;配置连接;使用redistemplate进行操作

    5.redis事务、watch锁、redis实现分布式锁、数据的删除策略、淘汰策略

              redis事务

                     定义:一系列预定义命令保证成一个整体(队列),执行时一次性按照添加顺序依次执行,中途不会中断或干扰。

                     本质:一组命令的集合

                     没有隔离级别的概念,所有命令在事务中并未直接执行,只有在执行exec命令时才会执行

                     redis单条命令保证原子性,事务不保证原子性

                     执行步骤:开启事务(multi),执行操作,提交事务(exec)

                     事务操作

                            开启事务 multi (设定事务开启位置,后续所有指令均加入到事务中)

                            取消事务 discard 终止当前事务的定义,在multi之后,exec之前

                            执行事务 exec 设定事务的结束位置,同时执行事务,与multi成对出现。可保证事务的一致性

                            注意事项:定义事务中,命令存在语法错误,则事务中所有命令都不会执行;

                                        如果命令格式语法正确,但是无法正确执行,则正确的命令会执行,运行错误的命令不会执行(例如对list执行incr),已经执行完毕的命令对应数据不会自动回滚,需要自行回滚。

                     watch锁:

                            问题:线程1监听某个key,当事务还未执行完,事务2操作了这个key,watch会通知线程1事务失败

                            基于特定条件的事务执行:假如对已售空的商城进行补货,多个采购员都可以进行,为了避免数据重复操作,所以在操作某一数据前,先锁定要操作的数据,一旦发生变化,终止当前事务

                            基于特定条件的事务执行(锁):对key添加监视锁,在执行exec操作前,如果Key发生了变化,则终止事务执行。watch key1[kye2...].取消所有key的监视 unwatch;

                           

                            watch锁操作:

                                   悲观锁:认为什么时候都会出问题,无论做什么都会加锁

                                   乐观锁:认为什么时候都不会出现问题,所以不会加锁,更新数据时候判断一下,在此期间是否有人更改此数据(获取version,更新的时候比较version)

              redis中数据的删除策略

                     定时删除、惰性删除、定期删除

              淘汰策略     

    6.mybatis自身本地缓存结合redis实现分布式缓存        

              redis实现分布式缓存

                     缓存:计算机内存中的一段数据

                     内存中数据特点:读写快、断电立即丢失

                     缓存解决的问题:提高网站吞吐量,网络运行效率快,解决数据库访问压力

                     数据库中极少修改的数据适合使用缓存,更多用于数据查询

                     本地缓存和分布式缓存的区别:本地缓存保存在应用服务器内存中(mybatis的一级和二级缓存就是本地缓存);分布式缓存存储在应用服务器之外的数据

                     集群:将一种服务创建多个节点,放在一起共同对系统提供服务的过程称为集群

                     分布式:多个不同服务集群共同对系统提供服务的系统称为分布式系统。

                     利用mybatis自身本地缓存结合redis缓存实现分布式缓存:todo

    7.主从复制简介、工作流程、常见问题

              主从复制简介

                     redis集群实现高可用:避免单机redis服务故障,准备多台服务器,互相连通,将数据复制多个副本保存在多个服务器上,连接在一起,并保证数据式同步的。

                     即便其中1台服务宕机,其他服务器依然可以继续提供服务,实现redis的高可用,同时实现数据冗余备份。

                     主从复制定义:即将master中的数据及时、有效的复制到slave中.master支持读写,在进行写时间,将出现变化的数据自动同步至slave。

                     主从复制作用:

                                   读写分离:master负责写,slave负责读取,提高服务器的读写负载能力

                                   负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求变化,改变slave数量,通过多个从节点分担数据读取负载,大大提高了redis服务器并发量和吞吐量

                                   故障恢复:master出现问题,slave提供服务,实现快速的故障恢复

                                   数据冗余:实时数据热备份,持久化之外的一种数据冗余方式,slava和master数据同步

                                   高可用基石:基于主从机制,构建哨兵模式和集群,实现redis高可用方案

              主从复制流程

                     建立连接:准备阶段,slave连接master。

                            连接的三种方式:

                                   客户端发送命令:slaveof masterip masterport;

                                   驱动服务器参数:redis-server -slaveof masterip masterport

                                   服务器配置:slaveof masterip masterport

                            断开连接:slaveof no one;断开连接后之前接受数据不会删除,只是不在接收新的master数据    

                     数据同步: master数据同步slave

                     命令传播:master后续执行写入操作,将数据同步slave

    8.哨兵机制Sentinel、哨兵原理

              哨兵机制sentinel

                     哨兵概念:是redis的高可用性解决方案,由1个或多个sentinel实例构成的sentinel系统可监视多个主服务器,以及这些主服务器下的所有子服务器。

                            当被监视的主服务器下线时,自动将下线主服务器中的某个从服务器升级为新的主服务器。简单来说哨兵就是带有自动故障转移功能的主从架构。

                            哨兵是一个分布式系统,用于对主从结构中的每台服务器进行监控,当master出现故障时,选择新的master,并将所有slave连接到新的master

                     哨兵作用

                            监控:不断检查master和slave是否正常运行,master存活检测,master和slave运行情况检测

                            通知:当被监控的服务器出现问题时,向其他(哨兵、客户端)发送通知

                            自动故障转移:如果master宕机,断开master和slave的连接,从slave中选取一个作为新的master,将其他slave和新的master建立连接,并告知客户端新的master地址

                            注意:哨兵也是一台服务器,只是不提供服务。通常哨兵配置数量为单数。(避免选举master同票)

              启动哨兵机制     

                     配置多个哨兵:将redis中的sentinel.conf拷贝2份,在sentinel.conf中修改端口,以及设置master的端口地址,最后通过 redis-sentinel sentinel-端口号.conf即可启动哨兵

              哨兵机制原理

                     主从切换:哨兵在主从切换中经历了 监控、通知、故障转移 3个阶段。

                     监控阶段:启动哨兵服务之后,哨兵之间会互相监控,包括master及master下所有的slave节点信息。多个哨兵之间可相互通信,之间通过发布订阅来互相通知

                     通知阶段:哨兵之间相互通知,哨兵通知客户端

                     故障转移阶段:某个哨兵向master服务器发送指令,此时master没反应,也拿不到信息,哨兵意识到master宕机,将此消息告知另外2个哨兵,另外两哨兵也向master发送请求,也得不到响应,此时master确定下线,随后多个哨兵中会选出一个领头的哨兵将master清楚,并在slave中选出一个新的master,将slave切换为新的master

    9.redis集群原理、缓存预热、缓存击穿、缓存穿透、缓存雪崩的解决方案

              集群架构

                     集群架构概念

                            概念产生背景:业务发展过程中遇到的瓶颈。redis提供服务OPS可达到10万/S,当前业务ops已达到10万/s;内存单机容量为256G,当前业务需求内存容量为1T。使用集群可解决上述问题

                            集群:将同一个服务的多个节点放在一起,共同对系统提供服务的过程称为集群。换言之集群就是将若干台网络连接起来,并提供统一的管理方式,对外呈现单机的服务效果。

                            分布式:有多个不同服务集群共同对系统提供服务的系统称为分布式系统

                     集群架构作用:

                            分散单台服务器的访问压力,实现负载均衡

                            分散单台服务器的存储压力,实现可扩展性

                            降低单台服务宕机带来的宕机灾难

                     redis集群原理

                            所有redis节点彼此互联,通过二进制协议优化传输速度和带宽,每个redis节点都包含自己的master和slave,

                            集群中节点宕机是集群中超过半数的节点检测失效时才失效

                            客户端只需要连接集群中任意一个节点即可

                            客户端执行set命令时,会通过CRC16算法,计算出其哈希槽的位置,根据该位置存储到对应的node节点。执行get操作时,会根据哈希槽的位置,去指定节点内读取数据。

                            故障转移将宕机的master节点的哈希槽由选出来的slave来接管,不会新创建哈希槽

              redis集群搭建

                     https://blog.csdn.net/m0_37989980/article/details/107778257 二

              redis企业解决方案

                     缓存预热

                            定义:系统启动前,提前将相关的缓存数据直接加载到缓存系统,避免用户先查询数据库,再将数据缓存的问题!

                            解决问题:解决用户请求先查询数据库,再将数据缓存的问题

                            作用:用户直接查询事先被预热的缓存数据,加快查询速度

                            解决方案:

                                   统计访问频率较高的热点数据,并将统计数据分类,根据级别排序,优先加载级别较高的热点数据,热点数据主从预热

                                   脚本程序固定触发脚本预热

                     缓存雪崩

                            定义:同一时间大面积的缓存失效,后面的请求都会直接请求数据库,造成数据库短时间内接收大量请求而崩溃

                            后果:数据库服务器崩溃

                            原因:较短时间内,缓存中较多的key集中过期

                            解决方案(道):

                                   更多的页面静态化处理(模板+动态数据)、构建多级缓存架构、针对慢SQL进行执行计划分析,进而优化SQL、

                                   限流降级短时间内牺牲用户体验,限制一部分请求,降低应用服务器压力,请求低速运转后再逐步放开访问

                            解决方案(术):

                                   数据有效期策略调整,根据业务有效期进行分类错峰,过期时间使用固定时间+随机值的方式,稀释集中过期的key

                                   超热数据使用永久key

                     缓存击穿

                            定义:缓存中没有但数据库中有的数据,一般是缓存时间到期,此时大量并发请求同一条数据,缓存中没有,查询数据库,从而造成数据库崩溃

                            原因:缓存中某一个热点key过期,该Key访问量巨大,多个请求都压在这个Keys上,但是均为命中,redis短时间内发起了大量对数据库中同一数据的访问

                            解决方案(术):

                                   设置热点数据永不过期、现场调整Key的过期时间、后台定时刷新热点key有效期

                     缓存穿透(布隆过滤器解决)

                            定义:缓存和数据库中都没有的数据,导致所有请求都落在数据库上,造成数据库短时间接到大量请求而崩掉

                            示例:例如数据库及缓存中的数据都是从id为0开始自增,有人恶意请求id=-1的数据,即缓存穿透

                            解决方案:

                                   接口层增加校验,如用户鉴权校验,id基础校验,小于等于0的直接拦截

                                   缓存和数据库中都没取到,可以设置为key-null,有效期短一点,30秒左右,可防止用户针对同一个key进行暴力攻击

                                   使用布隆过滤器,判断请求的key是否存在

                                   布隆过滤器:

                                          定义:是一个很长的二进制向量(bit数组)和一系列哈希函数(hash),用于检索一个元素是否在一个集合中。

                                          优点:因为基于位数组和哈希算法,空间效率和查询时间远超一般算法

                                          缺点:有一定的误识别率和删除困难,但是可以通过增加位数组大小和hash函数来降低误识别率(无法避免)

                                          添加数据过程:初始化之后,位数组中值都为0,当增加变量,会通过多个hash函数将元素映射到位数组中各个位上,将对应位置设置为1

                                          查询数据过程:通过多个hash函数将元素映射到位数组中各个位上,如果各个位都是1,则元素可能存在,但如果其中有位不为1,则元素一定不存在

                     缓存降级

                            定义:流量骤增,造成响应速度较慢,可对非核心缓存业务进行降级

                            目的:保证核心服务可用。有些服务无法降级(如加入购物车、结算)

                            服务降级目的:防止redis故障,导致数据库一起发生雪崩问题,因此可对不重要的缓存数据,采用服务降级策略。

                                                        例如redis出现问题,不去数据库查询数据,而是直接返回默认值(兜底默认值)

    10.布隆过滤器解决缓存穿透问题

              人工智能学习网站:https://www.captainai.net/itcoke/

              目的:redis实现布隆过滤器

              使用场景:准确判断某个数据是否在大数据集合中,并且不占用内存

              简介:一种数据结构,一串很长的二进制向量组成,可看作一个二进制数组,初始默认值都是0

              添加数据:通过多个hash函数,计算出在二进制数组中的位置,将其设置为1

              判断数据是否存在:将元素通过hash函数算出在二进制数组中的位置,看其是否为1,如果都为1则可能存在,否则一定不存在

              优点:二进制数据,占用内存极少,插入和查询速度很快

              缺点:随着数据增加,误判率增加;无法判断数据一定存在;无法删除数据

              redis实现布隆过滤器:

                   在redis中,bitmaps提供了一套命令来操作类似字符串中的每一位(setbit、getbit、bitcount等),因此redis实现布隆过滤器底层是通过bitmap数据结构。

                     Redission是在java中操作redis的库,因此可利用Redission来实现布隆过滤器,也可用guava来实现布隆过滤器

相关文章:

Redis及其他缓存

1.NOSQL、Redis概述&#xff0c;通用命令&#xff0c;redis五大数据类型&#xff0c;三大特殊数据类型 NOSQL概述&#xff1a; (NOT ONLY SQL-不仅仅是SQL),泛指非关系型数据库&#xff0c;为解决大规模数据集合多重数据种类带来的挑战&#xff0c;尤其是大数据应用问题 常见no…...

golang入门

学习视频&#xff1a;https://www.bilibili.com/video/BV1gf4y1r79E go安装 go源码包一般解压到/usr/local/linux下go的环境变量配置&#xff1a; export GOROOT/usr/local/go # 源码包export GOPATH$HOME/go # 工作路径export PATH P A T H : PATH: PATH:GOROOT/bin:$GOPATH/…...

Behind the Code:与 Rakic 和 Todorovic 对话 OriginTrail 如何实现 AI 去中心化

原文&#xff1a;https://www.youtube.com/watch?vZMuLyLCtE3s&listPLtyd7v_I7PGnko80O0LCwQQsvhwAMu9cv&index12 作者&#xff1a;The Kusamarian 编译&#xff1a;OneBlock 随着人工智能技术的飞速发展&#xff0c;一系列前所未有的挑战随之而来&#xff1a;模型的…...

TS 学习 (持续更新中)

如果我们在 ts 中写 不用运行就能在文件中报错 ts 是一种静态类型的检查 能将运行时出现的错误前置 一般不用 命令行编译 ts 转换成 js 将中文转码 tsc index&#xff08;.ts&#xff09; 输入命令生成 配置文件 能在中间进行 配置转换成 js 的哪个规范 es5 还是 6 和其它转…...

el-table使用type=“expand”根据数据条件隐藏展开按钮

一&#xff1a;添加className <el-table :data"tableData" border :loading"loading" :row-class-name"getRowClass" expand-change"expandchange"><el-table-column type"expand"><template #default"…...

9月6日(∠・ω<)⌒☆

1、手写unique_ptr指针指针 #include <iostream> #include <stdexcept>template <typename T> class unique_ptr { public:// 构造函数explicit unique_ptr(T* ptr nullptr) : m_ptr(ptr) {}// 析构函数~unique_ptr() {delete m_ptr;}// 禁止复制构造函数…...

k8s执行crictl images报错

FATA[0000] validate service connection: CRI v1 image API is not implemented for endpoint "unix:///run/containerd/containerd.sock": rpc error: code Unimplemented desc unknown service runtime.v1.ImageService 解决方法&#xff1a; vim /etc/contai…...

基于人工智能的音乐情感分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 音乐情感分类是通过对音乐音频信号进行分析&#xff0c;识别出音乐传递的情感&#xff0c;如“愉快”、“悲伤”、“愤怒”等。该技术…...

MySQL灾难恢复策略:构建稳健的备份与恢复机制

在现代企业环境中&#xff0c;数据的安全性和可靠性至关重要。灾难恢复计划&#xff08;Disaster Recovery Plan, DRP&#xff09;是确保在发生灾难性事件后&#xff0c;能够迅速恢复业务的关键策略。对于依赖MySQL数据库的系统&#xff0c;实现有效的灾难恢复计划尤为重要。本…...

docker安装DVWA(巨简单)

拉取镜像docker pull vulnerables/web-dvwa 启动docker run --rm -it -p 80:80 vulnerables/web-dvwa dvwa:...

使用matplotlab绘制多条形图

##黑马程序学习 这种多个条形图放在一起的图形该怎么画呢&#xff1f; 请看以下代码 #横着的条形图 from matplotlib import pyplot as plt import matplotlib#设置显示中文 和 负号 matplotlib.rcParams[font.sans-serif][SimHei] matplotlib.rcParams[axes.unicode_minus]F…...

五、Selenium操作指南(二)

文章目录 四、获取页面元素属性&#xff08;一&#xff09;get_attribute获取属性&#xff08;二&#xff09;获取文本&#xff08;三&#xff09; 获取其他属性 五、页面交互操作&#xff08;一&#xff09;输入文本 send_keys()&#xff08;二&#xff09;点击 click()&#…...

Peewee+Postgresql+PooledPostgresqlDatabase重连机制

需求&#xff1a; Postgresql数据库服务重启后&#xff0c;需要业务代码正常读写数据库 方案&#xff1a; 通过继承playhouse.shortcuts.ReconnectMixin和playhouse.pool.PooledPostgresqlDatabase来创建一个新的ReconnectPooledPostgresqlDatabase类修改reconnect_errors属性来…...

IIS 反向代理模块: URL Rewrite 和 Application Request Routing (ARR)

需要设置iis反向代理的场景其实挺多的。例如websocket、Server Sent Events(SSE) 都需要反向代理。 对于需要临时放公网访问的应用&#xff0c;直接运行127.0.0.1的开发环境&#xff0c;然后通过反向代理访问127.0.0.1就可以了&#xff0c;省去麻烦的iis设置。 IIS 实现反向代…...

企业在选择CRM系统时需要注意哪些问题呼叫系统外呼系统部署搭建

在这个信息技术快速发展的时代&#xff0c;许多企业为了对客户进行有效的管理对CRM系统进行了实施。那么&#xff0c;有人会问了&#xff0c;企业在选择CRM系统是需要注意哪些问题呢?我们一起来看看 业务需求匹配&#xff1a;系统功能是否与企业当前及未来的需求相符&#xff…...

数据库水平分表方案

数据库分表有很多策略&#xff0c;如下&#xff1a; 数据库分表是处理大型数据库中数据量过大的一种常见策略&#xff0c;它可以提高查询性能、减少锁竞争、降低维护成本等。以下是一些常见的数据库分表方案&#xff1a; 1. **垂直分表&#xff08;Vertical Partitioning&…...

MySQL表操作及约束

修改表 重命名&#xff1a; mysql> alter table user1 rename to user; 新增一列 mysql> alter table user add image_path varchar(128) comment 路径 after birthday; mysql> alter table user add image_path varchar(128) comment 路径 after birthday; Query…...

Redis 键值对操作全攻略

文章目录 一 . get 和 set二 . keys *三 . exists四 . del五 . expire六 . ttl七 . Redis 的 key 的过期策略八 . 定时器的实现8.1 基于优先级队列8.2 基于时间轮实现的定时器 九 . type十 . 数据库管理相关命令 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章…...

【C语言】---- return的作用

return 是C语言中的一个关键字&#xff0c;用于从函数中返回值。它有以下几个作用&#xff1a; 1 返回值 return 用于将函数的结果返回给调用者。在函数执行过程中&#xff0c;当遇到 return 语句时&#xff0c;函数将立即停止执行&#xff0c;并将其后的表达式的值作为函数的…...

如何制作新生资料收集系统?

新学年伊始&#xff0c;学校需要高效收集学生信息和证件照。易查分提供了一个便捷的解决方案&#xff0c;通过创建一个集成信息和图片的收集系统&#xff0c;可以快速完成这项工作&#xff0c;并将信息导出为PDF&#xff0c;方便打印和存档。 制作步骤如下&#xff1a; 1. 准备…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...