获得徽章 0
- Day 35 深入理解Redis基本数据类型
string 字符串
string表示的是一个可变的字符串,无需指定长度,在初始化之后即可拿到该字符串的长度
内存方面:内存不足时会提前扩容,小于1M时,成倍扩容;大于1M时,每次只扩容1M,但最大长度时512M
底层实现:主要是SDS(简单动态字符串),可以保存文本数据和二进制数据
使用len属性保存字符串长度,所以获取字符串的时间复杂度是O(1)
SDS API是安全的,拼接前会检查内存控件,不够时会扩容,不会造成缓冲区溢出
string支持3种编码方式:int、raw、embstr
存储的值如果是可以转化为long类型的整数,该值会被存储在对象结构的prt属性,并将该对象设为int编码
存储的值如果是字符串,且长度小于32bit会使用SDS来保存该字符串,并将编码设置为embstr;若长度大于32bit,编码设置为raw(redis2.+ => 32bit; redis3.0-4.0 => 39bit;redis5.0 = > 44bit)
embstr使用一次内存分配函数分配一块连续的内存控件来保存redisObject和SDS
raw使用两次内存分配函数来分配两块内存空间来保存redisObject和SDS
常用指令
set key value 初始化字符串
get key 获取字符串内容
strlen key 获取字符串长度
getrange key startIndex endIndex 获取字串内容
setrange key startIndex value 覆盖字串,返回长度
append key value 追加字符串,返回len
expire key 60 设置过期时间,单位:秒,返回1表示设置成功,0表示key不存在
del key 删除字符串,成功返回1,
ttl key 查询过期时间,返回-2,key不存在;返回-1,没有设置过期时间展开评论点赞 - #青训营 x 字节后端训练营#
Day 34 MySQL事务隔离级别和MVCC
1、事务有四大特性:原子性、一致性、隔离性、持久性
2、对于数据库服务器来说,在同一时刻会有多个客户端请求连接,也就产生多个会话,也就是说可能会有多个会话处理同一个事务,从而导致四大隔离级别来处理事务并发访问出现的问题。
3、四大隔离界别
读未提交:一个事务读取到另一个事务未提交的数据,可能会导致脏读、不可重复读、幻读等问题
读已提交:事务中的修改,只有在提交后,其它事务才能看到修改的结果。可以避免脏读问题,但仍可能存在不可重复读和幻读问题。
可重复读:事务执行期间,不允许其他事务对数据进行修改,保证了当前事务中读取的数据是一致的。可以避免脏读和不可重复读问题,但仍可能存在幻读问题。
串行化:最高的隔离级别,通过强制所有事务串行执行来避免并发问题。可以避免脏读、不可重复读和幻读问题,但是效率较低,通常用于数据量小的场景。
4、隔离级别越高,数据可靠性越高,但性能更低。展开评论点赞 - #青训营 x 字节后端训练营#
Day 33 Map的实现
1、读取一般Map的流程:由key通过hash函数得到哈希值,通过hash值计算该哈希值在数组中的索引位置,若该索引为空,则返回空;若该索引位置不为空,则与要查找的key对比,若相等则返回value,若不等则继续判断链表或红黑树中,是否与要查找的key值相等,相等返回该位置的value,不等则返回空。
2、读取Go Map的流程:与一般Map的流程大致相同,主要有两点不同:①要查找的key-value分别存储在两个数组中,然后将这两个数组作为Key-Value对存储在map中;②因为key-value位置不同,等到key索引后还需要进行偏移量的计算才能得到对象的value。(注:Go中若存在哈希冲突,则将多个相同的key的哈希值放在同一个桶Bucker中)展开评论点赞 - #青训营 x 字节后端训练营#
Day 32 数据库基础
1、按照数据结构来组织、存储、管理的仓库称为数据库,相比于文件读写方式更加快速、方便、安全
2、主要分为关系型数据库和非关系型数据库;关系型数据库以MySQL 、Oracle、PostgreSQL为代表,非关系型数据库以Redis、MongoDB为代表
3、数据库的一张表有字段、行、列三个构成,SQL语言分为四部分:DDL(定义)、DML(操作)、DQL(查询)、DCL(控制)
4、SQL语句可以换行,但必须以分号结尾
5、命令不区分大小写,关键字和函数建议大小写
6、数据库主要操作有:
查看数据库 show databases;
创建数据库 create database 库名 default charset=utf8;
删除数据库 drop database 库名;
打开使用数据库 use 库名;
7、数据表操作主要有:
查看表 create table 表名(字段名1 类型,字段名2 类型)engine=innodb default charset=utf8;
创建表 create table if not exists 表名(字段1 类型,字段2 类型);【如果存在不执行,不存在才执行】
删除表 drop 表名
表结构 desc 表名
查看建表语句 show create table user
8、数据的主要操作命令:
插入 insert into 表名(字段1,字段2,字段3) values (值1,值2,值3);
查询 select (字段)from 表名 ;
修改 update 表名 set 字段=字段值 where 条件;
删除 delete from 表名 where 字段名 = 字段值;展开评论点赞 - #青训营 x 字节后端训练营#
Day 31 Redis数据结构
1、Redis是基于内存的,以Key-Value键值对存储数据的非关系型数据库,相对比硬盘,内存的读写速度更快
2、string、list、set、hash等等并不是Redis的数据结构,它们只是保存数据的数据类型,具体的数据,也就是键值对,它们的底层实现才是用到了数据结构
3、string底层基于SDS(动态字符串),len属性存储数据的长度,查询快;不会发生缓存溢出;节省内存
4、list基于链表(quicklist),能够快速的插入和删除操作,可以存储多种类型的数据
5、hash类型基于哈希表,查询速度快,支持动态扩容,支持高并发操作展开评论点赞 - #青训营 x 字节后端训练营#
Day 29 Git的工作使用②
1、git stash命令用于暂停当前分支上的工作并切换到另一条较紧急的分支;主要命令有以下:
git stash 保存当前未提交的代码
git stash save “备注内容” 保存当前未提交的代码并标记注释
git stash list 列出所有stash
git stash clear 清空所有stash
git stash apply 应用最近一次stash
git stash pop 应用最近一次stash之后删除
git stash drop 删除最近一次stash
2、reset --soft命令可以将HEAD指针移动到指定的提交,用于修改历史提交记录;可对push和非push的提交使用,对已push的提交,本地和远程分支会有差异,使用git push -f覆盖reset的提交
3、git revert命令用于撤销指定提交(包括合并提交)所做的更改,并创建一个新的提交来记录该次撤销的操作,这是一种安全的撤销方式,它可以在版本历史记录中保留被撤销的提交,并不是完全删除。
4、git reflog命令用于查看commit的历史操作记录,包括分支切换、合并、提交,但只会显示本地的记录,不会显示远程仓库的任何更改。展开评论点赞 - #青训营 x 字节后端训练营#
Day 29 Git的工作使用
1、Git拉取代码的前置工作:在本机执行ssh-keygen -t rsa -C "你公司内部邮箱地址",rsa代表指定加密算法为RSA,-C参数表示注释信息;输入此命令得到SSH密钥对后,将公钥添加到Git中就完成了。
2、git merge 和 git rebase 的区别:merge将原分支和目的分支合成取并集,会暴保留原有分支和可能产生冲突;rebase是将当前分支移植到目标分支,可能导致原分支结构丢失,也需要解决与目标分支的冲突。
3、使用 git cherry-pick 可以指定获取某段commit
4、git revert命令撤销某次提交的修改,而不是删除,能够很好的管理历史记录
5、git stash 命令用来暂存正在修改的分支到一个栈中,转而处理另外一条分支,用中断的思维应该挺好理解的
6、git alias命令用来给自己常用的Git命令设置简短的别名,提高开发效率展开评论点赞 - #青训营 x 字节后端训练营#
Day 26 访问者模式
1、访问者模式是一种行为型设计模式,它可以在不改变对象结构的前提下,定义对这些对象的新操作。
2、访问者模式主要角色有元素类、访问者类、对象结构。
3、在元素类定义一个Accept方法,接收访问者访问;定义一个具体元素类实现元素类的Accept方法;再定义一个Victor类,实现里面的visit方法;最后定义对象结构,提供Accept方法,遍历调用元素的Accept方法,触发访问者对元素进行操作。最后的最后就是实现了:创建具体元素对象和具体访问者对象,将元素对象添加到对象结构中,调用对象结构的Accept方法。展开评论点赞