06 2023 档案
摘要:添加文档 新增文档的DSL语法如下: POST /索引库名/_doc/文档id { "字段一":"value1", "字段二":"value2", "字段三":{ "子属性1":"value3", "子属性2":"value4" } } 示例: #插入文档 POST /heima/_doc/1 {
阅读全文
摘要:Redis的key最好遵循如下规则设计: 1.遵循基本格式 :业务名称:数据名:ID 2.长度不超过44个字节 3.不包含特殊字符 优点: 1.可读性强 2.避免key冲突 3.方便管理 4.更节省内存:key是string类型,底层编码是int,embstr,raw三种,embstr在小于44个字
阅读全文
摘要:通配符:用来匹配值的一部分的特殊字符 为在搜索子句中使用通配符,必须使用LIKE操作符,like指示mysql,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。 %通配符 %表示任何字符出现的任意次数 select prod_id,prod_name from products where
阅读全文
摘要:mapping属性 mapping是对索引库中文档的约束,常见的mapping属性包括: type:字段数据类型, 字符串:text(可分词的文本),keyword(精确值,例如:品牌,国家,IP地址) 数值:long,integer,short,byte,double,float 布尔:boole
阅读全文
摘要:IK分词器的安装: 我这里是采用在线安装的方式: # 进入容器内部 docker exec -it elasticsearch /bin/bash # 在线下载并安装. /bin/elasticsearch-plugin install https://github.com/medcl/elasti
阅读全文
摘要:Redis的数据库就是使用字典来作为底层实现的,对数据库的增,删,改,查也是构建在对字典的操作之上的。 除了用用来表示数据库之外,字典还用作哈希键的底层实现之一,当一个哈希键包含的键值对比较多,又或者键值对中元素都是比较长的字符串时,Redis就会使用字典作为哈希键的底层实现。 Redis的字典使用
阅读全文
摘要:select prod_id,prod_name,prod_price from products where vend_id = 1003 and prod_price <= 10; 输出结果: + + + + | prod_id | prod_name | prod_price | + + +
阅读全文
摘要:IntSet是redis集合的一种实现方式,基于整数数组来实现,并且具备长度可变,有序等特征; 整数集合的实现 typedef struct intset{ //编码方式 uint32_t encoding; //集合包含元素的数量 uint32_t length; //保存元素的数组 int8_t
阅读全文
摘要:Redis中保存的key是字符串,value往往是字符串或者字符串的集合,但是redis并没有直接使用c语言中的字符串 原因在于: 1.获取字符串长度需要通过运算 2.非二进制安全 3.不可修改 SDS struct sdshdr{ //记录buf数组中使用字节的数量 //等于SDS所保存字符串的长
阅读全文
摘要:Redis通用命令介绍: KEYS:查看符合模版的所有key, DEL:删除一个指定的KEY EXISTS:判断KEY是否存在 EXPIRE:给一个key设置有效期,有效期到期时该KEY会自动删除 TTL:查看一个key到剩余有效期 示例: 127.0.0.1:6379> exists test_k
阅读全文
摘要:关键字:where 这里只说明不匹配的用法,其他的较为简单,不予叙述。 select vend_id,prod_name from products where vend_id <> 1003; 输出结果: + + + | vend_id | prod_name | + + + | 1001 | .
阅读全文
摘要:重点关键字:order by 排序单列数据: select prod_name from products order by prod_name; 输出结果: + + | prod_name | + + | .5 ton anvil | | 1 ton anvil | | 2 ton anvil |
阅读全文
摘要:首先给出本次教程需要用到的数据表的内容:products + + + + + + | prod_id | vend_id | prod_name | prod_price | prod_desc | + + + + + + | ANV01 | 1001 | .5 ton anvil | 5.99 |
阅读全文
摘要:在阅读博客文章时,你可以看到一篇文章被阅读的次数,如果使用mysql, 那么在设计article表时,就必须设置一个view_count字段来记录这篇文章被阅读的次数。 但这种方式相比于使用redis,并不是一种好的办法,原因在于,每次更新view_count字段的值都是一个比较费力的过程。 首先,
阅读全文
摘要:简述布隆过滤器的实现思路: 假设有一个长度为n的比特数组,bit_array,数组里的每一位都是0,对于一个url或者是其他数据,使用hash算法计算出url的散列值,这个散列值当然是一个整数,暂且命名为index,index=index%n,确保index的值小于n,查看bit_array[ind
阅读全文
摘要:有序集合也是集合,不同之处在于,集合里的元素可以附带这个分数,元素不能重复,但是分数可以重复,不仅如此,还可以根据分数进行排序。 很多游戏都有玩家得分的排行榜,这个排行榜随时处于变动中。 游戏有很多玩家,可以设计一张表,记录每一个玩家的分数,并根据玩家新一局的分数来更新这张表,当需要获取排行榜前10
阅读全文
摘要:缓存可以有效的提高关键数据的获取速度,使得不必要每次查询数据库,避免了数据库被击穿。 主动更新: 需要知道这份数据的实效时间点,然后在那个时间点到来时重新更新数据,可能是查询数据库,也可能是访问第三接口,在获得数据之后,更新redis缓存。 被动更新: 程序每次都去redis获取数据,但对这份数据设
阅读全文
摘要:如何使用pipeline: from redis.client import Redis conn = Redis(host="0.0.0.0",port=6379,db=0,password="") with conn.pipeline() as p: for i in range(100): p
阅读全文
摘要:首先,通过pip来安装操作redis的相关包,pip install redis 然后导入我们要使用的模块,form redis.Client import Redis 然后,通过docker启动redis, from redis.client import Redis r = Redis(host
阅读全文
摘要:首先说明一下原理:前后协程之间通过通道去相互限制,后一个线程尝试去获取一个channel的值,当channel中没有值时,就会一直阻塞,而前一个协程则负责关闭channel,当前一个协程完成了这个操作,后一个协程才可以结束阻塞,继续执行。 示例代码: package main import ( "f
阅读全文
摘要:我们知道,对于一个已经关闭的channle来说,如果channel内部还有值的话,可以继续执行读操作,读出channel里的元素,但是不能执行写操作; 相反,如果关闭后,channel里已经没有元素可读的情况,再执行读操作的话会读出channel的零值,同样,也不能执行写操作。 首先,先让我们通过代
阅读全文
摘要:首先,如果对于一个已经关闭的channel来说,如果此时channel里还有值,则会正确读到channel里的值,且返回的第二个bool值为true;如果关闭前,channel里的值已经被读完,则最后返回的则是channel的零值; 那么针对该问题,我们通过代码来验证一下: package main
阅读全文
摘要:在go语言中,数组变量属于值类型,因此当一个数组变量被复制或者传递时,实际上会复制整个数组。eg,将a赋值给b,修改a中的元素,并不会修改b中的元素。为了避免复制数组,一般会传递指向数组的指针。 package main import "fmt" func main() { a := [...]in
阅读全文
摘要:很多网站都实现了“推送”功能,都会用到轮训这个技术,轮询就是每隔一段时间客户端就向服务器发送请求,来获得最新的数据。这种方式的缺点十分明显,浏览器每次发出的请求都含有比较大的header数据,浪费带宽资源。在这种背景下,HTML5定义了websocket协议,能够更好的节省服务器资源和带宽,而且可以
阅读全文
摘要:关于在golang中的中间件,可以翻阅笔者之前的博客,在这里不予详细说明。这里简单介绍下中间件的高级用法: 1.如果每个路由分别要配置多个中间价,该如何处理 2.如果有多个路由分别要配置多个中间件,该如何处理 3.尝试不定义结构体开发中间件 package main import ( "contex
阅读全文
摘要:题目描述:给定两个字符串str1和str2,输出两个字符串的最长公共子串 abcde bebcd == > bcd 实现代码: 实现代码 public class MaxSubString { public static void main(String[] args){ String st1 =
阅读全文
摘要:Go标准库的Cond目的是:为等待/通知场景下的并发问题提供支持。Cond通常应用于等待某个条件的一组goroutine,等条件变为true的时候,其中一个goroutine或者所有的goroutine都会被唤醒。 Cond是和某个条件相关,这个条件需要一组goroutine协作共同完成,当条件还没
阅读全文
摘要:1.Lock/Unlock 没有成对出现,就意味着会出现死锁的情况,或者是因为 Unlock 一个未加锁的 Mutex 而导致 panic。 2.第二种误用是 Copy 已使用的 Mutex。 Package sync 的同步原语在使用后是不能复制的。原因在于,Mutex 是一个有状态的对象,它的
阅读全文
摘要:互斥锁的实现机制 互斥锁是并发控制的一个手段,是为了避免竞争而建立的一种并发控制机制。在并发编程中,如果程序中的一部分会被并发访问或修改,那么,为了避免并发访问导致的意想不到的结果,这部分程序需要被保护起来,这部分被保护起来的程序,就叫做临界区。可以说,临界区就是一个被共享的资源,或者说是一个整体的
阅读全文
摘要:什么是WaitGroup? WaitGroup解决的就是并发-等待问题:现在有一个goroutineA在检查点等待一组goroutine全部完成,如果 在执行任务的这些goroutine还没全部完成,那么goroutine A就会阻塞在检查点,知道所有goroutine都完成后才能继续执行。 Gol
阅读全文
摘要:中文文档:https://gorm.io/zh_CN/ 我们知道,在使用gorm的时候,如果我们使用了gorm内置的model,会存在一个delete_at字段,当我们删除一条数据,这条数据并不会在数据库中被彻底删除 举个例子: 数据库中的数据如下: 现在通过实现的接口,去删除id=402的数据,在
阅读全文