一、redis介绍(linux安装)
1 redis介绍
5 大数据结构
BitMaps位图:布隆过滤器 本质是 字符串
HyperLogLog:超小内存唯一值计数,12kb HyperLogLog 本质是 字符串
GEO:地理信息定位 本质是有序集合
2.8 版本以后使用redis-sentinel支持高可用
3.0 版本以后支持分布式
2 redis linux下安装
wget http://download.redis.io/releases/redis-6.2 .9 .tar.gz
tar -xzf redis-6.2 .9 .tar.gz
ln -s redis-6.2 .9 redis
cd redis
make&&make install
ps aux|grep redis
kill 进程id
cd /usr/local/
rm -f /usr/local/redis/bin /redis*
rm -f /usr/local/bin /redis*
rm -rf redis
3 redis启动方式
3.1 最简启动
redis-server
ps -ef|grep redis
netstat -antpl|grep redis
redis-cli -h ip -p port ping
3.2动态参数启动
3.3 配置文件启动
daemonize yes
pidfile /var/run/redis.pid
port 6379
dir "/root/redis/data"
logfile 6379. log
mkdir data
redis-server redis.conf
3.4 客户端连接命令
redis-cli -h 地址 -p 端口
redis-cli -h 127.0 .0 .1 -p 6379 info
CONFIG GET *
CONFIG SET requirepass 123456
CONFIG REWRITE
-方式一:直接连接,指定密码:redis-cli -a 123456
-方式二:先连接进去redis-cli,再执行r auth 密码
4 redis典型场景
5 redis通用命令
时间:运行算法的实际 o(1 ) o(log n) o(n) o(n方)
空间:运行算法占用的内存 o(1 ) o(log n) o(n) o(n方)
keys *
keys he*
keys he[h-l]
keys he?
dbsize
set a b
exists a
(integer) 1
删除成功返回1 ,key不存在返回0
expire name 3
ttl name
persist name
type name
info命令:内存,cpu,主从相关
client list 正在连接的会话
client kill ip:端口
dbsize 总共有多少个key
flushall 清空所有
flushdb 只清空当前库
select 数字 选择某个库 总共16 个库
monitor 记录操作日志,夯住
二、 redis数据类型
1 数据结构和内部编码
-他是reids的有序集合类型的底层实现
1 纯内存
2 非阻塞IO (epoll),自身实现了事件处理,不在网络io上浪费过多时间
3 避免线程间切换和竞态消耗
2 redis字符串类型
get name
set name lqz
del name
incr age
decr age
incrby age 10
decrby age 10
set name lqz
setnx name lqz
set name lqz nx
set name lqz xx
mget key1 key2 key3
mset key1 value1 key2 value2 key3 value3
getset name lqznb
append name 666
strlen name
increbyfloat age 3.5
getrange key start end
setrange key index value
3 哈希类型
hget key field
hset key field value
hdel key field
hset user:1 :info age 23
hget user:1 :info ag
hset user:1 :info name lqz
hgetall user:1 :info
hdel user:1 :info age
hexists key field
hlen key
hexists user:1 :info name
hlen user:1 :info
hmget key field1 field2 ...fieldN
hmset key field1 value1 field2 value2
hgetall key
hvals key
hkeys key
hincrby user:1 :info pageview count
hsetnx key field value
hincrby key field intCounter
hincrbyfloat key field floatCounter
4 列表类型
rpush key value1 value2 ...valueN
linsert key before|after value newValue
linsert listkey before b java
linsert listkey after b php
lpop key
rpop key
lrem key count value
1 count>0 从左到右,删除最多count个value相等的项
2 count<0 从右向左,删除最多 Math.abs (count)个value相等的项
3 count=0 删除所有value相等的项
lrem listkey 0 a
lrem listkey -1 c
ltrim key start end
ltrim listkey 1 4
lrange key start end
lrange listkey 0 2
lrange listkey 1 -1
lindex key index
lindex listkey 0
lindex listkey -1
llen key
lset key index newValue
lset listkey 2 ppp
实现timeLine功能,时间轴,微博关注的人,按时间轴排列,在列表中放入关注人的微博的即可
blpop key timeout
brpop key timeout
lpush+lpop
lpush+rpop
lpush+ltrim
lpush+brpop
4 集合类型
sadd key element
srem key element
scard key
sismember key element
srandmember key count
spop key
smembers key
sdiff user:1 :follow user:2 :follow
sinter user:1 :follow user:2 :follow
sunion user:1 :follow user:2 :follow
sdiff|sinter|suion + store destkey...
去重场景
抽奖系统 :通过spop来弹出用户的id ,活动取消,直接删除
点赞,点踩,喜欢等,用户如果点了赞,就把用户id 放到该条记录的集合中
标签:给用户/文章等添加标签,sadd user:1 :tags 标签1 标签2 标签3
给标签添加用户,关注该标签的人有哪些
共同好友:集合间的操作
5 有序集合(zset)
key score value
user:ranking 1 lqz
user:ranking 99 lqz2
user:ranking 88 lqz3
集合:无重复元素,无序,element
有序集合:无重复元素,有序,element+score
列表:可以重复,有序,element
有序集合:无重复元素,有序,element+score
zadd key score element
zrem key element
zscore key element
zincrby key increScore element
zcard key
zrank key element
zrange key 0 -1
zrange player:rank 0 -1 withscores
zrangebyscore key minScore maxScore
zrangebyscore user:1 :ranking 90 210 withscores
zcount key minScore maxScore
zremrangebyrank key start end
zremrangebyrank user:1 :rangking 1 2
zremrangebyscore key minScore maxScore
zremrangebyscore user:1 :ranking 90 210
排行榜:音乐排行榜,销售榜,关注榜,游戏排行榜
zrevrank
zrevrange
zrevrangebyscore
zinterstore
zunionstore
三、redis高级
1 慢查询
-slowlog-max -len :慢查询队列的长度
- slowly-log-slower-than :超过多少微妙,就算慢命令,就会记录到慢查询队列中
config set slowlog-log-slower-than 0
config set slowlog-max -len 100
config rewrite
slowlog len
slowlog reset
slowlog get
2 pipeline与事务
Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现(Redis模块)
将一批命令,批量打包,在redis服务端批量计算(执行),然后把结果批量返回
1 次pipeline(n条命令)=1 次网络时间+n次命令时间
import redis
pool = redis.ConnectionPool(host='127.0.0.1' , port=6379 )
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=True )
pipe.multi()
pipe.set ('name' , 'lqz' )
pipe.set ('role' , 'nb' )
pipe.execute()
multi
set name lqz
set age 18
exec
watch age
multi
decr age
exec
multi
decr age
exec
3 redis中的发布订阅模式
发布者发布了消息,所有的订阅者都可以收到,就是生产者消费者模型(后订阅了,无法获取历史消息)
publish lqz hello
subscribe lqz
pubsub numsub lqz
pubsub channels
发布订阅数全收到,消息队列有个抢的过程,只有一个抢到
4 Bitmap位图:独立用户统计
Bitmap位图:是字符串类型,但是以二进制形式存储的,获取,设置某个二进制位的
-假设:1 亿用户,5 千万活跃用户 统计今天活跃用户是多选 用户iduserid是整形,32 位整型
-int32 类型 4 个字节表示一个数字---》 正负 2 的31 次方-1 的范围
1 4 个字节
1001 4 个字节
-方式一:登录,把id 放到集合中---》统计集合大小
-方式二:登录,操作位图,把id 对应的数字设为1 ,以后统计1 的个数
5 HyperLogLog:极小的空间完成独立数量统计
redis中支持这种算法,基于HyperLogLog算法:极小的空间完成独立数量统计
很类似于布隆过滤器
pfadd key element
pfcount key
pfadd uuids "uuid1" "uuid2" "uuid3" "uuid4"
pfcount uuids
6 GEO地理位置信息
-根据经纬度---》确定具体地址的---》高德开放api---》返回具体地址
比如:两个经纬度之间距离 (直线距离)
比如:统计某个经纬度范围内有哪些好友,餐馆
-跟后端没关系:只需要存
-app,有定位功能
-网页,集成了高德地图,定位功能
geoadd key 经度 纬度 名字
geoadd cities:locations 116.28 39.55 beijing
geopos cities:locations beijing
geodist cities:locations beijing tianjin km
georadiusbymember cities:locations beijing 150 km
四、redis持久化
1 持久化方案
redis的所有数据保存在内存中,把内存中的数据同步到硬盘上这个过程称之为持久化
快照:某时某刻数据的一个完成备份
-mysql的Dump
-redis的RDB
写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
-mysql的 Binlog
-Redis的 AOF
2 RDB
-方式一:通过命令---》同步操作
save:生成rdb持久化文件
-方式二:异步持久化---》不会阻塞住其他命令的执行
bgsave
-方式三:配置文件配置--》这个条件触发,就执行bgsave
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir "/root/redis-6.2.9/data"
如果60s中改变了1w条数据,自动生成rdb
如果300s中改变了10 条数据,自动生成rdb
如果900s中改变了1 条数据,自动生成rdb
3 aof方案
日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上
always:redis–》写命令刷新的缓冲区—》每条命令fsync到硬盘—》AOF文件
everysec(默认值):redis——》写命令刷新的缓冲区—》每秒把缓冲区fsync到硬盘–》AOF文件
no:redis——》写命令刷新的缓冲区—》操作系统决定,缓冲区fsync到硬盘–》AOF文件
随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题
本质就是把过期的,无用的,重复的,可以优化的命令,来优化,这样可以减少磁盘占用量,加速恢复速度
auto-aof-rewrite-min -size:500m
auto-aof-rewrite-percentage:增长率
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
4 混合持久化
appendonly yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min -size 64mb
aof-use-rdb-preamble yes
save ""
五、redis主从、哨兵
1 主从复制原理和方案
可能会有以下问题:
1 机器故障
2 容量瓶颈
3 QPS瓶颈
一主一从,一主多从
做读写分离
做数据副本
提高并发量
一个master可以有多个slave
一个slave只能有一个master
数据流向是单向的,从master到slave,从库只能读,不能写,主库既能读又能写
1. 副本(从)库通过slaveof 127.0 .0 .1 6379 命令,连接主库,并发送SYNC给主库
2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库
3. 副本库接收后会应用RDB快照,load进内存
4. 主库会陆续将中间产生的新的操作,保存并发送给副本库
5. 到此,我们主复制集就正常工作了
6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.
7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.
8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库
9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的
如果不开有可能,主库重启操作,造成所有主从数据丢失!
-1 命令方式,在从库上执行
slaveof 127.0 .0 .1 6379
slaveof no one
-2 配置文件方式,在从库加入
slaveof 127.0 .0 .1 6379
slave-read-only yes
autpass 123456
min -slaves-to-write 1
min -slaves-max -lag 3
2 哨兵高可用
1 多个sentinel发现并确认master有问题
2 选举触一个sentinel作为领导
3 选取一个slave作为新的master
4 通知其余slave成为新的master的slave
5 通知客户端主从变化
6 等待老的master复活成为新master的slave
第一步:先搭建一主两从
第二步:哨兵配置文件,启动哨兵(redis的进程,也要监听端口,启动进程有配置文件)
port 26379
daemonize yes
dir /root/redis/data
bind 0.0 .0 .0
logfile "redis_sentinel.log"
sentinel monitor mymaster 127.0 .0 .1 6379 2
sentinel down-after-milliseconds mymaster 30000
port 26390
daemonize yes
dir /root/redis/data1
bind 0.0 .0 .0
logfile "redis_sentinel.log"
sentinel monitor mymaster 127.0 .0 .1 6379 2
sentinel down-after-milliseconds mymaster 30000
port 26381
daemonize yes
dir /root/redis/data2
bind 0.0 .0 .0
logfile "redis_sentinel.log"
sentinel monitor mymaster 127.0 .0 .1 6379 2
sentinel down-after-milliseconds mymaster 30000
第三步:启动三个哨兵
./src/redis-sentinel ./sentinal_26379.conf
./src/redis-sentinel ./sentinal_26380.conf
./src/redis-sentinel ./sentinal_26381.conf
第四步:停止主库,发现80 变成了主库,以后79 启动,变成了从库
六、redis集群
1 集群原理及搭建
1 并发量:单机redis qps为10w/s,但是我们可能需要百万级别的并发量
2 数据量:机器内存16g--256g,如果存500g数据呢?
假设全量的数据非常大,500g,单机已经无法满足,我们需要进行分区,分到若干个子集中
哈希分布
顺序分布
原理:100 个数据分到3 个节点上 1 --33 第一个节点;34 --66 第二个节点;67 --100 第三个节点(很多关系型数据库使用此种方式)
原理:hash 分区: 节点取余 ,假设3 台机器, hash (key)%3 ,落到不同节点上
客户端分片,通过hash +取余
节点伸缩,数据节点关系发生变化,导致影响数据迁移过大
迁移数量和添加节点数量有关:建议翻倍扩容
每个节点负责一部分数据,对key进行hash ,得到结果在node1和node2之间,就放到node2中,顺时针查找
客户端分片:哈希+顺时针(优化取余)
节点伸缩:只影响临近节点,但是还有数据迁移的情况
伸缩:保证最小迁移数据和无法保证负载均衡(这样总共5 个节点,数据就不均匀了),翻倍扩容可以实现负载均衡
预设虚拟槽:每个槽映射一个数据子集,一般比节点数大
良好的哈希函数:如CRC16
服务端管理节点、槽、数据:如redis cluster(槽的范围0 –16383 )
对key进行hash 得到数字对16383 取余----》就知道这个数据是归哪个槽管理的---》节点管理哪些槽是知道的---》数据存到哪个节点就知道了
2 集群搭建
节点(某一台机器),meet(节点跟节点之间通过meet通信),指派槽(16384 个槽分给几个节点),复制(主从赋值),高可用(主节点挂掉,从节点顶上)
port 7000
daemonize yes
dir "/root/redis/data/"
logfile "7000.log"
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes-7000. conf
cluster-require-full-coverage yes
快速生成其他配置
sed 's/7000/7001/g' redis-7000. conf > redis-7001. conf
sed 's/7000/7002/g' redis-7000. conf > redis-7002. conf
sed 's/7000/7003/g' redis-7000. conf > redis-7003. conf
sed 's/7000/7004/g' redis-7000. conf > redis-7004. conf
sed 's/7000/7005/g' redis-7000. conf > redis-7005. conf
./src/redis-server ./redis-7000. conf
./src/redis-server ./redis-7001. conf
./src/redis-server ./redis-7002. conf
./src/redis-server ./redis-7003. conf
./src/redis-server ./redis-7004. conf
./src/redis-server ./redis-7005. conf
ps -ef |grep redis
./src/redis-cli --cluster create --cluster-replicas 1 127.0 .0 .1 :7000 127.0 .0 .1 :7001 127.0 .0 .1 :7002 127.0 .0 .1 :7003 127.0 .0 .1 :7004 127.0 .0 .1 :7005
redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster nodes
redis-cli -p 7000 cluster slots
./src/redis-cli -p 7000 -c
3 集群扩容
sed 's/7000/7006/g' redis-7000. conf > redis-7006. conf
sed 's/7000/7007/g' redis-7000. conf > redis-7007. conf
./src/redis-server ./redis-7006. conf
./src/redis-server ./redis-7007. conf
./src/redis-cli --cluster add-node 127.0 .0 .1 :7006 127.0 .0 .1 :7000
./src/redis-cli --cluster add-node 127.0 .0 .1 :7007 127.0 .0 .1 :7000
./src/redis-cli -p 7007 cluster replicate baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a
./src/redis-cli --cluster reshard 127.0 .0 .1 :7000
-迁移4096 个槽
-7006 的机器接收槽
-all
4 集群缩容
redis-cli --cluster reshard --cluster-from baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a --cluster-to 050bfd3608514d4db5d2ce5411ef5989bbe50867 --cluster-slots 1365 127.0 .0 .1 :7000
yes
redis-cli --cluster reshard --cluster-from baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a --cluster-to 9cb2a9b8c2e7b63347a9787896803c0954e65b40 --cluster-slots 1366 127.0 .0 .1 :7001
yes
redis-cli --cluster reshard --cluster-from baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a --cluster-to d3aea3d0b4cf90f58252cf3bcd89530943f52d36 --cluster-slots 1366 127.0 .0 .1 :7002
yes
./src/redis-cli --cluster del -node 127.0 .0 .1 :7000 9c2abbfaa4d1fb94b74df04ce2b481512e6edbf3
./src/redis-cli --cluster del -node 127.0 .0 .1 :7000 baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a
七、python操作redis哨兵、集群
1 python操作哨兵
import redis
conn=redis.Redis(host='' ,port=6379 )
conn.set ()
conn.close()
import redis
from redis.sentinel import Sentinel
sentinel = Sentinel([('10.0.0.101' , 26379 ),
('10.0.0.101' , 26378 ),
('10.0.0.101' , 26377 )
],socket_timeout=5 )
print (sentinel)
master = sentinel.discover_master('mymaster' )
print (master)
slave = sentinel.discover_slaves('mymaster' )
print (slave)
2 python操作集群
from rediscluster import RedisCluster
startup_nodes = [{"host" :"127.0.0.1" , "port" : "7000" },{"host" :"127.0.0.1" , "port" : "7001" },{"host" :"127.0.0.1" , "port" : "7002" }]
rc = RedisCluster(startup_nodes=startup_nodes)
rc.set ("foo" , "bar" )
print (rc.get("foo" ))
八、缓存优化
1 redis缓存更新策略
LRU -Least Recently Used,没有被使用时间最长的
LFU -Least Frequenty Used,一定时间段内使用次数最少的
FIFO -First In First Out 先进先出
2 缓存击穿,雪崩,穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id 为“-1 ”的数据或id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
1 接口层增加校验,如用户鉴权校验,id 做基础校验,id <=0 的直接拦截;
2 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30 秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id 暴力攻击
3 通过布隆过滤器实现
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
设置热点数据永远不过期。
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
1 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3 设置热点数据永远不过期。
九、MySql的主从与读写分离
1 mysql 主从
-读写分离
-单个实例并发量低,提高并发量
-只在主库写,读数据都去从库
步骤一:主库db的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db.
-主库:10.0 .0 .102 33307
-从库:10.0 .0 .102 33306
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
touch /home/mysql/my.cnf
mkdir /home/mysql1
mkdir /home/mysql1/conf.d
mkdir /home/mysql1/data/
touch /home/mysql1/my.cnf
[mysqld]
user=mysql
character-set -server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
server-id =100
log-bin =mysql-bin
[client]
default-character-set =utf8
[mysql]
default-character-set =utf8
[mysqld]
user=mysql
character-set -server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
server-id =101
log-bin =mysql-slave-bin
relay_log=edu-mysql-relay-bin
[client]
default-character-set =utf8
[mysql]
default-character-set =utf8
docker run -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 33307 :3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker run -di -v /home/mysql1/data/:/var/lib/mysql -v /home/mysql1/conf.d:/etc/mysql/conf.d -v /home/mysql1/my.cnf:/etc/mysql/my.cnf -p 33306 :3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
mysql -uroot -P33307 -h 10.0 .0 .102 -p
create user 'test' @'%' identified by '123' ;
grant all privileges on *.* to 'test' @'%' ;
flush privileges;
show master status;
mysql -uroot -P33306 -h 10.0 .0 .102 -p
'''
change master to
master_host='MySQL主服务器IP地址',
master_user='之前在MySQL主服务器上面创建的用户名',
master_password='之前创建的密码',
master_log_file='MySQL主服务器状态中的二进制文件名',
master_log_pos='MySQL主服务器状态中的position值';
'''
change master to master_host='10.0.0.102' ,master_port=33307 ,master_user='test' ,master_password='123' ,master_log_file='mysql-bin.000003' ,master_log_pos=0 ;
start slave;
show slave status\G;
2 django使用多数据库做读写分离
DATABASES = {
'default' : {
'ENGINE' : 'django.db.backends.sqlite3' ,
'NAME' : BASE_DIR / 'db.sqlite3' ,
},
'db1' : {
'ENGINE' : 'django.db.backends.sqlite3' ,
'NAME' : BASE_DIR / 'db1.sqlite3' ,
}
}
Book.objects.using('db1' ).create(name='西游记' )
写一个py文件,db_router.py,写一个类:
class DBRouter (object ):
def db_for_read (self, model, **hints ):
return 'db1'
def db_for_write (self, model, **hints ):
return 'default'
DATABASE_ROUTERS = ['mysql_master_demo.db_router.DBRouter' , ]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY