Session与Cookie
Cookie
存储在客户端
但用户第一次访问服务端的时候,服务器会生成一小块数据,然后把这个数据发送到浏览器的Cookie中,浏览器进行存储后,下面的每一次请求都会携带Cookie中的内容一起发送到服务器。
当接收到客户端发出的 HTTP 请求时,服务器可以发送带有响应的 Set-Cookie 标头,Cookie 通常由浏览器存储
Cookie持久化==Cookie==可以设置到期日期,因此可以分为 ==Session Cookie== 和==Persistent Cookie==,
如果没有设置到期日期,则把Cookie设置为会话Cookie,会话Cookie会存储在内存中,浏览器关闭即永久丢失
如果设置了到期日期==Expires 和 Max-age==,那么Cookie会在到期日期后过期
所以无论如何都会过期,只是时间长短而已
Cookie的应用
会话管理
登录,购物车,游戏得分或者服务器应该记住的其他内容
...
回溯
回溯#
终于来到回溯了,树真的😔
理论基础#回溯法也可以叫做回溯搜索法,它是一种搜索的方式。
回溯就会有递归,两者相辅相成回溯一般来说就在递归的下面回溯函数 – 递归函数回溯法 是一个纯暴力的搜索,并不🤡有什么技巧,只是一个遍历所有可能性的过程,因此回溯法并不高效回溯法解决的问题:
组合问题:N个数里面按一定规则找出k个数的集合
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
排列问题:N个数按一定规则全排列,有几种排列方式
棋盘问题:N皇后,解数独等等
深度优先遍历问题:如图、树的遍历 所有的回溯法都可以抽象为一个树形结构,通过这些树形结构去理解回溯法会比较容易
一般回溯法的框架如下:
1234567891011func backTracking(....args any) { if 满足结束条件{ 收集结果 return } for 选择 in 选择列表 { 处理节点 backTracking(路径,选择列表) // 递归 回溯,撤销处理结果 ...
MQ
《吃透 MQ 系列》之核心基础篇 - 知乎 (zhihu.com)
深入消息队列MQ,看这篇就够了! - 知乎 (zhihu.com)
Cron
Cron
今天看到Cron,发现他源码比较少,就尝试着看一看
robfig/cron: a cron library for go (github.com)
什么是Cron表达式Cron
虽然源码中跟这个表达式关系不是很深入,但是还是得了解一下==Cron表达式==
==| 秒 | 分 | 时 | 日 | 月 | 周 | 年(可选) |==
在大部分使用cron的场景下, - * / ? 这几个常用字符就可以满足我们的需求了。
==【*】==:每的意思。在不同的字段上,就代表每秒,每分,每小时等。
==【-】==:指定值的范围。比如[1-10],在秒字段里就是每分钟的第1到10秒,在分就是每小时的第1到10分钟,以此类推。
==【,】==:指定某几个值。比如[2,4,5],在秒字段里就是每分钟的第2,第4,第5秒,以此类推。
==【/ ...
Context
小徐先生
godoc
一定要去看源码,不难
context#
context interface{}
cancelCtx struct{}
timerCtx struct{}
valueCtx struct{}
生成各个context:
本质上就是生成一个子context包裹住父context,实现一个复用的作用
12345678910111213141516171819202122232425func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { c := withCancel(parent) return c, func() { c.cancel(true, Canceled, nil) }}func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) { return WithDeadlineCause(parent, d, nil)}func Wi ...
Channel
Channel
==「不要通过共享内存来通信,而应该通过通信来共享内存」==
对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的
发送操作和接收操作中,对元素值的处理是不可分割的
发送操作在完全完成之前会被阻塞,接受操作也是这样
元素值从外界进入通道时会被赋值
1234567891011121314151617181920func CalSquare() { src := make(chan int) dest := make(chan int, 3) go func() { defer close(src) // 延迟关闭 channel for i := 0; i < 10; i++ { src <- i // 把元素放入 src 通道 } }() go func() { defer close(dest) // 延迟关闭 channel for i := range src { // 从 src 通道取出元素 dest < ...
事务
事务
原子性:要么成功,要么失败
一次性:一组命令的集合一次执行
顺序性:入队过程,会按照顺序执行
排他性:执行事务的时候不能被其他东西打扰
Redis单条命令保存原子性,但是事务不保证原子性
Redis事务没有隔离级别的概念,所有的命令在事务中并没有直接被执行。只有发起执行命令的时候才会被执行
开启事务(multi)
命令入队
执行事务 (exec)
1234567891011121314151617multi # okset k1 v1 # queuedset k2 v2 # queuedexec # output : [ { "value": "PONG" }, { "value": "PONG" }, ...]
每次执行完事务需要重新开启事务才能做新的事务
放弃事务12345multi # ok set 1 1 # queuedset 2 2 # queueddiscard # ok exec # output : ERR EXE ...
Redis-Bitmaps
Bitmaps 位图
位运算 只有 0 和 1
主要是可以统计一些 只有两面性的事务
登录和未登录,打卡和未打卡,活跃和不活跃
效率更高!
一些样例123456789101112131415# 假设现在是 存储 一周内的打卡情况# 这个是按位来存储的setbit bit 0 0setbit bit 1 1setbit bit 2 1setbit bit 4 0setbit bit 5 1setbit bit 6 1setbit bit 3 0# 查看某一天的打卡情况getbit bit 1 # 周一打卡#统计打卡的天数bitcount bit 起始 末尾
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 }]# 可以发现的是,虽然我在之前输入的值只有小数点后五位,但是这次查询的值却有这么多位
...