python-redis用法总结

  • Redis简介
  • python连接Redis
  • redis基本命令 String
    • set(name, value, ex=None, px=None, nx=False, xx=False)
    • setnx(name, value)
    • setex(name, value, time)
    • mset(*args, **kwargs)
    • mget(keys, *args)
    • getset(name, value)
    • getrange(key, start, end)
    • setrange(name, offset, value)
    • append(key, value)
  • redis基本命令 hash
    • hset(name, key, value) & hget(hash, key)
    • hmset(name, mapping) & hmget(name, key, *args)
    • hgetall(name)
    • hkeys(name)
    • hexists(name, key)
    • hdel(name, *keys)
  • redis基本命令 list
    • lpush(name, values) & rpush(name, values)
    • lpushx(name, value) & rpushx(name, value)
    • linsert(name, where, refvalue, value))
    • r.lset(name, index, value)
    • r.lrem(name, value, num)
  • redis基本命令 set
    • sadd(name,values)
    • scard(name)
    • smembers(name)
    • sscan(name, cursor=0, match=None, count=None)
    • sscan_iter(name, match=None, count=None)
    • sdiff(keys, *args)
    • sinter(keys, *args)
    • sunion(keys, *args)
    • sismember(name, value)
    • srem(name, values)
  • redis基本命令 有序set
    • zdd(name, *args, **kwargs)
    • zcard(name)
    • r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
    • zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
    • zcount(name, min, max)
    • zrem(name, values)
    • zremrangebyrank(name, min, max)
    • zremrangebyscore(name, min, max)
    • zscore(name, value)
  • 其他常用操作
    • delete(*names)
    • exists(name)
    • keys(pattern='')
    • expire(name ,time)
    • rename(src, dst)
    • randomkey()
    • type(name)
    • scan(cursor=0, match=None, count=None)
    • other 方法
    • 管道(pipeline)
  • 参考链接

Redis简介

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便,Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。

python连接Redis

redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。同理,python的redis没有实现select命令。

python连接并使用redis需要先按照redis库。

pip install redis

1.连接

import redis   # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
# host是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379
r.set('name', 'junxi')  # key是"foo" value是"bar" 将键值对存入redis缓存
print(r['name'])
print(r.get('name'))  # 取出键name对应的值
print(type(r.get('name')))

2.连接池

redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。
可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池

import redis    # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)   # host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379
r = redis.Redis(connection_pool=pool)
r.set('gender', 'male')     # key是"gender" value是"male" 将键值对存入redis缓存
print(r.get('gender'))      # gender 取出键male对应的值

redis基本命令 String

set(name, value, ex=None, px=None, nx=False, xx=False)

在Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行
xx,如果设置为True,则只有name存在时,当前set操作才执行
ex,过期时间(秒) 这里过期时间是3秒,3秒后p,键food的值就变成None

ex,过期时间(秒) 这里过期时间是3秒,3秒后p,键food的值就变成None

import redispool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'mutton', ex=3)    # key是"food" value是"mutton" 将键值对存入redis缓存
print(r.get('food'))  # mutton 取出键food对应的值

px,过期时间(豪秒) 这里过期时间是3豪秒,3毫秒后,键foo的值就变成None

import redispool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'beef', px=3)
print(r.get('food'))

nx,如果设置为True,则只有name不存在时,当前set操作才执行 (新建)

import redispool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r.set('fruit', 'watermelon', nx=True))    # True--不存在
# 如果键fruit不存在,那么输出是True;如果键fruit已经存在,输出是None

xx,如果设置为True,则只有name存在时,当前set操作才执行 (修改)

print((r.set('fruit', 'watermelon', xx=True)))   # True--已经存在
# 如果键fruit已经存在,那么输出是True;如果键fruit不存在,输出是None

setnx(name, value)

设置值,只有name不存在时,执行设置操作(添加)

print(r.setnx('fruit1', 'banana'))  # fruit1不存在,输出为True

setex(name, value, time)

设置值,只有name存在时,执行设置操作(添加)

import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.setex("fruit2", "orange", 5)
time.sleep(5)
print(r.get('fruit2'))  # 5秒后,取值就从orange变成None

mset(*args, **kwargs)

批量设置值

r.mget({'k1': 'v1', 'k2': 'v2'})
r.mset(k1="v1", k2="v2") # 这里k1 和k2 不能带引号 一次设置对个键值对
print(r.mget("k1", "k2"))   # 一次取出多个键对应的值
print(r.mget("k1"))

mget(keys, *args)

批量获取

print(r.mget('k1', 'k2'))
print(r.mget(['k1', 'k2']))
print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2"))  # 将目前redis缓存中的键对应的值批量取出来

getset(name, value)

设置新值并获取原来的值

print(r.getset("food", "barbecue"))  # 设置的新值是barbecue 设置前的值是beef

getrange(key, start, end)

获取子序列(根据字节获取,非字符)
参数:
name,Redis 的 name
start,起始位置(字节)
end,结束位置(字节)

r.set("cn_name", "君惜大大") # 汉字
print(r.getrange("cn_name", 0, 2))   # 取索引号是0-2 前3位的字节 君 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("cn_name", 0, -1))  # 取所有的字节 君惜大大 切片操作
r.set("en_name","junxi") # 字母
print(r.getrange("en_name", 0, 2))  # 取索引号是0-2 前3位的字节 jun 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("en_name", 0, -1)) # 取所有的字节 junxi 切片操作

setrange(name, offset, value)

修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
参数:
offset,字符串的索引,字节(一个汉字三个字节)
value,要设置的值

r.setrange("en_name", 1, "ccc")
print(r.get("en_name"))    # jccci 原始值是junxi 从索引号是1开始替换成ccc 变成 jccci

strlen(name)
返回name对应值的字节长度(一个汉字3个字节)

print(r.strlen("foo"))  # 4 'goo1'的长度是4

append(key, value)

在redis name对应的值后面追加内容
参数:
key, redis的name
value, 要追加的字符串

r.append("name", "haha")    # 在name对应的值junxi后面追加字符串haha
print(r.mget("name"))

redis基本命令 hash

hset(name, key, value) & hget(hash, key)

name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
参数:
name,redis的name
key,name对应的hash中的key
value,name对应的hash中的value

import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hkeys("hash1")) # 取hash中所有的key
print(r.hget("hash1", "k1"))    # 单个取hash的key对应的值
print(r.hmget("hash1", "k1", "k2")) # 多个取hash的key对应的值
r.hsetnx("hash1", "k2", "v3") # 只能新建
print(r.hget("hash1", "k2"))

hmset(name, mapping) & hmget(name, key, *args)

在name对应的hash中批量设置键值对
参数:
name,redis的name
mapping,字典,如:{‘k1’:‘v1’, ‘k2’: ‘v2’}
keys,要获取key集合,如:[‘k1’, ‘k2’, ‘k3’]
*args,要获取的key,如:k1,k2,k3

r.hmset("hash2", {"k2": "v2", "k3": "v3"})
print(r.hget("hash2", "k2"))  # 单个取出"hash2"的key-k2对应的value
print(r.hmget("hash2", "k2", "k3"))  # 批量取出"hash2"的key-k2 k3对应的value --方式1
print(r.hmget("hash2", ["k2", "k3"]))  # 批量取出"hash2"的key-k2 k3对应的value --方式2

hgetall(name)

获取name对应hash的所有键值

print(r.hgetall("hash1"))

hkeys(name)

获取name对应的hash中所有的key

print(r.hkeys("hash1"))

hexists(name, key)

检查name对应的hash是否存在当前传入的key

print(r.hexists("hash1", "k4"))  # False 不存在
print(r.hexists("hash1", "k1"))  # True 存在

hdel(name, *keys)

删除键值对

r.hdel("hash1", "k1")    # 删除一个键值对

redis基本命令 list

lpush(name, values) & rpush(name, values)

在name对应的list中添加元素,lpush每个新的元素都添加到列表的最左边,rpush相反

r.lpush("list1", 11, 22, 33) # 保存顺序为: 33,22,11
r.rpush("list2", 11, 22, 33)  # 表示从右向左操作 11,22,33

lpushx(name, value) & rpushx(name, value)

往已经有的name的列表添加元素,没有的话无法创建

r.lpushx("list10", 10)

linsert(name, where, refvalue, value))

在name对应的列表的某一个值前或后插入一个新值
参数:
name,redis的name
where,BEFORE或AFTER
refvalue,标杆值,即:在它前后插入数据
value,要插入的数据

r.linsert("list2", "before", "11", "00")

r.lset(name, index, value)

对name对应的list中的某一个索引位置重新赋值
参数:
name,redis的name
index,list的索引位置
value,要设置的值

r.lset("list2", 0, -11)    # 把索引号是0的元素修改成-11
print(r.lrange("list2", 0, -1))

r.lrem(name, value, num)

在name对应的list中删除指定的值
参数:
name,redis的name
value,要删除的值
num, num=0,删除列表中所有的指定值;
num=2,从前到后,删除2个; num=1,从前到后,删除左边第1个
num=-2,从后向前,删除2个

r.lrem("list2", "11", 1)    # 将列表中左边第一次出现的"11"删除
print(r.lrange("list2", 0, -1))
r.lrem("list2", "99", -1)    # 将列表中右边第一次出现的"99"删除
print(r.lrange("list2", 0, -1))
r.lrem("list2", "22", 0)    # 将列表中所有的"22"删除
print(r.lrange("list2", 0, -1))

redis基本命令 set

sadd(name,values)

name对应的集合中添加元素

r.sadd("set1", 33, 44, 55, 66)  # 往集合中添加元素

scard(name)

获取name对应的集合中元素个数

print(r.scard("set1"))  # 集合的长度是4

smembers(name)

获取name对应的集合的所有成员

print(r.smembers("set1"))   # 获取集合中所有的成员

sscan(name, cursor=0, match=None, count=None)

获取集合中所有的成员–元组形式

sscan_iter(name, match=None, count=None)

同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大

print(r.sscan("set1"))
for i in r.sscan_iter("set1"):print(i)

sdiff(keys, *args)

差集,在第一个name对应的集合中且不在其他name对应的集合的元素集合

r.sadd("set2", 11, 22, 33)
print(r.smembers("set1"))   # 获取集合中所有的成员
print(r.smembers("set2"))
print(r.sdiff("set1", "set2"))   # 在集合set1但是不在集合set2中
print(r.sdiff("set2", "set1"))   # 在集合set2但是不在集合set1中

sinter(keys, *args)

获取多一个name对应集合的交集

print(r.sinter("set1", "set2")) # 取2个集合的交集

sunion(keys, *args)

获取多个name对应的集合的并集

print(r.sunion("set1", "set2")) # 取2个集合的并集

sismember(name, value)

检查value是否是name对应的集合的成员,结果为True和False

print(r.sismember("set1", 33))  # 33是集合的成员
print(r.sismember("set1", 23))  # 23不是集合的成员

srem(name, values)

在name对应的集合中删除某些值

print(r.srem("set2", 11))   # 从集合中删除指定值 11
print(r.smembers("set2"))

redis基本命令 有序set

Set操作,Set集合就是不允许重复的列表,本身是无序的
有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,
所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。

zdd(name, *args, **kwargs)

在name对应的有序集合中添加元素

r.zadd("zset1", n1=11, n2=22)
r.zadd("zset2", 'm1', 22, 'm2', 44)
print(r.zrange("zset1", 0, -1))   # 获取有序集合中所有元素
print(r.zrange("zset2", 0, -1, withscores=True))   # 获取有序集合中所有元素和分数

zcard(name)

获取name对应的有序集合元素的数量

print(r.zcard("zset1")) # 集合长度

r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

按照索引范围获取name对应的有序集合的元素
参数:
name,redis的name
start,有序集合索引起始位置(非分数)
end,有序集合索引结束位置(非分数)
desc,排序规则,默认按照分数从小到大排序
withscores,是否获取元素的分数,默认只获取元素的值
score_cast_func,对分数进行数据转换的函数

zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)

按照分数范围获取name对应的有序集合的元素

for i in range(1, 30):element = 'n' + str(i)r.zadd("zset3", element, i)
print(r.zrangebyscore("zset3", 15, 25)) # # 在分数是15-25之间,取出符合条件的元素
print(r.zrangebyscore("zset3", 12, 22, withscores=True))    # 在分数是12-22之间,取出符合条件的元素(带分数)

zcount(name, min, max)

获取name对应的有序集合中分数 在 [min,max] 之间的个数

print(r.zrange("zset3", 0, -1, withscores=True))
print(r.zcount("zset3", 11, 22))

zrem(name, values)

删除name对应的有序集合中值是values的成员

r.zrem("zset3", "n3")   # 删除有序集合中的元素n3 删除单个
print(r.zrange("zset3", 0, -1))

zremrangebyrank(name, min, max)

根据排行范围删除

r.zremrangebyrank("zset3", 0, 1)  # 删除有序集合中的索引号是0, 1的元素
print(r.zrange("zset3", 0, -1))

zremrangebyscore(name, min, max)

根据分数范围删除

r.zremrangebyscore("zset3", 11, 22)   # 删除有序集合中的分数是11-22的元素
print(r.zrange("zset3", 0, -1))

zscore(name, value)

获取name对应有序集合中 value 对应的分数

print(r.zscore("zset3", "n27"))   # 获取元素n27对应的分数27

其他常用操作

delete(*names)

根据删除redis中的任意数据类型(string、hash、list、set、有序set)

r.delete("gender")  # 删除key为gender的键值对

exists(name)

检测redis的name是否存在,存在就是True,False 不存在

print(r.exists("zset1"))

keys(pattern=’’)

根据模型获取redis的name
更多:
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS hllo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo

print(r.keys("foo*"))

expire(name ,time)

为某个redis的某个name设置超时时间

r.lpush("list5", 11, 22)
r.expire("list5", time=3)
print(r.lrange("list5", 0, -1))
time.sleep(3)
print(r.lrange("list5", 0, -1))

rename(src, dst)

对redis的name重命名

r.lpush("list5", 11, 22)
r.rename("list5", "list5-1")

randomkey()

随机获取一个redis的name(不删除)

print(r.randomkey())

type(name)

获取name对应值的类型

print(r.type("set1"))
print(r.type("hash2"))

scan(cursor=0, match=None, count=None)

查看所有元素

print(r.hscan("hash2"))
print(r.sscan("set3"))
print(r.zscan("zset2"))
print(r.getrange("foo1", 0, -1))
print(r.lrange("list2", 0, -1))
print(r.smembers("set3"))
print(r.zrange("zset3", 0, -1))
print(r.hgetall("hash1"))

scan_iter(match=None, count=None)
查看所有元素–迭代器

for i in r.hscan_iter("hash1"):print(i)for i in r.sscan_iter("set3"):print(i)for i in r.zscan_iter("zset3"):print(i)

other 方法

print(r.get(‘name’)) # 查询key为name的值
r.delete(“gender”) # 删除key为gender的键值对
print(r.keys()) # 查询所有的Key
print(r.dbsize()) # 当前redis包含多少条数据
r.save() # 执行"检查点"操作,将数据写回磁盘。保存时阻塞
r.flushdb() # 清空r中的所有数据

管道(pipeline)

redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,
如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。
管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类。它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能。

import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)    # 默认的情况下,管道里执行的命令可以保证执行的原子性,执行pipe = r.pipeline(transaction=False)可以禁用这一特性。
# pipe = r.pipeline(transaction=True)
pipe = r.pipeline() # 创建一个管道pipe.set('name', 'jack')
pipe.set('role', 'sb')
pipe.sadd('faz', 'baz')
pipe.incr('num')    # 如果num不存在则vaule为1,如果存在,则value自增1
pipe.execute()print(r.get("name"))
print(r.get("role"))
print(r.get("num"))管道的命令可以写在一起,如:
pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()
print(r.get("name"))
print(r.get("role"))
print(r.get("num"))

参考链接

使用python来操作redis用法详解

python redis常见用法总结相关推荐

  1. python requests常见用法总结

    一.前言 requests是Python中一个用来发出HTTP请求的库,它将复杂的网络请求封装为一个简单的API以供用户调用,对于一般比较简单的爬虫程序而言,requests库足矣,今天博主分享一下r ...

  2. Python list 常见用法

    测试你对Python列表知识的60个问题 通过掌握列表基础知识来压制算法问题 图片来自Pexels的Andrew Neel 我最近做了很多算法题,发现自己对列表的理解并不尽如人意. 这是我写的60个列 ...

  3. python not常见用法

    前言 python 中not 作为一个关键字有着很重要的作用,下面着重说一下比较常用的几个作用. 目录标题 前言 一.用于判断变量是否为None 二.用于判断有类型的变量是否为空 三.和关键字in搭配 ...

  4. python六:常见数据类型以及常见用法

    bool 布尔值 # 在bool中 0,()(空元祖),[](空列表),{}(空字典),None,""(空字符串) 都是False int 整形 float 浮点型 str 字符串 ...

  5. python propresql mysql_python数据库操作mysql:pymysql、sqlalchemy常见用法详解

    本文实例讲述了python数据库操作mysql:pymysql.sqlalchemy常见用法.分享给大家供大家参考,具体如下: 相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 ...

  6. Python中else关键字的常见用法

    Python中的else常见用法有三:选择结构.循环结构和异常处理结构. (1)选择结构 这应该是最常见的用法,与关键字if和elif组合来使用,用来说明条件不符合时应执行的代码块. (2)循环结构 ...

  7. Python中的标准库函数(内置函数)print()输出(打印出)字符串的常见用法

    这篇博文用于记录下Python中的标准库函数print()的常见用法,随着时间的推移,可能会有更新. print 在 Python3.x 是一个函数,但在 Python2.x 版本不是一个函数,只是一 ...

  8. python内置函数lambda函数常见用法

    一.关于lambda函数: 是Python编程语言中使用较多的一个内置函数.他可以在不指定函数名称的情况下定义一些简单逻辑的函数.可以定义一个函数给变量. 二.使用方法: 语法: 在Python中,l ...

  9. python 格式化打印print常见用法(更新中)

    python 格式化打印print常见用法 1.一般打印 1.1打印到控制台 1.2 打印到文件 2.格式化打印 2.1 % 方法 2.1.1 格式化常用符号 2.1.2 格式化操作符辅助命令 2.2 ...

最新文章

  1. 计算机计量g代表,计算机中的有些计量单位例如G、MB是表示什么意思?
  2. 走进单元测试:测试需要从哪些方面着手
  3. k8s中使用MySQL共享存储_Kubernetes创建挂载共享存储的容器
  4. 【bzoj 2434】【codevs 1946】[Noi2011]阿狸的打字机(AC自动机)
  5. Cilium架构:提供并透明地保护应用程序工作负载之间的网络连接和负载平衡
  6. 大工13秋 c/c++语言程序设计 在线作业3,大工19秋《JavaScript基础教程与应用》在线作业3【满分答案】...
  7. leetcode-453-Minimum Moves to Equal Array Elements
  8. 在eclipse中使用Github进行单元测试
  9. 再谈mysql之执行计划explain
  10. LayaBox1.7.16 TiledMap 销毁的问题,TiledMap销毁后屏幕变灰,不能显示
  11. Linux 配置vim
  12. 螺旋分级机与水力分级机间的优缺点
  13. Jenkins与码云集成
  14. 最新WingIDE注册破解方法
  15. shell脚本-md5码
  16. 瑞吉外卖项目剩余功能补充
  17. 谈一下我是如何从使用json-lib到投入fastjson的怀抱....
  18. openlayers实现wfs属性查询和空间查询
  19. iPhone人物拍照调色
  20. 【推荐架构day5】今日头条算法的基本原理

热门文章

  1. 基于STM32的DAC音频输出
  2. hyperv服务器有几台虚拟机,一台Hyper-V服务器上有多少台虚拟机?
  3. TrajGAT:轨迹相似度计算模型
  4. 算法面试之Roberta、Albert
  5. 图片如何添加水印?这些小技巧掌握以下
  6. 智能涡街流量计的使用和安装特点
  7. 随心所欲版xp阴道镜_鼠年兽三小只出道!《魔域口袋版》x三只松鼠联动开启
  8. 华中师范大学计算机考研874攻略
  9. 创建catkin_ws工作空间出现catkin_make错误解决方法
  10. 曝光 兼职达人(深圳市青木网络科技)无耻、恶心