Redis-Hyperloglog
Hyperloglog 基数统计
什么是基数: 不重复的元素
A{1,3,5,7,8,7}
基数=5 (1,3,5,7,8)
可以统计一下网站的访问量,但是不包括一个人多次访问只算一次的情况。
传统来说可以使用其他数据模型保存id-count
但是这个方法会造成id保存资源的浪费,所以不可取
而Hyperloglog就只存储count,所以他内存很少
但是Hyperloglog有错误率,挺低的
FLUSHALL 开始。
一些样例123456789101112# 增加数量PFadd mykey a b c d e f g h i j # 计数PFCOUNT mykey # output : 10# mykey2 增加数量PFADD mykey2 i j z x c v b n m# 增加数量pfcount mykey2 # output : 9# 合并 pfmerge destkey sourcekey sourcekey ....pfmerge mykey3 mykey mykey2# 计数pfcount mykey3 # ouput : 15
比较适合于 ...
Redis-geospatial
Redis-geospatial 表示地理位置 经纬度
GEOADD123456789# geoadd 经度 纬度 城市# 规则:两级无法直接添加,一般可以通过配置文件一次性导入geoadd china:city 116.23128 40.22077 beijinggeoadd china:city 121.48941 31.40527 shanghaigeoadd china:city 106.54041 29.40268 chongqinggeoadd china:city 117.20 39.12 tianjing
GEOPOS12345678910# 获取某个城市的地址# geopos key valuegeopos china:city beijing# output : [ { "longitude": 116.23128265142441, "latitude": 40.220769054385265 }]# 可以发现的是,虽然我在之前输入的值只有小数点后五位,但是这次查询的值却有这么多位
...
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 ...