Other

springboot集成redis

<?xml version=1.0 encoding=UTF-8?><project xmlns=http://maven.apache.org/POM/4.0.0 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>redis-02-springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <name>com.zou</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.

Linux 添加用户

最近买了个服务器,登录就是root用户。由于root权限很高,应该避免直接使用root账户进行操作,直接以root权限执行命令式,很容易产生不可挽回的误操作。添加用户步骤如下: 创建用户命令:adduser xxx 此时会在/home目录下新建一个xxx文件夹,然后输入xxx用户的密码两次 (xxx是创建的用户名) PS:有些不会提示你设置密码,那么此时这个用户就没有密码。使用命令:passwd xxx设置密码(xxx是创建的用户名)   赋予sudo权限以及执行sudo不输入密码: 首先vi /etc/sudoers(或者visudo) 进入编辑页面; 然后在 root ALL=(ALL:ALL) ALL 下面添加一行 xxx ALL=(ALL:ALL) NOPASSWD:ALL (xxx是创建的用户名)  PS:可以用su命令切换成用户 su xxx (xxx是创建的用户名) su (su+空格切换到root)

以Microsoft C# Windows程序设计为例,理解PageUnit和PageScale的用法

Microsoft windows 程序设计,第250页中,使用不同的枚举值,来求得“一英寸长的直线”,达到相同的目标。 对于以上代码,我编写了实例进行实践,代码如下: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Drawing; 6 using System.Windows.Forms; 7 8 namespace PageUnitDemo 9 { 10 class PageUnitDemo:Form 11 { 12 static void Main(string[] args) 13 { 14 Application.Run(new PageUnitDemo()); 15 } 16 public PageUnitDemo() 17 { 18 Text = Page Unit 试验!; 19 } 20 protected override void OnPaint(PaintEventArgs e) 21 { 22 Graphics grfx = e.

redis学习笔记(15)主从复制

1、概述 主机数据更新后根据配置和策略, 自动同步到备机的 master/slaver 机制,Master 以写为主,Slave 以读为主,主从复制节点间数据是全量的。 作用: 读写分离,性能扩展 容灾快速恢复 2、复制原理 Slave 启动成功连接到 master 后会发送一个 sync 命令; Master 接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master 将传送整个数据文件到 slave,以完成一次完全同步。 全量复制:slave 服务器在接收到数据库文件数据后,将其存盘并加载到内存中。 增量复制:Master 继续将新的所有收集到的修改命令依次传给 slave,完成同步。 但是只要是重新连接 master,一次完全同步(全量复制) 将被自动执行。 3、哨兵模式 反客为主:当一个 master 宕机后,后面的 slave 可以立刻升为 master,其后面的 slave 不用做任何修改。用 slaveof no one 指令将从机变为主机。而哨兵模式是反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。 当主机挂掉,从机选举产生新的主机 哪个从机会被选举为主机呢?根据优先级别:slave-priority 。 原主机重启后会变为从机。 4、复制延时 由于所有的写操作都是先在 Master 上操作,然后同步更新到 Slave 上,所以从 Master 同步到 Slave 机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave 机器数量的增加也会使这个问题更加严重。 5、故障恢复

redis-benchmark性能测试

redis-benchmark压力测试工具 测试100个并发连接 100000请求单机性能 redis-benchmark -h -p 6379 -c 100 -n    

图解Explain的type字段(Mysql)

在学习explain的时候,感觉比较重要且麻烦的就是type字段,故本文通过图表解释了相关问题。看前提醒:本文需要B+树基础。 1、基本介绍 1.1表结构介绍 共两个表,book与book_order. 表book,id为主键索引.number为普通索引表book_order,id为主键索引 1.2表结构图示 2、结合案例图解 从性能从低到高进行排序 2.1 all EXPLAIN SELECT * FROM book WHERE NAME = 'book1' 由于B+树的实际数据是存储在主键索引的叶子节点上的,所有就相当于遍历主键索引的叶子节点对应的数据。 按照红线所示顺序遍历 2.2 index 只需要遍历索引树就可以得到所需要的结果,不需要访问具体的数据。 EXPLAIN SELECT COUNT(*) FROM book 遍历树即可得到所有记录条数 2.3 range 当where语句后面出现>或者<等的时候会出现。 EXPLAIN SELECT * FROM book WHERE id < 2 2.4 ref 与 eq_ref 这两个比较像,首先请看以下语句。 EXPLAIN SELECT * FROM book b,book_order bo WHERE b.number = bo.buy_number 首先执行的是book_order,type为all表示遍历所有的记录。 然后,将每个buy_number作为查询的值放入到book的number索引中进行查找。(从ref字段为bo.buy_number也能看出) 将每个buy_number进行上述过程 如果索引中有多个值与buy_number对应,那么type为ref,如果只有一个值对应,那么结果就是eq_ref。 2.5 const与system EXPLAIN SELECT * FROM book WHERE id = 2 查找的值为一个常数(2),并且表中有多条记录;若表中只有一条记录,则type为const。

MySQL 安全管理

权限表 MySQL 服务器通过权限表来控制用户对数据库的访问,由 mysql_install_db 脚本初始化,MySQL 会根据这些权限表的内容为每个用户赋予相应的权限 1. user 表 user 表是 MySQL 最重要的一个权限表,有 49 个字段,这些字段可以分成四类: 范围列:包括 Host、User,分别表示主机名、用户名,Host 指明允许访问的 IP 或主机范围,User 指明允许访问的用户名 权限列:权限列字段描述用户在全局范围内允许进行的操作,该列的字段值类型为 ENUM,只能取 Y 和 N 安全列:安全列有 12 个字段,其中两个和 ssl 相关、两个和 x509 相关、其他八个是授权插件和密码相关 资源控制列:用于限制用户使用的资源,一个小时内用户查询或连接数量超过资源控制限制将被锁定,知道下一个小时才可以再次执行 2. db 表 db 表存储用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库,大致可以分为两类字段: 用户列:用户列有三个字段,分别是 Host、Db 和 User,分别表示主机名、数据库名和用户名 权限列:决定用户是否具有创建和修改存储过程的权限 3. tables_priv 表 tables_priv 表用来对表设置操作权限,有八个字段: Host、Db、User 和 Table_name 四个字段分别表示主机名、数据库名、用户名和表名 Grantor 表示修改记录的用户 Timestamp 表示修改该记录的时间 Table_priv 表示对象操作权限。包括 Select、Insert、Delete 等 Column_priv 表示对表中的列的操作权限,包括 Select、Insert、Update 和 References 4.

SQL Server查询代码在哪个视图、存储过程、函数、触发中使用过

工作中偶尔会出现:想用A数据表替换B数据表,然后把B数据表删除。但是,又不知道B数据表在哪个视图、存储过程、函数、触发器中使用过?  经过一番度娘,看到实现方法也不难,主要涉及两个系统表:sysobjects及syscomments。  1、先来复习一下sysobjects表结构。 列名 数据类型 描述 name sysname 对象名。 id int 对象标识号。 xtype char(2) 对象类型。可以是下列对象类型中的一种: C = CHECK 约束 D = 默认值或 DEFAULT 约束 F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P = 存储过程 PK = PRIMARY KEY 约束(类型是 K) RF = 复制筛选存储过程

MySQL中的 空值(null)和空字符('')

目录长度和判空ifnull字段定义为not null,查询的时候也可能返回null建议参考 空值(null)和空字符('')是两个比较容易混淆的概念。 本文对两者的区别做简单梳理。 长度和判空 长度 判断空 空值null 长度为null,占空间,但具体占用多大空间不确定。 判断null用is null或is not null 空字符串'' 长度为0,不占用空间。 判断空字符用=''或者!='' ifnull 对于空值null,可以使用ifnull()函数进行处理。 例如, select ifnull(comment, '') from orange where id=100; 如果comment字段为null,就返回空字符串。 字段定义为not null,查询的时候也可能返回null 另外,对于字段定义为not null,查询的时候也可能返回null。 例如, 当记录不存在时,查询结果为空: > select cluster_name from orange where hostname='123'; Empty set (0.00 sec) 对于查询结果为空,如果使用max()函数,返回值不再是空,字符值为null。 >select max(cluster_name) from orange where name='123'; +-------------------+ | max(cluster_name) | +-------------------+ | NULL | +-------------------+ 1 row in set (0.

redis学习笔记(14)AOF持久化

1、概述 AOF(Append Only File)以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来 (读操作不记录), 只许追加文件但不可以改写文件,redis 启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。 2、持久化流程 客户端的请求写命令会被 append 追加到 AOF 缓冲区内; AOF 缓冲区根据 AOF 持久化策略 [always,everysec,no] 将操作 sync 同步到磁盘的 AOF 文件中; AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量; Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的。 3、开启AOF AOF 默认不开启,可以在 redis.conf 中配置文件名称默认为 appendonly.aof 文件中开启,AOF 文件的保存路径,同 RDB 的路径一致。 4、AOF 和 RDB 同时开启,redis 听谁的? AOF 和 RDB 同时开启,系统默认取 AOF 的数据(数据不会存在丢失)。 5、AOF 启动、修复、恢复 AOF 的备份机制和性能虽然和 RDB 不同,但是备份和恢复的操作同 RDB 一样,都是拷贝备份文件,需要恢复时再拷贝到 Redis 工作目录下,启动系统即加载。 正常恢复 修改默认的 appendonly no,改为 yes。 将有数据的 aof 文件复制一份保存到对应目录 (查看目录:config get dir)。 恢复:重启 redis 然后重新加载。 异常恢复 修改默认的 appendonly no,改为 yes。 如遇到 AOF 文件损坏,通过 /usr/local/bin/ redis-check-aof–fix appendonly.