0%

Redis是什么

Redis是基于内存运行的高性能 K-V 数据库

Redis存储位置

内存中,所以效率高

Redis的五种数据结构

  • String:Redis最基本的数据类型,一个键对应一个值,一个键值最大存储512MB
  • set:是String字符串类型的无序集合,也不可重复
  • zset:是String类型的有序集合,也不可重复。有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序
阅读全文 »

MySql存储引擎

Mysql体系结构

  • 连接层
  • 服务层
  • 引擎层
  • 存储层

什么是存储引擎

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

阅读全文 »

channel 是否线程安全?锁用在什么地方?

Golang的Channel,发送一个数据到Channel 和 从Channel接收一个数据都是原子性的。

如果把线程安全定义为允许多个goroutine同时去读写,那么golang 的channel 是线程安全的,因为channel底层数据结构中是带有lock的,不需要在并发读写同一个channe时再加锁。

而且Go的设计思想就是:不要通过共享内存来通信,而是通过通信来共享内存,前者就是传统的加锁(共享内存通信),后者就是Channel。

也就是说,设计Channel的主要目的就是在多任务间传递数据的,这当然是安全的

go channel 的底层实现原理 (数据结构)

总结hchan结构体的主要组成部分有四个:

  • 用来保存goroutine之间传递数据的循环数组:buf
  • 用来记录此循环数组当前发送或接收数据的下标值:sendx(发送队列)和recvx(接受队列)
  • 用于保存向该chan发送和从该chan接收数据被阻塞的goroutine队列: sendq 和 recvq
  • 保证channel写入和读取数据时线程安全的锁:lock
阅读全文 »

什么是GC

垃圾回收就是对程序中不再使用的内存资源进行自动回收的操作。

内存上分配的数据对象,不会再使用时,不会自动释放内存,就变成垃圾,在程序的运行过程中,如果不能及时清理,会导致越来越多的内存空间被浪费,导致系统性能下降。

因此需要内存回收,内存回收分为两种方式:

  1. 手动释放占用内存空间

    可能会出现的问题:
    悬挂指针: 释放的早了,后续对数据的访问就会出错,因为对应的内存空间可能已经清空,重新分配,甚至是归还给操作系统了。
    内存泄漏: 如果忘了释放,一直占用内存,导致内存泄漏。

  2. 自动内存回收

    程序自动检测对象决定是否要回收其内存。

    核心思想:程序中用得到的数据,一定是可以从栈或数据段这些根节点追踪得到的数据,追踪不到的数据,肯定用不到,也就是垃圾。

阅读全文 »