redis:redis介绍和安装、普通连接和连接池、redis 5大数据类型之字符串、Hash、列表、其他操作(通用)、管道、django使用redis、接口缓存
目录
- 一、 redis介绍和安装
- 二、 普通连接和连接池
- 三、 redis 5大数据类型之字符串
- 四、 redis 5大数据类型之Hash
- 五、 redis 5大数据类型之列表
- 六、 其他操作(通用)
- 七、 管道
- 八、 django使用redis
- 九、 接口缓存
一、 redis介绍和安装
# redis:是一个key-value存储系统,非关系型数据库(nosql数据库),数据存在于内存中,缓存数据库
# redis支持5大数据类型:字符串,列表,hash(字典),集合,有序集合
# 使用Redis有哪些好处-速度快:缓存数据库-支持丰富数据类型:5大数据类型-支持事务:通过管道支持(单实例上有效)-丰富的特性:可用于缓存,消息队列,按key设置过期时间,过期后将会自动删除# redis相比memcached有哪些优势-都是内存数据库-redis类型丰富,5大类型,memcached只支持字符串类型-redis支持持久化,memcached不支持持久化-redis速度比mencached快# 特点可以持久化单线程,单进程-redis最新版本是6.x-6.x之前是单线程,单进程
# redis单线程为什么这么快?并发量:10w,6w左右-1 纯内存操作-2 使用了io多路复用模型(epoll select)-3 因为是单线程,不存在线程间切换,节省资源
# 服务:客户端,服务端(跟mysql一样, 是存数据的地方)# 安装:-redis使用c语言写的,开源,,我们不支持windows,第三方,基于redis源码,自行修改,编译成windows平台可以运行的(win平台:维护到 3.x版本),咱们现在讲,以3.x为例# 官网http://redis.cn/-官网提供了c源码,需要自行下载,编译-win平台,自己找一个安装包(不是官方提供的)https://github.com/microsoftarchive/redis-Redis-x64-3.2.100.msi:一路下一步-图形化界面的客户端:redis-desktop-manager:一开始免费,后来收费了:一路下一步-监听端口默认是:6379# linux下安装
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0.6.tar.gz
cd redis-3.0.6
make
# Windows下安装
https://www.cnblogs.com/liuqingzheng/p/9831331.html# 启动redis服务-第一种:在任意路径下敲:redis-server # 等同于mysqld-第二种:win平台,已经做成了服务,把服务启动即可-"D:\Program Files\Redis\redis-server.exe" --service-run "D:\Program Files\Redis\redis.windows-service.conf"
# 客户端连接-第一种方式:在任意路径下敲:redis-cli -h 127.0.0.1 -p 6379 # 等同于 mysql -h -P-如果连本地的6379端口,直接敲redis-cli-第二种方式:使用客户端连接-第三种方式:使用python操作:pip3 install redis
二、 普通连接和连接池
## 普通连接# 实例化对象,创建连接对象
conn=redis.Redis(host='127.0.0.1',port=6379)
# conn=Redis()# 操作redis
conn.set('name','lqz')
conn.close()##redis连接池import redis#拿到一个连接数为3的连接池
# 把POOL做成单例:把它以模块导入方式
POOL=redis.ConnectionPool(max_connections=3,host='127.0.0.1', port=6379)# 从连接池中拿出一个连接,给conn
conn=redis.Redis(connection_pool=POOL)conn.set('age',19)
conn.close() # 不是关闭连接,是把该连接,放回到连接池####把POOL以单例形式使用import redis
from pool import POOL # 以模块形式导入,是天然单例
conn=redis.Redis(connection_pool=POOL)
# conn2=redis.Redis(connection_pool=POOL)
# conn3=redis.Redis(connection_pool=POOL)
# conn4=redis.Redis(connection_pool=POOL)
# conn5=redis.Redis(connection_pool=POOL)
# conn6=redis.Redis(connection_pool=POOL)conn.set('age',19)
conn.close() # 不是关闭连接,把该连接,放回到连接池
# pool.py
import redis#拿到一个连接数为3的连接池
# 把POOL做成单例:把它以模块导入方式
POOL=redis.ConnectionPool(max_connections=3,host='127.0.0.1', port=6379)
三、 redis 5大数据类型之字符串
String操作,redis中的String在在内存中按照一个name对应一个value来存储。如图:
from redis import Redisconn = Redis(host='127.0.0.1',port=6379) # 什么都不写,连的就是本地的63791⭐ set(name, value, ex=None, px=None, nx=False, xx=False):设置指定key的值
# conn.set('hobby','篮球')
# conn.set('hobby','篮球',3) # 设置值3秒自动销毁
# conn.set('hobby','篮球',ex=3,nx=True)# 设置值3秒自动销毁,无法修改
# conn.set('hobby','足球',nx=True) # 改篮球的值,没法生效
# conn.set('hobby','足球',xx=True) # 可以修改篮球的值
# conn.set('hobby1','足球',xx=True) # key不存在无法修改,不会生效
'''
在Redis中设置值,默认,不存在则创建,存在则修改
参数:ex,过期时间(秒)px,过期时间(毫秒)nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
'''
2⭐ get(key):获取指定 key 的值。
# print(str(conn.get('name'),encoding='utf-8')) # 取出来的值是bytes格式,指定以utf-8格式显示
3 setnx(key, value):只有在 key 不存在时设置 key 的值
# conn.setnx('sex', 'male')
# conn.setnx('name', '孙宗伟') # 存在就不会添加
4 setex(key, seconds, value):将值value关联到key ,并将key的过期时间设为seconds(以秒为单位)。
# conn.setex('xx',5,'yy') # 设置key值xx,value值yy,5秒钟过期
5 psetex(key, milliseconds, value):这个命令和setex命令相似,但它以毫秒为单位设置 key 的生存时间。
# conn.psetex('xx',5000,'yy')
6⭐ mset( key1, value1 ,key2, value2):同时设置一个或多个 key-value 对。
# conn.mset({'name':'lqz','age':19})
7⭐ mget(key1, key2):获取所有(一个或多个)给定 key 的值。
# print(conn.mget(['name','age']))
# print(conn.mget('name','age')) # 本质跟上面是一样的
8 getset(key, value):将给定key的值设为 value ,并返回 key 的旧值(old value)
# res=conn.getset('name','egon') # 先获取再更新
# print(res) # 打印的是lqz,但已经更新为egon了
9 getrange(key, start, end):返回 key 中字符串值的子字符。
"""
gbk: 2个字节表示一个字符
utf-8 3个字节表示一个字符
"""
# res=conn.getrange('name',0,0) # 前闭后闭区间,取到的是egon的e
# res=conn.getrange('name',0,2).decode('utf-8') # 将key值手动改为中文了,打印显示一个字,取3个就会报错
# print(res)
10 setrange(key, offset, value):用value参数覆写给定key所储存的字符串值,从偏移量offset开始。
# conn.setrange('name',2,'zzz')
11⭐ strlen(key):返回 key 所储存的字符串值的长度(一个汉字,是3个字节)。
# print(conn.strlen('name'))
12⭐ incr(key):将 key 中储存的数字值增一。
# print(conn.incr('age'))incrbyfloat(self, name, amount=1.0)13 decr(key):将 key 中储存的数字值减一。
# print(conn.decr('age'))14 append( key, value):如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
# conn.append('name','nb') # 在原有的egon后面加nb
# conn.append('xxxxxxx','nb') # key值不存在就新增15 获取和设置比特位setbit(name, offset, value)getbit(name, offset)bitcount(key, start=None, end=None)
conn.close()
四、 redis 5大数据类型之Hash
Hash操作,redis中Hash在内存中的存储格式如下图:
from redis import Redis
conn = Redis()
1⭐ hset(key, field, value):将hash表 key 中的字段 field 的值设为 value 。(不存在,则创建;否则,修改)
# conn.hset('hash_test','name','lqz')
# conn.hset('hash_test','age','19')
2⭐ hmset(key, {field1, value1, field2,value2}):同时将多个 field-value (域-值)对设置到hash表 key 中。
# conn.hmset('hash_test1',{'name':'egon','age':18}) # 报错被弃用了,但是还能正常插入值,原生未被弃用
3⭐ hget(key, field):获取存储在hash表中指定字段的值。
# print(conn.hget('hash_test1','name'))
4⭐ hmget(key, [field1, field2]):获取所有给定字段的值
# print(conn.hmget('hash_test1',['name','age']))
5 hgetall(key):获取在hash表中指定key的所有字段和值。
# print(conn.hgetall('hash_test1')) # 尽量少执行,慢长命令,可能会撑爆应用程序的内容
6⭐ hlen(key):获取hash中key对应的字段的个数
# print(conn.hlen('hash_test1'))
7 hkeys(key):# 获取所有hash表中的字段
# print(conn.hkeys('hash_test1'))
8 hvals(key):获取hash中key对应所有的value值
# print(conn.hvals('hash_test1'))
9 hexists(key, field):查看hash表 key 中,指定的字段是否存在。
# print(conn.hexists('hash_test1','hobby')) # False
# print(conn.hexists('hash_test1','name')) # True
10 hdel(key ,field1,field2):删除一个或多个hash表key中指定的字段
# conn.hdel('hash_test1','name','wife')
# 将key对应的hash中指定字段的键值对删除
# print(re.hdel('xxx' ,'sex' ,'name'))
11⭐ hincrby(key, field, amount=1):为hash表key中的指定字段field的整数值加上增量
conn.hincrby('hash_test1','age',amount=10)
"""
自增key对应的hash中的指定字段的值,不存在则创建key=amount参数:key, hash对应的key
name,hash中key对应的字段amount,自增数(整数)
"""12 hincrbyfloat(key, field, amount=1.0):为hash表key中的指定字段的浮点数值加上增量
# conn.hincrbyfloat('hash_test1','age',1.2) # 存在精度损失问题
13 hscan(key, cursor=0, match=None, count=None):迭代hash表中的键值对。
"""
curso:游标,表示从哪个位置开始取match:匹配的字段,不写表示所有count:要取的条数
"""# 存数据进去,在hash表key中加1000行键值对数据
# for i in range(1000):
# conn.hset('test','%s-%s'%('key',i),i)
# res=conn.hscan('test',cursor=0,count=100)
# print(res) # 从0开始取,取出的100条数据是无序的
# print(len(res[1])) # 打印条数
# 下面取到的跟上面的不会有重复,会根据上次的游标位置开始取
# res=conn.hscan('test',cursor=res[0],count=100)
# print(res)
# print(len(res[1]))
14 hscan_iter(name, match=None, count=None) # 获取所有采取这种方法
# hgetall---》一次性全取出来 ----》生成器用的位置
for item in conn.hscan_iter('test',count=10): # 取出全部的value值,但是每次取10个print(item)
"""
生成器用在了什么位置?
在取redis的hash类型的时候,因为hash类型的值很多,所以我没有用hgetall,
自己写了一个生成器,来分片取
"""
conn.close()
五、 redis 5大数据类型之列表
List操作,redis中的List在在内存中按照一个name对应一个List来存储。如图:
from redis import Redis
conn = Redis()
1 lpush(key ,value):将一个或多个值插入到列表头部
# conn.lpush('list_test', 'egon')
# conn.lpush('list_test', 'lqz')
2 rpush(key ,value):将一个或多个值添加到列表尾部
# conn.rpush('list_test', 'ylf', 'szw')
3 lpushx(key ,value):在key对应的list中添加元素,只有key已经存在时,值添加到列表的最左边
# conn.lpushx('yyyyy', 'egon') # key不存在,无法添加
# conn.lpushx('list_test', 'egon') # 成功添加到列表头部,列表可重复4⭐ llen(key):key对应的list元素的个数
# print(conn.llen('list_test'))
5⭐ linsert(key, where, refvalue, value)):在key对应的列表的某一个元素前或者后插入元素
# conn.linsert('list_test','before','lqz','dlrb') # 在lqz前面插入dlrb
# conn.linsert('list_test','after','lqz','jason') # 在lqz后面插入jason
"""
参数:
key,redis的key
where,BEFORE(前)或AFTER(后)(小写也可以)
refvalue,标杆值,即:在它前后插入数据(如果存在多个标杆值,以找到的第一个为准)
value,要插入的数据
"""
6 lset(key, index, value):将key对应的list中的某一个索引位置重新赋值
# conn.lset('list_test',0,'xxx') # 将0这个位置的值改为xxx
"""
参数:
key,redis的key
index,list的索引位置
value,要设置的值
"""
7 lrem(key,count, value):在key对应的list中删除指定的值
# conn.lrem('list_test', count=1, value='lqz')
"""
参数:
key,redis的key
value,要删除的值
count, count=0,删除列表中所有的指定值;
count=2,从前到后,删除2个;
count=-2,从后向前,删除2个
"""
8 lpop(key):将key对应的list的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
# print(conn.lpop('list_test'))
9 rpop(key):将key对应的list的右侧获取最后一个元素并在列表中移除,返回值为移除的元素
# print(conn.rpop('list_test'))
10 lindex(key, index):在key对应的列表中根据索引获取列表元素
# print(conn.lindex('list_test',3)) # 从0开始取
11 lrange(key, start, stop):在key对应的列表分片获取元素(指定范围内)
# print(conn.lrange('list_test', 0, 2))
"""
参数:
key,redis的key
start,索引的起始位置
stop,索引结束位置
"""
12 ltrim(key, start, stop):将key对应的列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
# conn.ltrim('list_test',2,4) # 保留2-4之间的
"""
参数:
key,redis的key
start,索引的起始位置
stop,索引结束位置(大于列表长度,则代表不移除任何)
"""
13 rpoplpush(src, dst):从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;
# 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
"""
从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
参数:
src,要取数据的列表的name
dst,要添加数据的列表的name
"""
14⭐ blpop(keys, timeout):移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
# print(conn.blpop('list_test'))
15 brpop(keys, timeout):移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
# print(conn.brpop('list_test'))16 brpoplpush(src, dst, timeout=0):从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
'''
参数:
src,取出并要移除元素的列表对应的name
dst,要插入元素的列表对应的name
timeout,当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
'''
六、 其他操作(通用)
from redis import Redis
conn=Redis()
1 delete(key):该命令用于key存在时删除key,可以删除一个或多个。
# conn.delete('name','age','test')
2 exists(key):检查指定key是否存在。
# res=conn.exists('hash_test','hash_test1')
# print(res) # 返回2,基本上是判断一个,1代表在,0代表不在
3 keys(pattern='*'):查找所有符合给定模式(pattern)的 key 。
# res=conn.keys('h?sh_test') # 慎用
# res=conn.keys('hash_*') # 慎用
# print(res)
"""
更多:
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
"""
4 expire(name, time):指定某个key设置过期时间,以秒为单位。
# conn.expire('hash_test',5) # 五秒过后自动销毁
5 rename(src, dst):修改key的名称(对redis的key重命名)
# conn.rename('hash_test1','xxx')
6 move(key, db)):将当前数据库的key移动到指定的数据库db当中。
# conn.move('xxx',1) # 将db0库中的xxx移动到db1库下
7 randomkey():从当前数据库中随机返回一个key(不删除)。
# print(conn.randomkey())
8 type(key):返回key所储存的值的类型。
# print(conn.type('name')) # b'string'
# print(conn.type('list')) # b'list'
七、 管道
redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。
"""
1 非关系型数据库,本身不支持事务
2 redis中的管道可以实现事务的支持(要么都成功,要么都失败)-实现的原理:多条命令放到一个管道中,一次性执行
3 具体代码
4 如果是集群环境,不支持管道,只有单机才支持
redis当中如何实现事务?使用redis管道,具体实现:开启管道,把命令放进去调用execute依次执行管道中的所有命令,它的原理就是要么一次性都执行,要么都不执行,保证了事务
"""import redis
conn=redis.Redis()
pip_line=conn.pipeline(transaction=True) #开启一个管道
pip_line.decr('zhangsan',100) #往管道中放一个命令
raise Exception('程序崩了')
pip_line.incrby('wo',100) #往管道中放一个命令pip_line.execute() # 把管道中的命令一次性执行conn.close()
八、 django使用redis
# 第一种:通用方式(任何web框架都可以)# 写一个pool连接池
from redis import ConnectionPool
POOL = ConnectionPool(max_connections=5, host='127.0.0.1', port=6379)
# 在使用的位置,获取连接,获取数据
from luffyapi.libs.redis_pool import POOL
from redis import Redis
conn = Redis(connection_pool=POOL)
name = conn.get('name')# 第二种:django提供的-在配置文件中配置CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient", #这句指的是django中的缓存也缓存到redis中了"CONNECTION_POOL_KWARGS": {"max_connections": 100} # 连接池大小为100# "PASSWORD": "123",}}}-安装django_redis模块-使用from django_redis import get_redis_connectiondef index(request):conn=get_redis_connection()res=conn.get('name')print(res)return HttpResponse('okkkkk')-一旦这样配置,django中的缓存,也用rediscache.set('key',python的任意对象)
九、 接口缓存
# 以首页轮播图为例,加入缓存,后期所有接口都可使用缓存
# 用户来了,先去缓存中看,如果有直接返回,如果没有,去mysql中查,查完以后在缓存中放一份
# 如果mysql数据变化了,轮播图表数据变化了,由于缓存没有更新,就会出现问题
# 双写一致性问题-因为使用了缓存,mysql和redis的数据不一致了-如果解决:(缓存更新策略)-加入过期时间? 60s? 过期时间内数据还有问题-定时更新缓存(每隔60s,更新一下缓存)-数据库一更改,立马改缓存-先改数据库,再改缓存-先改缓存,再改数据库-数据库一改,删除缓存-先删缓存,再改数据库-先改数据库,再删缓存(稍微好一些)
# 首页轮播图接口:缓存更新策略是定时更新-celery的定时任务-使用celery的定时任务,完成首页轮播图缓存的更新 from django.shortcuts import render
# 轮播图接口
from rest_framework.viewsets import ViewSetMixin
from rest_framework.generics import ListAPIView
from .serializer import BannerSerializer
from .models import Bannder
from django.conf import settings
from django.core.cache import cache
from rest_framework.response import Response
class BannerView(ViewSetMixin, ListAPIView):queryset = Bannder.objects.all().filter(is_show=True, is_delete=False).order_by('-orders')[0:settings.BANNER_SIZE]serializer_class = BannerSerializer
# 轮播图加入缓存,重写list,先去缓存中查,如果有直接返回,没有再去数据库查def list(self, request, *args, **kwargs):banner_list = cache.get('banner_cache_list') # 有就不会往下走if not banner_list: # 没有值,走它,去数据库中查response = super().list(request, *args, **kwargs)# 查到以后在缓存中放一份,data就是返回的数据,放data就可以cache.set('banner_cache_list', response.data)else:# 走了缓存,速度很快print('走了缓存')response = Response(data=banner_list)return responsefrom .celery import app
from home.models import Banner
from home.serializer import BannerSerializer
from django.conf import settings
from django.core.cache import cache@app.task # home模块的任务
def update_banner():# 修改缓存#拿到轮播图queryset = Banner.objects.filter(is_delete=False, is_show=True).order_by('orders')[:settings.BANNER_COUNT]ser=BannerSerializer(instance=queryset,many=True)for item in ser.data:item['image']='http://127.0.0.1:8000%s'%str(item['image'])#往缓存中设置cache.set('banner_list',ser.data)return True
redis:redis介绍和安装、普通连接和连接池、redis 5大数据类型之字符串、Hash、列表、其他操作(通用)、管道、django使用redis、接口缓存相关推荐
- NoSQL数据库之Redis数据库:Redis的介绍与安装部署(redis-2.8.19/3.2.5)
NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的w ...
- Redis之 介绍和安装
Redis的介绍 NoSQL数据库概述 • NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",泛指非关系型的 数据库. • NoSQL不依赖业务逻辑 ...
- Redis学习一Redis的介绍与安装部署
NoSql 介绍 NoSql 是key-value形式存储,和传统的数据库不一样,不一定遵循传统数据库的一些基本要求,比如遵循SQL标准(insert\update\delete\select).AC ...
- Redis入门——介绍及安装
Redis redis是当前比较热门的Nosql数据库之一 他是开源的,使用ANSI C语言编写的Key-Value存储系统,区别关系型数据库的二维表格形式存储 redis数据存储是缓存在内存中,包含 ...
- redis linux中的安装
1.基础知识 redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下 字符串.列 ...
- Redis介绍、优点,缺点、数据类型:字符串、集合、列表、散列、有序集合、HLL、GEO操作
Redis Redis(REmote DIctionary Server)是一个非常流行的基于内存的轻量级键值数据库(key-value database).与其把Redis称为一种数据库,不如说Re ...
- Redis系列一、redis介绍与安装
一.Redis介绍 redis是一种基于键值对(key-value)数据库,其中value可以为string.hash.list.set.sorted set等多种数据结构,可以满足很多应用场景.还提 ...
- Redis入门第一篇【介绍、安装】
tags: Redis title: Redis入门第一篇[介绍.安装] 为什么要用Redis 我对Redis的简单理解:Redis相信学JavaEE的同学都听过这个名词,它是一个缓存数据库. Red ...
- php 5.5 链接redis,PHP实例:PHP5.5安装PHPRedis扩展及连接测试方法
<PHP实例:PHP5.5安装PHPRedis扩展及连接测试方法>要点: 本文介绍了PHP实例:PHP5.5安装PHPRedis扩展及连接测试方法,希望对您有用.如果有疑问,可以联系我们. ...
最新文章
- 服务器监听端口信息,服务器监听端口信息
- 企业计算机管理制度论文,082208计算机信息管理制度毕业论文.doc
- 【网易MCTalk】除了低价促销、丰富品类,电商就没有新玩法了?
- Oracle EXP/IMP参数详解
- cubemx lan8720a ping不通_行刑的刀越用越钝,为啥刽子手却从不去磨?原因让外国人想不通!...
- android学生管理实例,学生管理系统-基于SQLite数据库的Android应用
- linux下面配置安装nodejs+npm
- 小猪的Python学习之旅 —— 22.安静!吵到我用TNT了
- Hive 窗口函数如何设置窗口大小
- 手机游戏开发如何正确选择设计分辨率
- oracle财务系统表,Oracle ERP 财务模块表结构.ppt
- 颜色的前世今生10·HSB拾色器详解
- Clion安装教程(Linux)
- OSChina 周三乱弹 ——送你们个漂亮妹子!
- android 平板的 dpi,Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸...
- 计算机术语写祝福语,祝福语精选
- html表格垂直居中的CSS代码,使用3行CSS代码使任何元素垂直居中
- static 和 automatic 修饰(systemverilog)
- 服务器的1U ,2U分别是什么意思?
- python中可以终结一个循环的保留字是_以下可以终结一个循环的保留字是
热门文章
- hht时频谱 matlab 乱序_【原创】用希尔伯特黄变换(HHT)求时频谱和边际谱
- 一只小蜜蜂(简单递归)
- stc15XX单片机的EPROM读写
- 01熵与热力学重要模型
- 天地图聚合 java_关于天地图的瓦片下载
- 骨骼动画——论文与代码精读《Phase-Functioned Neural Networks for Character Control》
- A ResourcePool could not acquire a resource from its primary factory or source异常解决
- 仿途风网旅游网站/爱讯.NET程序敏捷开发框架
- Thinkphp 5.1 PC和手机端加载不同路径下的模板~功能实现
- Flutter Text组件 文字的对齐、数字和字母对齐中文