- 博客(34)
- 收藏
- 关注
原创 redis其他的功能
慢查询命令:slowlog get[n] //获取慢查询的队列slowlog len //获取慢查询的长度slowlog reset //清空慢查询的队列什么叫redis的流水线?在redis当中,我们每一次发送一个请求的话,那么每一次都需要命令在网络传输的时间加上执行的时间,然后我们使用一个流,让我们要执行的命令打包一下,一次发送出去,这样就只需要一次网络传输的时间。订阅服务:public channel message //向订阅者发布信息subscribe chan
2021-09-09 14:49:11 221
原创 vim基础命令大全
vimtutor //加入vim的教程vim最常用的是3种模式,为交互,插入,命令模式vim + 文件名 //如果没有这个文件的话,那么就是创建这个文件再用vim打开再输入i之前,按0可以直接将光标为这一行的开头,$定位到最后的一行。w 一个单词一个单词的移动q! 强制退出dd 删除光标所在的那一行(按i之前可用)(剪切)dw 删除从光标到下一个单词之间的内容(按i之前可用)yy 复制当前行到内存当中y$ 复制从光标到行末的所有的单词y0 复制从光标到行首的所有的单词
2021-09-04 16:27:49 315
原创 redis基础
set key value //设置keyget key //获取valuekeys * //得到所有的key 它的时间复杂度为n,一般在生产环境下不使用key h* //其实这里的key的用法已经和正则表达式一样mset //一次设置多个值,形式为 k1 v1 k2 v2dbsize //计算总共多少keyexists //判断一个key是否存在del //删除一个key v expir
2021-09-04 14:50:40 176
原创 go语言实现二叉树
//设置节点type Node struct { Value int Left *Node Right *Node}//设置或者修改的func (node *Node)SetNodeValue (value int) { node.Value = value}//创建一个nodefunc CreateNode(value int) *Node { return &Node{value,nil,nil}}//在2叉树中找到指定的值的节点func (node *Nod
2021-09-01 16:51:18 415
原创 gin会话控制
gin中使用cookie:这里需要了解的是cookie是服务端创建传给客户端,然后客户端在收到cookie之后,每一次向服务端请求的时候,都会带上cookie,这样服务端就能得到客户端的信息,而且不需要客户端每一次都去传递。func main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // 服务端要给客户端cookie r.GET("cookie", func(c *gin.Cont
2021-08-26 11:02:01 221
原创 gin中间件
gin定义一个全局的中间件,需要了解的是定义中间件的语法,并且在定义完中间件之后还需要区注册中间件。注册使用的是r.use()。而且在中间件中使用.set方法可以在后面注册的路由中使用.get来获取。// 定义中间func MiddleWare() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() fmt.Println("中间件开始执行了") // 设置变量到Cont
2021-08-26 09:43:47 343
原创 gin渲染
当我们使用gin框架需要解析一些其他格式的数据的时候,可以这样写代码:也就是在服务端对客户端发送信息的响应。// 多种响应方式func main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // 1.json r.GET("/someJSON", func(c *gin.Context) { c.JSON(200, gin.H{"message": "som
2021-08-26 09:14:48 179
原创 gin数据的解析与绑定
json数据的解析与绑定当客户端传入参数的时候,后端解析并绑定这个参数。用代码来表示:// 定义接收数据的结构体type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Pssword string `form:"password" json:"
2021-08-26 08:56:08 619
原创 gin的路由详解
gin最简单的实践:func main() { // 1.创建路由 r := gin.Default() // 2.绑定路由规则,执行的函数 // gin.Context,封装了request和response r.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "hello World!") }) // 3.监听端口,默认在8080 // Run("里面不指定端口号默认为8080
2021-08-26 08:31:16 4347
原创 go语言解决TCP黏包
为什么会出现粘包?1.由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法。简单来说就是当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去。2.接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据。当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据。解决办法出现”粘包”的关键在于接收方不确定将要传
2021-08-24 17:02:38 631
原创 go 实现udp通信
udp:不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。服务端实现代码:先创建一个用来连接的端口然后直接可以进行写或者读数据func main() { listen, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 30000, }) if err
2021-08-24 16:40:11 3186
原创 go web编程
go语言实现tcp的服务端:先要监听一个指定的端口接收客户端请求建立链接创建goroutine处理链接(这是因为在网络中一般会处理很多条的数据,使用goroutine会快很多)下面是最基本的tcp服务端的建立:// TCP server端// 处理函数func process(conn net.Conn) { defer conn.Close() // 关闭连接 for { reader := bufio.NewReader(conn)
2021-08-24 16:29:04 76
原创 如何实现网页爬虫中的网址链接去重功能
一般在爬取网页的时候,会出现大量重复的数据,这个时候我们一般都会选择用map来进行去重的功能,今天介绍一个新的进行去重的数据结构,位图。如果我们要在1000万个范围在1到1亿的数据中去查询是否包含某个值,那么使用map是可以的,但是会浪费很多的空间,我们可以这样做。申请一块大小为1亿的大小的数组,值为bool,我们将所有的数据都放到数组中,只要有数的,就为true,这样查找只需要我们查询这个值在数组中是否为true。当然这样有点浪费空间,我们还可以进行优化,我们可以用bit位来表示是否存在,bit包含
2021-08-22 11:19:02 285
原创 2021最新Linux从入门到精通(建议收藏,每日更新)
command + control + f2/f3/f4 分别进入tty1/tty2/tty3command + control + f1 回到图形化的界面sudo su 把权限变为根权限之后输入exit 退出根权限whoami 当前是那个用户在操作linuxhostname 当前主机名date 当前时间ls 列出当前目录下的文件Linux中可以使用短命令之间进行连接,command -p -a 和command -pa 是一样的,一般大写和小写是不一样的,并且常
2021-08-17 11:52:10 4976
原创 哈希冲撞是什么?怎么解决?
哈希冲撞其实哈希表这个数据结构就像一个函数一样,传入一个key,返回一个结果经过哈希函数计算的一个值,那么我们的要求就是当我们输入2个相同key的时候,返回的值应该是相同的,当我们输入的key是不同的时候,返回的一个值应该是相同的,这个时候,我们设计的哈希表才算是成功了。但是实践的时候我们会发现,很多时候,我们会发现输入2个不同的key,会返回2个相同的值,这个时候就出现了哈希冲撞。我们解决的方法有2种开放寻址法:只要出现哈希冲撞,就通过重新探测新的位置的方法来解决冲突。当我们向哈希表插入数
2021-08-13 20:25:44 333
原创 mac使用终端来计算sha1
验证sha1openssl sha1 后面加文件的目录就OK验证SHA-256openssl dgst -sha256 /path/to/file验证 MD5openssl md5 /path/to/file都是后面直接加文件的目录就OK,不知道文件具体位置,可以直接把文件拖入到终端里,它会自动给你地址。...
2021-08-11 22:12:21 884
原创 二分查找的四种变种问题
当数组中有重复元素的时候,我们找到数组中的第一个出现的给定值的元素:func TwoSort(arr []int,val int) int { l :=0 r :=len(arr) - 1 for l <=r { mid :=(l + r) / 2 if arr[mid] > val { r = mid -1 }else if arr[mid] < val { l = mid + 1 }else { if mid == 0||arr[mid-1]!
2021-08-11 22:05:20 175
原创 安装一个图形化的centos7的虚拟机系统(含每一步的教程)
先打开这个网址https://www.centos.org/download/下一步根据我们自己处理器的架构去选择下载,inter应该都是第一个,记住我这边选择的是centos 7,当我们点击x86后,会跳出很多的链接让我们选择下载,这个时候我们随便选择一个就OK当我们随机点个后,又会出现很多的链接,让我们选择,这个时候我们选择最后结尾为iso,中间为DVD的链接一般大小为4.5G左右,如下图的第3个。下载完成后我们就已经成功了三分之一,接下来我们打开这个网页:https://www.vi
2021-08-10 23:32:45 305
原创 2021最新go实现二分查找(递归加遍历)
二分查找的时间复杂度:logn。二分查找必须要求数组的是一个已经排列好的数据。链表来使用二分查找也可以,但是时间复杂度很高,是n,所以一般不使用链表二分查找。它一般被使用在有序的数据寻找一个值,但是它也是有局限性的,数据量太大的时候,它需要的数组使用的内存也很大,这样的话就使得资源消耗的过大。二分查找遍历的代码实现:func twoSort(arr []int,target int) int { l:= 0 r:= len(arr) - 1 for l <= r { mid :=
2021-08-10 20:17:56 276
原创 mac安装Homebrew,一条命令即可,不需要任何设置,百分百成功
1 mac简洁版,下载很快,打开终端直接输入:/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" speed2,mac完整版,打开终端直接输入/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"3 linux版本rm Homebrew.sh ; wget
2021-08-09 14:58:39 101
原创 go实现桶排序,基数排序,计数排序
桶排序和计数排序实现原理: 这里直接说一个例子,更容易理解,就是我们要把一百万个数进行排序,我们可以先把这些数分组到一个一个桶里面,如果数都是随机的,比如说范围是1到无限大,那么这个时候我们就需要自己设一点范围,比如1到一万,一万到千万~~将这些数分到桶里之后,我们只需要将桶里面的数进行排序,里面的数排序完之后,拿出来就直接都是排好序了的。我在查资料的时候发现,计数排序就是桶排序的简单版本,例子: 我要查一百万个人的分数,那么我们的分数只有1到100,那么我们可以给每一个分数都划为一个桶,这个时候,就是
2021-08-08 22:28:23 239
原创 2021最新go实现归并排序和快速排序(稳定性,时间复杂度,空间复杂度)
归并排序时间复杂度:nlog(n) (在任何情况下都是这个)缺点 : 它不是一个原地的排序算法空间复杂度 : n+logn (n是申请的切片的空间,logn是递归用的空间)它是一个稳定的排序算法(这个只要在我们代码实现的时候注意一下位置就好)下面是实现代码://归func mergeSort(arr []int) []int { if len(arr) < 2 { return arr } mid := len(arr) / 2 left := mergeSort(arr[:
2021-08-05 15:34:43 450
原创 golang实现3种基本排序(选择排序,冒泡排序,插入排序)及稳定性和复杂度分析
package mainimport "fmt"//遍历数组,把这个数组分为一个已经排序的空间,一个分为没排序的空间//最好时间复杂度为o(n) 最坏为n的平方//平均复杂度为n的平方,它是一个稳定的排序算法func charusort (arr []int) []int { if len(arr) <=1 { return arr } for i :=1 ; i < len(arr) ; i++ { a := arr[i] j :=i - 1 for ; j
2021-08-04 15:28:21 245
原创 2021java基于treemap实现哈希表(有注释和解释)
import java.util.TreeMap;//这整个就是用treemap来实现哈希表 //哈希表实际上就是一个数组 但是这个数组的每个元素都包含了一个treemap 在Java的源码当中//数组包含的是链表 但是在数的不断加入中 链表会改为treemap 因为数的量级比较小的时候 用链表更方便//当数的量级大的时候 用treemap就更方便了//哈希表会将每个我们放入的key变成一个值 这个是通过里面的hash完成的 每个Java的继承了obj obj//会为我们写hashcode方法
2021-04-15 20:27:43 166
原创 2021java基于二叉树实现map
直接贴代码public class treemap <K extends Comparable<K>,V> implements map<K,V>{ private class Node{ public K key; public V value; public Node left,right; public Node(K key,V value){ this.key=ke
2021-04-10 17:24:34 134
原创 2021java基于链表实现map
直接贴代码了哈有啥没有看明白的可以评论一下哦public class LinkdeListMap <K,V> implements map<K,V> { private class Node { public K key; public V value; public Node next; public Node(K key, V value, Node next) { this.
2021-04-10 17:20:33 159
原创 2021leetcode学习目录 (从hot第一道开始) 第一道
import java.util.HashMap;public class Solution {//此题的刷完总结 虽然是第一道 但是也是看了别人的才自己懂了 //思路 先创建一个map 把数组中的值全给map//在第2次循环的时候用map.containsKey来看map中是否含有2个值加起来等于target//如果有的话 直接创建数组 数组就只包含2个下标 public int[] twoSum(int[] nums, int target) {
2021-04-07 17:29:55 79
原创 2021最新Java实现trie树 适合在文章查询单词(基本每行都有注释)
这个有问题留个言哈 谢谢了直接贴代码了import java.util.TreeMap;public class Trietree { //这个树结构的作用是用来查询单词的 在查询的时候的复杂度很低 //node就是里面的节点 节点包括一个布尔类型 和一个treemap //isword的作用是为了 看这个单词在这里有没有完 treemap是为了查看下一个里面包含一个单词和一个node public class Node { public boole
2021-04-07 17:21:33 77
原创 2021最新Java实现线段树(代码都有注释 容易看懂)
接口的代码在这里public interface meige<E> { E meiger(E a, E b);}我的tostring写的很lj 所以tostring需要自己写哈 我这个只有自己看得懂import java.util.Arrays;//线段树底层也是数组 第一个值也就是根就是所有的值的总和(这个需要看自己的设定)我是这样设定的public class sgementTree<E> { private E[] tree; priv
2021-04-05 16:15:48 278 5
原创 用Java实现基本的排序(包括选择排序,冒泡排序,插入排序)
直接给代码块哈最前面的就是给个测试的 大家都不用写了粘贴就完了 正好也可以少打点代码public class numsort { /*选择排序 算法思想:选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换, 接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。 */ public static void main(String[] args) { int[] m = {1, 2, 4, 3, 66, 7};
2021-04-04 18:21:51 89 2
原创 2021java实现归并排序 含递归和非递归(直接复制可用)
所有的介绍也都在代码里希望帮助到大家import java.util.Arrays;//采用递归来实现归并排序public class mesort { public static void main(String[] args) { int [] m={1,34,5,2,55,66}; mesort.sort2(m); for (int value : m) { System.out.println(value);
2021-04-04 18:13:49 185 2
原创 2020年最新对象的创建及使用 看不懂来打我【手动狗头】
对象的创建及使用 看不懂来打我文章目录前言1 对象的创建及使用2 构造方法手动赋值总结自己感悟前言提示:本人也是刚刚学习Java的小菜鸡,每天在博客分享自己的学习心得,希望大家一起交流,一起进步提示:以下是本篇文章正文内容,下面案例可供参考1 对象的创建及使用1 Java语言只需要用new就可以创建对象,与c语言的函数相似,只是叫法不同。2 在创建对象的时候,也就是说在 new 的时候,系统会对实例变量默认赋值。代码如下(示例):public class StudentTest {
2021-01-02 20:35:37 83 1
原创 2020最新final关键字最简洁的总结
final关键字final关键字的基础语法1、final修饰的类无法继承。2、final修饰的方法无法覆盖。3、final修饰的变量只能赋一次值。4、final修饰的引用一旦指向某个对象,则不能再重新指向其它对象,但该引用指向的对象内部的数据是可以修改的。5、final修饰的实例变量必须手动初始化,不能采用系统默认值。6、final修饰的实例变量一般和static联合使用,称为常量。这点在接口中经常使用。 public static final double a = 123456;
2021-01-02 20:33:48 85
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人