目录

  • 一、 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、接口缓存相关推荐

  1. NoSQL数据库之Redis数据库:Redis的介绍与安装部署(redis-2.8.19/3.2.5)

     NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的w ...

  2. Redis之 介绍和安装

    Redis的介绍 NoSQL数据库概述 • NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",泛指非关系型的 数据库. • NoSQL不依赖业务逻辑 ...

  3. Redis学习一Redis的介绍与安装部署

    NoSql 介绍 NoSql 是key-value形式存储,和传统的数据库不一样,不一定遵循传统数据库的一些基本要求,比如遵循SQL标准(insert\update\delete\select).AC ...

  4. Redis入门——介绍及安装

    Redis redis是当前比较热门的Nosql数据库之一 他是开源的,使用ANSI C语言编写的Key-Value存储系统,区别关系型数据库的二维表格形式存储 redis数据存储是缓存在内存中,包含 ...

  5. redis linux中的安装

    1.基础知识  redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下 字符串.列 ...

  6. Redis介绍、优点,缺点、数据类型:字符串、集合、列表、散列、有序集合、HLL、GEO操作

    Redis Redis(REmote DIctionary Server)是一个非常流行的基于内存的轻量级键值数据库(key-value database).与其把Redis称为一种数据库,不如说Re ...

  7. Redis系列一、redis介绍与安装

    一.Redis介绍 redis是一种基于键值对(key-value)数据库,其中value可以为string.hash.list.set.sorted set等多种数据结构,可以满足很多应用场景.还提 ...

  8. Redis入门第一篇【介绍、安装】

    tags: Redis title: Redis入门第一篇[介绍.安装] 为什么要用Redis 我对Redis的简单理解:Redis相信学JavaEE的同学都听过这个名词,它是一个缓存数据库. Red ...

  9. php 5.5 链接redis,PHP实例:PHP5.5安装PHPRedis扩展及连接测试方法

    <PHP实例:PHP5.5安装PHPRedis扩展及连接测试方法>要点: 本文介绍了PHP实例:PHP5.5安装PHPRedis扩展及连接测试方法,希望对您有用.如果有疑问,可以联系我们. ...

最新文章

  1. 服务器监听端口信息,服务器监听端口信息
  2. 企业计算机管理制度论文,082208计算机信息管理制度毕业论文.doc
  3. 【网易MCTalk】除了低价促销、丰富品类,电商就没有新玩法了?
  4. Oracle EXP/IMP参数详解
  5. cubemx lan8720a ping不通_行刑的刀越用越钝,为啥刽子手却从不去磨?原因让外国人想不通!...
  6. android学生管理实例,学生管理系统-基于SQLite数据库的Android应用
  7. linux下面配置安装nodejs+npm
  8. 小猪的Python学习之旅 —— 22.安静!吵到我用TNT了
  9. Hive 窗口函数如何设置窗口大小
  10. 手机游戏开发如何正确选择设计分辨率
  11. oracle财务系统表,Oracle ERP 财务模块表结构.ppt
  12. 颜色的前世今生10·HSB拾色器详解
  13. Clion安装教程(Linux)
  14. OSChina 周三乱弹 ——送你们个漂亮妹子!
  15. android 平板的 dpi,Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸...
  16. 计算机术语写祝福语,祝福语精选
  17. html表格垂直居中的CSS代码,使用3行CSS代码使任何元素垂直居中
  18. static 和 automatic 修饰(systemverilog)
  19. 服务器的1U ,2U分别是什么意思?
  20. python中可以终结一个循环的保留字是_以下可以终结一个循环的保留字是

热门文章

  1. hht时频谱 matlab 乱序_【原创】用希尔伯特黄变换(HHT)求时频谱和边际谱
  2. 一只小蜜蜂(简单递归)
  3. stc15XX单片机的EPROM读写
  4. 01熵与热力学重要模型
  5. 天地图聚合 java_关于天地图的瓦片下载
  6. 骨骼动画——论文与代码精读《Phase-Functioned Neural Networks for Character Control》
  7. A ResourcePool could not acquire a resource from its primary factory or source异常解决
  8. 仿途风网旅游网站/爱讯.NET程序敏捷开发框架
  9. Thinkphp 5.1 PC和手机端加载不同路径下的模板~功能实现
  10. Flutter Text组件 文字的对齐、数字和字母对齐中文