获得徽章 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,没有设置过期时间
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、隔离级别越高,数据可靠性越高,但性能更低。
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中)
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 字段名 = 字段值;
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类型基于哈希表,查询速度快,支持动态扩容,支持高并发操作
Day 31 Redis数据结构
1、Redis是基于内存的,以Key-Value键值对存储数据的非关系型数据库,相对比硬盘,内存的读写速度更快
2、string、list、set、hash等等并不是Redis的数据结构,它们只是保存数据的数据类型,具体的数据,也就是键值对,它们的底层实现才是用到了数据结构
3、string底层基于SDS(动态字符串),len属性存储数据的长度,查询快;不会发生缓存溢出;节省内存
4、list基于链表(quicklist),能够快速的插入和删除操作,可以存储多种类型的数据
5、hash类型基于哈希表,查询速度快,支持动态扩容,支持高并发操作
展开
评论
点赞