Redis-Zset
Zset 有序集合
score - value 然后可以通过score来进行排序
flushall 开始。
一批操作1123456789101112131415161718192021222324252627flushallkeys *zadd zset 1 one 2 two 3 three # 批量添加值zrange zset 0 -1 # 展示值------------------------------------------------------------flushallzadd salary 100 a 200 b 300 ckeys *# zrangebyscore zset min max 只能写最小到最大zrangebyscore salary -inf +inf # 通过score排序,并显示value-- 加上scorezrangebyscore salary -inf +inf withscores # 通过score排序,并显示key-value------------------------------------------------ ...
Redis-Hash
key - map[key]{value}
key - { key - value }
flushdb 开始。
添加/显示123456789# 添加 hset hash field1 value1 field2 value2 ...hset hash 1 one 2 two 3 threehmset hash 1 one 2 two 3 three #其实我不加m他也可以多个读取,不知道为啥,能用就行hsetnx hash 1 one ....# 获取某一个hash值hget hash 1 # output : one hmget hash 1 2 3 # output : one two three # 但是这里想要获取多个key就需要加m,qqgg# 获取所有的值hgetall hash # output : 1-one 2-two 3-three
删除123# 请根据上面的的context进行下面的操作hdel hash 1hgetall # 2-two 3-three
获取长度确切来说是明白一个哈希中有多少个key
1hlen hash # output : ...
Redis-Set
set中的值是无序不重复的集合
set的操作以 s 开头
flushall 开始下面的操作。
添加1234sadd myset "hello"sadd myset "world "sadd myset "hello" # 因为不能重复,所以这个值不会被添加smembers myset # 查看的命令
查看123456# 查看所有成员smembers myset# 查看某个value是不是set中的成员 sismember set value sismember myset hello# 查看set集合中的个数scard myset
移除123# srem srem myset hellosmembers myset
随机抽取可以应用于一些抽奖的环节
12345678# 做些准备sadd myset 1 2 3 4 5 6 7 8 9smembers myset# srandmembersrandmember myset# 随机删除keyspop myset
将一个指定的值移动到另外一个set中1smove m ...
Redis-List
List - 列表 ,底层的实现是链表,所以不推荐对中间操作
可以把他用作 栈 , 队列
一般List的操作,都会在操作前加一个’ l ‘或者 ‘ r ‘ , 其实很好理解’l’就表示左边进出;’r’就表示右边进出
进出1234567891011121314151617181920flushdb# lpush 左边进 rpush 右边进lpush list1 one two three # lrange 查看 (0 -1表示所有且左闭右闭)lrange list1 0 0 # output three 可见lpush就是每次在左边塞入一个值 three two one lrange list1 0 -1 # output three two one #################################################################flushdb # output : ok keys * # output : list1 rpush list2 one two three # output: 3lrange list2 0 0 # ou ...
Redis-String
普通
set key value
get key
以及上一篇写的一些指令
追加字段123456789# append# 如果要加入空格,就要使用 " "flushall # 清空所有数据库set name hello get name # output : helloappend name " world" get name # output: hello worldappend name world get name # output : hello worldworld
获取字符串长度1strlen key
自增123456789101112# 自增1set views 0incr viewsincr viewsget views-- output : 2# 自增其他数量incrby views 10# 自减和自增相同decr / decrby
获取特定序列下的字符串闭区间–左闭右闭
1234set name "hello,world"# GETRANGE key start endGETRANGE n ...
init函数
背景
我在测试某个文件的时候,文件的具体内容没有错误,但是会报错invalid memory(空指针引用),debug后发现是log.Logger == nil ,但是我的Logger是放在init函数中的,没道理没有初始化,由此我查了GPT想到了目录相关的路径依赖问题,但是很快NX就帮我否决了,我自己想想也是,怎么可能是路径问题,NX还问我了一个问题
1234567891011121314151617181920212223242526272829// 附上代码// tiktok/common/oss/oss_test.go 中func TestNew(t *testing.T) { log.Init() AliyunInit() CreateBucket("simple-tiktok-app") log.Logger.Info("TestNew is success") fmt.Println("TestNew is success")}// tiktok/common/oss/ ...
二叉树
理论基础
满二叉树父节点下面 两个子节点都存在
深度为K , 有2^k-1个结点
完全二叉树除最底层节点不全,其他层节点都是满的
同时最底层从左往右不能断掉
二叉搜索树有数值
所有左子树上的节点小于根节点
所有右子树的节点大于根节点
平衡二叉搜索树在前者的基础上
加一条:左右子树的高度差绝对值不超过1
表现123456Definition for a binary tree node.type TreeNode struct { Val int Left *TreeNode Right *TreeNode}
二叉树的前序遍历1234567891011121314func preorderTraversal(root *TreeNode)[]int{ vals := make ([]int,0) var preorder func(*TreeNode) preorder = func(node *TreeNode) { if node == nil { retur ...
日志设计封装
引言设计日志包,干货
一直对日志的包装非常好奇,但是不会写,下面就随便讲一下我抄的这个代码
(下面代码纯属是我抄过来的,学习学习)
整体代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125package logimport ( "github.com/natefinch/lumberjack" "github.com/sirupsen/logrus" "go.uber.org/zap" "go.uber.org/z ...
测试
不得不说,学这个之前我只会APIfox点一点……
回归测试:质量保证人员手动测试项目可用性(刷抖音、看评论)top1
集成测试:对系统功能的测试(对暴露的接口自动化测试)top2
单元测试:开发者对单独的函数模块测试 top3
单元测试规则
所有测试文件都以 _test.go 结尾
测试函数写成 func TextXxx(t *testing.T)
初始化逻辑放到 TestMain 中(准备测试的数据->跑测试->释放资源)
123└─test print.go print_test.go
如果要测试print.go中的函数输出是否正确
123456// print.gopackage testfunc HelloTom() string { return "John"}
然后建立print_test.go,其实这个时候会发现这个吉祥物就有点不一样,而且整个goland文件有入口可以运行了,而不是只能从main.go进入,下面就填写Testxxxx(T &testint.T){}
最后三角 ...
Goroutine
Goroutine
并发x并行x串行并发: 并发是一个核运行多线程程序,说人话就是一个程序分为好多个子程序,然后一个人干,这个人一会干这个一会干那个,类似于ABCBCABCA….这样子干,因为计算机运行速度很快,就给人一种“多线程”的感觉,一个人在同时做很多事情
并行: 并行就是多核运行多线程程序,说人话就是多个人一起干多个程序
串行: 多线程程序中,要先干完线程A,再干线程B……
并发就是一个人同时吃三个馒头,并行是三个人吃三个馒头
在Go实战中描述
并行是让不同的代码片段在不同的物理处理器上执行,关键是同时做很多事情
并发是指同时管理很多事情,这些事情可能做了一半就被暂停就去做别的事情了
一般来说,我们总觉得并行更好,因为他多步进行,但是事实上操作系统上的资源总是少得可怜,从”使用较少的资源做更多的事情”的哲学出发,并发只使用了很少的资源,却能够管理很多事情,注意这里是管理。
线程和协程线程: 内核态,线程跑多个协程,栈MB级别
协程: 用户态,轻量级线程,栈KB级别
没啥好理解的,反正协程就是轻量
12345678910func hello(i int) { ...