go学习redis的学习与使用
文章目录
- 一、redis的学习与使用
- 1.Redis的基本介绍
- 2.Redis的安装下载安装包即可
- 3.Redis的基本使用
- 1)Redis的启动:
- 2)Redis的操作的三种方式
- 3)说明:Redis安装好后,默认有16个数据库,初始默认使用0号库,编号0...15
- 4.Redis的五大数据类型和CRUD操作
- 1)Redis的五大数据类型是:**String(字符串)**、**Hash(哈希)**、**List(列表)**、**Set(集合)**和**zset(sorted set :有序集合)**
- 2)String
- 3)Hash
- 4)List
- 5)Set
- 二、go操作redis
- 1、安装第三方开源的redis库
- 2、使用go语言开始进行操作
- 1)操作string
- 2)操作hash
- 3)批量操作Set/Get数据
- 4)给数据设置有效时间
- 5)课堂练习
- 6)Redis连接池
一、redis的学习与使用
1.Redis的基本介绍
1).Redis是NoSQL数据库,不是传统的关系型数据库
官网: http://redis.io/ 和http://www.redis.cn/
2).Redis:REmote DIctionary Server(远程字典服务器),Redis的性能非常高,单机可以达到15W gps.通常适合做缓存,也可以持久化
3)是完全开源免费的,高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化Nosql数据库,是最热门的NoSql数据库之一,也称为数据结构服务器
2.Redis的安装下载安装包即可
网址:https://github.com/tporadowski/redis/releases
下载好后的目录结构,其中有两个是redis的关键文件
redis客户端文件:redis-cli.exe
redis服务器文件:redis-server.exe

redis结构示意图

3.Redis的基本使用
1)Redis的启动:
启动Redis的服务器端程序(redis-server.exe),直接双击即可运行

2)Redis的操作的三种方式

说明:
1)使用telnet操作Redis
2)使用redis-cli.exe操作Redis,双击即可进入客户端
3)Golang操作redis
redis基本指令
http://redisdoc.com(已失效)


3)说明:Redis安装好后,默认有16个数据库,初始默认使用0号库,编号0…15
-1.添加key-val [set]
-2.查看当前redis的所有key [key * 获取key对应的值[get key]
-3.切换redis数据库[select index]
-4.如何查看当前数据库的key-val数量[dbsize]

-5.清空当前数据库的key-val和清空所有数据库的key -val[flush db flushall]
4.Redis的五大数据类型和CRUD操作
1)Redis的五大数据类型是:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和zset(sorted set :有序集合)
2)String
(字符串)-介绍
-1.string是redis的基本类型,一个key对应一个value
-2.string是类型是二进制安全的。除普通的字符串外,也可以存放图片数据。
-3.redis中字符串value最大值是512M
举例,存放一个地址信息:
address北京天安门
说明:
key :address
value : 北京天安门
127.0.0.1:6379> set address beijing
OK
127.0.0.1:6379> get address
"beijing"
127.0.0.1:6379>
-4.String(字符串)-CRUD
举例说明Redis的String字符串的CRUD操作
set如果存在就相当于修改,不存在就是添加 /get/del
127.0.0.1:6379> del address
(integer) 1
127.0.0.1:6379> get address
(nil)
127.0.0.1:6379>
-5.String(字符串)-使用细节和注意事项
- setex(set with expire)键秒值
127.0.0.1:6379> setex mess01 10 hello,you
OK
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
(nil) //mess01有效期就10秒,10秒后就销毁
127.0.0.1:6379>
- mset[同时设置一个或多个key-value对]
MSET key vlaue [key value …]
同时设置一个或多个key-value对
如果某个给定key值已经存在,那么MSET会用新值覆盖原来的旧值
127.0.0.1:6379> mset worker01 tom worker02 scott
OK
127.0.0.1:6379> get worker01
"tom"
127.0.0.1:6379> get worker02
"scott"
127.0.0.1:6379> mget worker01 worker02
1) "tom"
2) "scott"
3)Hash
(哈希,类似于golang里的Map)-介绍
Redis hash是一个键值对象集合。var user1 map[string]string
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
举例。存放一个User信息
user1 name 张三 age 10
说明
key : user1
name 张三 和 age 30 就是两对 field-value
实操:演示添加user的信息案例(name age job)
127.0.0.1:6379> hset user1 name "smith"
(integer) 1
127.0.0.1:6379> hset user1 age 30
(integer) 1
127.0.0.1:6379> hset user1 job "golang coder"
(integer) 1
127.0.0.1:6379> hget user1 name
"smith"
127.0.0.1:6379> hget user1 age
"30"
127.0.0.1:6379> hget user1 job
"golang coder"
127.0.0.1:6379>
Hash使用细节和注意事项
在给user设置name和age时,前面我们是一步一步设置,使用hmset和hmget可以一次性来设置多个field的值和返回多个field的值
127.0.0.1:6379> hmset user2 name jerry age 110 job "java coder"
OK
127.0.0.1:6379> hmget user2 name age job
1) "jerry"
2) "110"
3) "java coder"
127.0.0.1:6379>
hlen统计一个hash有几个元素
127.0.0.1:6379> hlen user2
(integer) 3
127.0.0.1:6379>
hexists key field
查看哈希表key中,给定域field是否存在
127.0.0.1:6379> hexists user2 name
(integer) 1
127.0.0.1:6379>
4)List
-1.(列表)-介绍
列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表头部(左边)或者尾部(右边)
List的本质是一个链表,List的元素的有序的,元素的值可以重复
举例,存放多个地址信息
city 北京 天津 上海
说明
北京 天津 上海 就是三个元素
127.0.0.1:6379> lpush city beijing shanghai tianjing
(integer) 3
127.0.0.1:6379> lrange city 0 -1(0表示开头 -1表示尾部)
1) "tianjing"
2) "shanghai"
3) "beijing"
127.0.0.1:6379>
-2.关于list的基本命令介绍
lpush:从左边插入数据
rpush:从右边插入数据
lrange: 用法 lrange key start stop :返回列表key中指定区间内的元素,区间以偏移量start和stop指定,下标(index)参数start和stop都是以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用函数负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推
lpop :从我们列表的左边弹出一个数据
rpop :从我们列表的右边弹出一个数据
del : 删掉这个列表
实战演示
127.0.0.1:6379> lpush herolist aa bb cc
(integer) 3
127.0.0.1:6379> lrange herolist 0 -1
1) "cc"
2) "bb"
3) "aa"
127.0.0.1:6379> rpush herolist dd eee
(integer) 5
127.0.0.1:6379> lrange herolist 0 -1
1) "cc"
2) "bb"
3) "aa"
4) "dd"
5) "eee"
127.0.0.1:6379> lpop herolist
"cc"
127.0.0.1:6379> lrange herolist 0 -1
1) "bb"
2) "aa"
3) "dd"
4) "eee"
127.0.0.1:6379> rpop herolist
"eee"
127.0.0.1:6379> lrange herolist 0 -1
1) "bb"
2) "aa"
3) "dd"
127.0.0.1:6379> del herolist
(integer) 1
127.0.0.1:6379> lrange herolist 0 -1
(empty list or set)
127.0.0.1:6379>
-3.List-使用细节和注意事项
(1)index,按照索引下标获得元素(从左到右,编号从0开始)
(2)LLEN key ,返回列表key的长度,如果key不存在,则key被解释为一个空列表,返回0
(3)List的其他说明
- List数据,可以从左或者右,插入添加
- 如果值全移除,对应的键也就消失了
5)Set
(集合)-介绍
Redis的Set是string类型的无序集合。
底层是HashTble数据结构,Set也是存放很多字符串元素,字符串元素是无序的,而且元素的值不能重复
举例,存放多个邮件列表信息
email sggg@sohu.com tom@sohu.com
说明
key :email
sggg@sohu.com tom@sohu.com 这两个就是元素
关于set的基本命令
sadd :添加元素
smembers :取出所有值
sismember :判断是否存在该成员
srem :删除指定值
127.0.0.1:6379> sadd emails tom@sohu.com jack@qq.com
(integer) 2
127.0.0.1:6379> smembers emails
1) "tom@sohu.com"
2) "jack@qq.com"
127.0.0.1:6379> sadd emails kk@yy.com uu@qq.com
(integer) 2
127.0.0.1:6379> smembers emails
1) "uu@qq.com"
2) "tom@sohu.com"
3) "jack@qq.com"
4) "kk@yy.com"
127.0.0.1:6379> sadd emails jack@qq.com
(integer) 0 //0表示添加失败,因为set的元素是不可以重复的
127.0.0.1:6379> sismember emails tom@sohu.com
(integer) 1 //查看set里面是否含有tom@souhu.com这个元素 1代表存在 0代表不存在
127.0.0.1:6379> sismember emails tom~@sohu.com
(integer) 0
127.0.0.1:6379> srem emails tom@sohu.com
(integer) 1 //演示删除元素
127.0.0.1:6379> smembers emails
1) "kk@yy.com"
2) "uu@qq.com"
3) "jack@qq.com"
127.0.0.1:6379>
二、go操作redis
1、安装第三方开源的redis库
1)使用第三方开源的redis库:github.com/garyburd/redigo/redis
2)在使用redis前,先安装第三方Redis库,在GOPATH路径下执行安装指令:
D:\myfile\go\project>go get github.com/garyburd/redigo/redis
3)安装之后,可以看到如下包

特别说明:在安装Redis 库之前,确保已经安装并配置了git,因为是从github上下载安装库的,需要使用到git
2、使用go语言开始进行操作
Set/Get接口
1)操作string
说明:通过golang添加和获取key-value【比如name-tom~】
package main
import ("fmt""github.com/garyburd/redigo/redis"
)func main() {//通过go向redis写入数据和读取数据//1.连接到redisconn,err := redis.Dial("tcp","127.0.0.1:6379")if err != nil {fmt.Println("redis.Dial err=",err)return}defer conn.Close() //关闭//2.通过go向redis写入数据string [key-val]_, err=conn.Do("Set","name","tomjerry毛毛和老鼠")if err != nil {fmt.Println("set err=",err)return}//3.通过go向redis读入数据string [key-val]r, err :=redis.String(conn.Do("Get","name"))if err != nil {fmt.Println("Get err=",err)return}//返回的r是interfacce{}//因为name对应的值是字符串,因此我们需要转换[在一开始就用redis提供的方法进行转换]//nameString := r.(string) errofmt.Println("操作成功!",r) //操作成功! tomjerry毛毛和老鼠
}
2)操作hash
说明:通过Golang对redis操作Hash数据类型
package main
import ("fmt""github.com/garyburd/redigo/redis"
)
func main() {//通过go向redis写入数据和读取数据//1.连接到redisconn,err := redis.Dial("tcp","127.0.0.1:6379")if err != nil {fmt.Println("redis.Dial err=",err)return}defer conn.Close() //关闭//2.通过go向redis写入数据string [key-val]//写入名字_, err=conn.Do("HSet","user01","name","john")if err != nil {fmt.Println("hset err=",err)return}//写入age_, err=conn.Do("HSet","user01","age",10)if err != nil {fmt.Println("hset err=",err)return}//3.通过go向redis读入数据string [key-val]r1, err :=redis.String(conn.Do("HGet","user01","name"))if err != nil {fmt.Println("hGet err=",err)return}r2, err :=redis.Int(conn.Do("HGet","user01","age"))if err != nil {fmt.Println("hGet err=",err)return}fmt.Printf("操作成功! r1=%v,r2=%v\n",r1,r2) //操作成功! r1=john,r2=10
}
3)批量操作Set/Get数据
说明:通过Golang对Redis操作,一次操作可以Set/Get多个key-val数
package main
import ("fmt""github.com/garyburd/redigo/redis"
)
func main() {//通过go向redis写入数据和读取数据//1.连接到redisconn,err := redis.Dial("tcp","127.0.0.1:6379")if err != nil {fmt.Println("redis.Dial err=",err)return}defer conn.Close() //关闭//2.通过go向redis写入数据string [key-val]//写入名字和年龄_, err=conn.Do("HMSet","user02","name","tom","age",19)if err != nil {fmt.Println("HMSet err=",err)return}//3.通过go向redis读入数据string [key-val]r, err :=redis.Strings(conn.Do("HMGet","user02","name","age"))if err != nil {fmt.Println("hGet err=",err)return}// fmt.Printf("r=%v\n",r) //r=[tom 19]for i,v := range r {fmt.Printf("r[%d]=%v\n",i,v)}}
4)给数据设置有效时间
说明:通过golang对redis操作,给key-value设置有效时间
core code
//给name数据设置有效时间10s
_,err =c.Do("expire","name",10)
5)操作List
说明:通过golang对redis操作list数据类型
corecode
_,err=c.Do("lpush","herolist","no1.宋江",30,"no2.吴用",28)
5)课堂练习

package main
import ("fmt""github.com/garyburd/redigo/redis"
)func main() {var names stringvar ages intvar skills string//1.连接到redisconn,err := redis.Dial("tcp","127.0.0.1:6379")if err != nil {fmt.Println("redis.Dial err=",err)return}defer conn.Close() //关闭fmt.Println("请输入names: ")fmt.Scan(&names)fmt.Println("请输入ages: ")fmt.Scan(&ages)fmt.Println("请输入skills: ")fmt.Scan(&skills)//go操作redis进行写的操作_, err=conn.Do("HMSet","monster","name",names,"age",ages,"skill",skills)if err != nil {fmt.Println("HMSet err=",err)return}//go操作redis进行读的操作r, err :=redis.Strings(conn.Do("HMGet","monster","name","age","skill"))if err != nil {fmt.Println("HMGet err=",err)return}for i,v := range r{fmt.Printf("r[%d]=%v\n",i,v)}fmt.Println("操作完成")}
6)Redis连接池
说明:通过Golang对redis的操作,还可以通过redis连接池,流程如下
-1.事先初始化一定数量的连接,放入到连接池
-2.当go需要操作redis时,直接从redis连接池取出连接即可
-3.这样可以节省临时获取redis连接的时间,从而提高效率
core code
var pool *redis.Pool
pool = &redis.Pool{MaxIdle:8MaxActive:0IdleTimeout:100Dial:func()(redis.Conn,error){return redis.Dial("tcp","localhost:6379")},
}
c :=pool.Get()
-4.示意图

package main
import ("fmt""github.com/garyburd/redigo/redis"
)
//定义一个全局的pool
var pool *redis.Pool//当启动程序时就初始化连接池
func init() {pool = &redis.Pool{MaxIdle:8, //最大空闲连接数MaxActive:0,//表示和数据库的最大连接数,0表示没有限制IdleTimeout:100,//最大空闲时间Dial:func()(redis.Conn,error){//初始化连接的代码。连接哪个ipreturn redis.Dial("tcp","localhost:6379")},}
}
func main() {//先从pool池取出一个连接conn := pool.Get()defer conn.Close()_, err :=conn.Do("Set","name","汤姆猫~~")if err != nil {fmt.Println("conn.Do err=",err)return}//取出r,err :=redis.String(conn.Do("Get","name"))if err != nil {fmt.Println("conn.Do err=",err)return}fmt.Println("r=",r)}
相关文章:
go学习redis的学习与使用
文章目录 一、redis的学习与使用1.Redis的基本介绍2.Redis的安装下载安装包即可3.Redis的基本使用1)Redis的启动:2)Redis的操作的三种方式3)说明:Redis安装好后,默认有16个数据库,初始默认使用0…...
娱乐新拐点:TikTok如何改变我们的日常生活?
在数字时代的浪潮中,社交媒体平台不断涌现,其中TikTok以其独特的短视频内容在全球范围内掀起了一场娱乐革命。本文将深入探讨TikTok如何改变我们的日常生活,从社交互动、文化传播到个人创意表达,逐步改写了娱乐的新篇章。 短视频潮…...
【Nginx】Nginx了解(基础)
文章目录 Nginx产生的原因Nginx简介Nginx的作用反向代理负载均衡策略动静分离 Nginx的Windows下的安装Linux下的安装Nginx常用命令 负载均衡功能演示 Nginx产生的原因 背景 一个公司的项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发…...
十九)Stable Diffusion使用教程:ai室内设计案例
今天我们聊聊如何通过SD进行室内设计装修。 方式一:controlnet的seg模型 基础起手式: 选择常用算法,抽卡: 抽到喜欢的图片之后,拖到controlnet里: 选择seg的ade20k预处理器,点击爆炸按钮,得到seg语义分割图,下载下来: 根据语义分割表里的颜色值,到PS里进行修改: 语…...
虚拟机VMware安装centos以及配置网络
目录 1、CentOS7的下载2、CentOS7的配置3、CentOS7的安装4、CentOS7的网络配置 4.1、自动获取IP4.2、固定获取IP 5、XShell连接CentO 准备工作:提前下载和安装好VMware。VMware的安装可以参考这一篇文章:VMware15的下载及安装教程。 1、CentOS7的下载 …...
call 和 apply:改变对象行为的秘密武器(上)
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
工作中 docker 的使用积累
2 进入 openwrt 容器 docker exec -it openwrt /bin/sh3 查看 docker 信息 docker info4 启动容器 4 挂载 overlay mount -t overlay overlay -o lowerdirA:B,upperdirC,workdirworker /tmp/test -t overlay : 指定要挂载的文件系统类型为 overlayoverlay: 指定…...
初识SpringSecurity
目录 前言 特点 快速开始 导入依赖 运行项目 访问服务 权限控制 实现UserDetails接口 添加SecurityConfig配置类 测试接口DemoController 设置权限控制authorizeHttpRequests 结果分析 总结 前言 Spring Security是一个强大且高度可定制的身份验证和访问控制框架…...
大数据讲课笔记1.4 进程管理
文章目录 零、学习目标一、导入新课二、新课讲解(一)进程概述1、基本概念2、三维度看待进程3、引入多道编程模型(1)CPU利用率与进程数关系(2)从三个视角看多进程 4、进程的产生和消亡(1…...
技术点:实现大文件上传
大文件上传 实现思路 对于大文件上传考虑到上传时间太久、超出浏览器响应时间、提高上传效率、优化上传用户体验等问题进行了深入探讨,以下初略罗列各个知识点的实现思路: 大文件上传对文件本身进行了文件流内容 Blob 的分割,使用 Blob.pr…...
记一次挖矿病毒的溯源
ps:因为项目保密的原因部分的截图是自己在本地的环境复现。 1. 起因 客户打电话过来说,公司web服务异常卡顿。起初以为是web服务缓存过多导致,重启几次无果后觉得可能是受到了攻击。起初以为是ddos攻击,然后去查看web服务器管理…...
day05-报表技术-图形报表
1、图表报表简介 在大数据时代,人们需要对大量的数据进行分析,帮助用户或公司领导更直观的察觉差异,做出判断,减少时间成本,而在web项目中除了表格显示数据外,还可以通过图表来表现数据,这种…...
【Spring】@Transactional事务属性详解
文章目录 1、事务传播行为注意事务传播行为在不同类之间调用生效Propagation.REQUIRED(默认传播行为)Propagation.REQUIRES_NEWPropagation.NESTED 2、事务的隔离级别隔离级别设置 3、设置事务异常回滚3.1、默认情况3.2、设置回滚异常3.3、设置不回滚的异常 4、超时时间5、只读…...
通过css3的锚定滚动属性,实现分页加载时让滚动条不闪动
html标签 <div scroll"handleScroll" id"list-container"style"overflow-anchor:auto;overflow-y: auto;height: 80vh"><ul id"talks"v-for"(item,index) in msgList":key"item.roleiditem.timeitem.conten…...
使用Selenium与Scrapy处理动态加载网页内容的解决方法
博客正文(包含详细注释) 引言 在爬虫技术领域,处理动态加载的网页内容常常是一项挑战,尤其是对于那些通过用户滚动或其他交互动态加载更多内容的网站。本文将介绍如何结合使用Selenium和Scrapy来有效处理这类网页。 初探Seleni…...
Linux的权限(二)
目录 前言 文件类型和访问权限(事物属性) 补充知识 文件类型 文件操作权限 修改文件权限 chmod指令 文件权限值的表示方法 字符表示方法 8进制数值表示方法 权限有无带来的影响 修改文件角色 chown与chgrp指令 目录的rwx权限 补充知识 …...
网络服务IP属地发生变化的原因有哪些?
近期,许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的,而是发生了变动。这一现象引起了广大用户的关注和疑惑,对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑,我们对此现象进行了深入探究…...
OpenGL 着色器程序的保存和加载(二进制)
背景 为了提高OpenGL 着色器程序的编译和链接速度,我们可以将程序保存为二进制进行加载,可以大幅度提升加载效率。 方法 以下是加载和保存二进制程序的方法。 // 加载着色器程序的二进制文件到已创建的着色器程序中 bool loadPragram(const std::str…...
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
前言 【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换一、多语言本地化插件 Localization1.1 介绍1.2 效果展示1.3 使用说明 二、 插件导入并配置2.1 安装 Localization2.2 全局配置 三、多语言映射表3.1 创建多语言文本配…...
疯狂SQL转换系列- SQL for Tencent Cloud VectorDB
为了尽量保证使用者通过统一的SQL标准访问各类型数据库,我们这里开启了“疯狂SQL转换系列”。转换的语法效果不一定是最好的,更多是为用户提供一个统一的数据库交互体验。转换数据库目标的确认更多是内生的。基于我们对业务发展的需要。该向量库SQL转换的…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
