MongoDB Realm
使用Realm 引用站外地址 Realm官方文档 https://www.mongodb.com/docs/realm/sdk/kotlin/ 添加依赖 在build.gradle(app)文件中添加 123456789101112plugins { ... id 'io.realm.kotlin'}...dependencies { ... //MongoDB Realm implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4' implementation 'io.realm.kotlin:library-base:1.6.1'} 在build.gradle(项目)文件中添加 1234plugins { ...
小型录音机
record相关 AudioRecorder.kt 123456import java.io.Fileinterface AudioRecorder { fun start(outputFile: File) fun stop()} AndroidAudioRecorder.kt 123456789101112131415161718192021222324252627282930313233343536373839import android.content.Contextimport android.media.MediaRecorderimport android.os.Buildimport android.provider.MediaStore.Audio.Mediaimport java.io.Fileimport java.io.FileOutputStreamclass AndroidAudioRecorder( private val context: Context): AudioRecorder { pr ...
Redis(十二)进阶:Redis分布式系统
Redis 分布式系统,官方称为 Redis Cluster,Redis 集群,其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决不同 Redis 节点存放不同数据,并将用户请求方便地路由到不同 Redis 的问题。 数据分区算法 分布式数据库系统会根据不同的数据分区算法,将数据分散存储到不同的数据库服务器节点上,每个节点管理着整个数据集合中的一个子集。 常见的数据分区规则有两大类:顺序分区与哈希分区。 顺序分区 顺序分区规则可以将数据按照某种顺序平均分配到不同的节点。不同的顺序方式,产生了不同的分区算法。例如,轮询分区算法、时间片轮转分区算法、数据块分区算法、业务主题分区算法等。由于这些算法都比较简单,所以这里就不展开描述了。 轮询分区算法 每产生一个数据,就依次分配到不同的节点。该算法适合于数据问题不确定的场景。其分配的结果是,在数据总量非常庞大的情况下,每个节点中数据是很平均的。但生产者与数据节点间的连接要长时间保持。 时间片轮转分区算法 在某人固定长度的时间片内的数据都会分配到一个节点。时间片结束,再产生的数据就会被 ...
Redis(十一)进阶:Redis缓存穿透、击穿和雪崩的理解和学习
Redis的缓存穿透 1、概念: 用户需要查询一个数据,但是redis中没有(比如说mysql中id=-1的数),直接去请求MySQL,当很多用户同时请求并且都么有命中!于是都去请求了持久层的数据库,那么这样会给持久层数据库带来非常大的压力。一般出现这样的情况都不是正常用户,基本上都是恶意用户! 2、解决方案 ①布隆过滤器: 布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则 丢弃,从而避免了对底层存储系统的查询压力; ②缓存空对象: 当存储层查不到,即使是空值,我们也将其存储起来并且在Redis中设置一个过期时间,之后再访问这个数据将会从Redis中访问,保护了持久层的数据库! ③存在的问题: 1)如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键; 2)即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。 注意:缓存穿透前提是:Redis和MySQL中都没有,然后不停的直接请求MySQL。 Redis的缓存击穿 1 ...
Redis(十)进阶:Redis集群之哨兵模式的学习和理解
前言 在Redis集群中我们讲到了,主机断开后,我们得手动设置另一个从机变成主机!这是不智能的!在实际工作中,我们都是用哨兵模式来自动切换主机。通俗点讲,就是自己去选择‘大哥’! 概述 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式 。Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题。 谋朝篡位 的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的 进程 ,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。 配置哨兵 添加哨兵配置文件 sentinel.conf 内容如下: 12# sentinel monitor 被监控的名称 host port 1 (代表自动投票选举大哥!)sentinel monitor myredis 127.0.0.1 ...
Redis(九)进阶:Redis集群之如何配置主从复制模式?
前言 默认情况下,每台Redis服务器都是主节点; 由于个人服务器性能原因,以下的所有操作都是单机集群的概念!在实际工作中并不会这样配置,而是使用哨兵模式来监控!这篇文章的意义主要就是为了让大家了解主从复制这个概念! 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。 主要作用: ①数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。 ②故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。 ③负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。 ④高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集 ...
Redis(八)进阶:Redis如何实现发布订阅功能?
前言 消息系统 发布/订阅,即 pub/sub,是一种消息通信模式:发布者也称为消息生产者,生产和发送消息到存储系统;订阅者也称为消息消费者,从存储系统接收和消费消息。这个存储系统可以是文件系统 FS、消息中间件 MQ、数据管理系统 DBMS,也可以是 Redis。整个消息发布者、订阅者与存储系统称为消息系统。 消息系统中的订阅者订阅了某类消息后,只要存储系统中存在该类消息,其就可不断的接收并消费这些消息。当存储系统中没有该消息后,订阅者的接收、消费阻塞。而当发布者将消息写入到存储系统后,会立即唤醒订阅者。当存储系统放满时,不同的发布者具有不同的处理方式:有的会阻塞发布者的发布,等待可用的存储空间;有的则会将多余的消息丢失。 当然,不同的消息系统消息的发布/订阅方式也是不同的。例如 RocketMQ、Kafka 等消息中间件构成的消息系统中,发布/订阅的消息都是以主题 Topic 分类的。而 Redis 构成的消息系统中,发布/订阅的消息都是以频道 Channel 分类的。 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者 ...
Redis(七)进阶:Redis持久化之RDB和AOF
前言 Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能 !他会按照设置以快照或操作日志的形式将数据持久化到磁盘。 根据持久化使用技术的不同,Redis 的持久化分为两种:RDB 与 AOF。 持久化基本原理 Redis 持久化也称为钝化,是指将内存中数据库的状态描述信息保存到磁盘中。只不过是不同的持久化技术,对数据的状态描述信息是不同的,生成的持久化文件也是不同的。但它们的作用都是相同的:避免数据意外丢失 通过手动方式,或自动定时方式,或自动条件触发方式,将内存中数据库的状态描述信息写入到指定的持久化文件中。当系统重新启动时,自动加载持久化文件,并根据文件中数据库状态描述信息将数据恢复到内存中,这个数据恢复过程也称为激活。这个钝化与激活的过程就是 Redis 持久化的基本原理。 不过从以上分析可知,对于 Redis 单机状态下,无论是手动方式,还是定时方式或条件触发方式,都存在数据丢失问题:在尚未手动/自动保存时发生了 Redis 宕机状况,那么从 ...
Redis(六)进阶:Redis的配置文件详解
前言 前面的学习我们只是知道了如何使用Redis ,但是我们作为开发人员,我们不仅要知其然,还要知其所以然,所以我们得从根本上理解,我们必须将Redis.conf(windows版叫redis.windows.conf)文件仔细的学习一下,提升自我!放飞自我! 在实际工作中:一些小小的配置,可以让你脱颖而出! 单位:Redis配置对大小写不敏感! 注意这里:任何写法都可,不区分大小写。 units are case insensitive so 1GB 1Gb 1gB are all the same. 包含:搭建Redis集群时,可以使用includes包含其他配置文件 网络: 解释如下所示: 123bind 127.0.0.1 # 绑定的ip protected-mode yes # 保护模式 port 6379 # 端口设置 通用GENERAL 12345678910111213daemonize yes # 以守护进程的方式运行,默认是 no,我们需要自己开启为yes! pidfile /var/run/redis_6379.pid # 如果以后台的方式 ...
Redis(五)整合:SpringBoot如何整合Redis?
前言 Spring作为当前最火的一个框架,既然我们学习了Redis,我们肯定是要在实际项目中使用,那么肯定首选整合SpringBoot啦! 首先简单介绍下SpringBoot对Jedis的支持吧,在1.×版本的时候,SpringBoot的底层还是使用Jedis来连接Redis的,但是在2.×版本后,就换成了Lettuce。两者的区别如下: Jedis: 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池! 更像 BIO 模式! Lettuce: 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像 NIO 模式! 如果你不太了解spring框架的话,建议可以先去看一下B站大神狂神说Java系列的教学视频,我当初就是看到他的。 引用站外地址 狂神说Java系列 https://space.bilibili.com/95256449/channel/seriesdetail?sid=393820 ...
Redis(四)整合:Redis在Jedis中如何使用和操作?
前言 Jedis是Redis官方推荐的Java连接开发工具! 虽然现在的SpringBoot2.×版本已经将Jedis换成了Lettuce,但是我觉得还是有必要了解一下Jedis的使用! 如何在java项目中整合Jedis并且连接Redis数据库? ①创建一个Maven项目 ②导入Jedis和fastjson依赖,耐心等待下载完成! 123456789101112<!--导入jedis的包--><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.1</version></dependency><!--fastjson--><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson& ...
Redis(三)基础:Redis中的事务和乐观锁如何实现?
前言 事务 ①原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。 ②一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 ③隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 ④持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 在Redis事务没有没有隔离级别的概念! 在Redis单条命令式保证原子性的,但是事务不保证原子性! 乐观锁 ①当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。 ②没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。 在Redis是可以实现乐观锁的! Redis如何实现事务? 事务实现 Red ...