文章目录

  • NoSQL
  • Redis
      • 安装
      • 启动与退出
      • Redis数据类型
        • 1. Redis键(Key)
        • 2. Redis字符串(String)
        • 3. Redis列表(List)
      • 4. *Redis集合(Set)
      • 5. **Redis哈希(Hash)
        • 6. Redis有序集合Zset(sorted set)
    • 配置文件redis.conf
      • Units单位
      • INCLUDES包含
      • NETWORK网络
      • GENERAL通用
      • SNAPSHOTTING快照
      • REPLICATION复制
      • SECURITY安全
      • CLIENTS限制
      • APPEND ONLY MODE追加
    • redis的持久化
      • RDB(Redis DataBase)
        • 恢复
      • AOF(Append Only File)
        • 恢复
        • Rewrite
      • RDB与AOF
    • redis的事务
      • 常用命令
          • 正常执行`exec`
          • 放弃事务`discard`
        • 1. 全体连坐
        • 2. 冤头债主(不保证原子性)
      • 3. *watch监控
      • 事务的三阶段
      • 事务的三特性
    • redis的订阅/发布
      • 命令
    • redis的消息
        • 读写分离
        • 容灾恢复
        • 一主二从(配从不配主)
        • 薪火相传
        • 反客为主
      • 复制的原理
      • *哨兵模式(反客为主的自动版)
        • 复制的缺点
    • Jedis
      • 1. 测试连接
      • 2. set和get
      • 3. 数据类型
      • 4. 事务
      • 5. 主从复制(配从不配主)
      • 6. RedisPool连接池

NoSQL

泛指非关系型数据库

  1. 特点

    • 易扩展
    • 大数据量高性能
    • 多样灵活的数据类型
  2. 干什么

    • KV
    • Cache
    • Persistence(持久化)
  3. 大数据时代的3V

    • 海量
    • 多样
    • 实时
  4. 互联网需求的3高

    • 高并发
    • 高可扩
    • 高性能
  5. NoSQL数据模型——聚合模型

    1. KV键值(键值对)
    2. Bson(类似json)
    3. 列族
    4. 图形
  6. NoSQL数据库的四大分类

    1. KV键值(Redis)
    2. 文档型数据库(MonggoDB)(bson格式比较多)
    3. 列存储数据库(HBase)
    4. 图关系数据库(Neo4J)
  7. CAP+BASE

    • 传统的ACID

      1. A:原子性
      2. C:一致性
      3. I:独立性
      4. D:持久性
    • CAP(最多只能三选二
      1. C:强一致性
      2. A:可用性
      3. P:分区容错(分布式容忍)性(分布式系统必须)
    • CA:传统Oracle数据库
    • AP:大多数网站架构的选择(弱移植性+AP)
    • CP:Redis、MongoDB
    • BASE
      1. BA:基本可用
      2. S:软状态
      3. E:最终一致*

Redis

(REmote DIctionary Server远程字典服务器)

高性能的(Key/Value)分布式内存数据库

特点:
1. 持久化
2. 丰富的数据类型
3. 主从复制
能干什么
1. 内存存储和持久化
2. 取最新N个数据的操作
3. 模拟类似httpsession需要设定过期时间的功能
4. 发布、订阅消息系统
5. 定时器、计数器

安装

  1. 下载:https://redis.io

    su root然后输入密码进入root用户
    然后把安装包放到linux下
    tar xvf redis-5.0.8.tar
    然后把解压出来的文件放到/opt下(/opt是主机额外安装软件所摆放的目录)
    mv redis-5.0.8 /opt

  2. 进入redis目录

    • make 安装
      (如果报错没gcc,输入yum install gcc-c++ (需要网络))
      (如果安装完后重新输入make出现没有此文件或3. 目录,请输入make distcleanmake)
    • make install 检查安装情况
  3. 安装完成后在根目录下新建一个myredis目录,把redis.conf备份复制cp。

  4. daemonizeno改为yes

    ################################# GENERAL #####################################
    #By default Redis does not run as a daemon. Use 'yes' if you need it.
    #Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
    daemonize yes
    

启动与退出

ps -ef|grep redis //查看是否启动redis
cd /usr/local/bin //进入此目录
redis-server /myredis/redis.conf //启动我们修改过的配置文件(原配置文件在最好不动)
redis-cli -p 6379 启动(6379为默认端口)
ping //回复PONG为启动成功
shutdown
exit //shutdown后再exit退出


select [数字] //切换数据库(默认有16个数据库)
dbsize //查看当前数据库key的数量
keys * //查看所有key
clear //清屏
flushdb //清空当前数据库键值对(慎用
flushall //清空所有数据库键值对(慎用!!!

  1. 单进程
  2. 默认16个数据库,零号为初始化
  3. select [数字] //进入第几个数据库(数字1为零号数据库,16为第十五数据库)
  4. dbsize查看当前数据库key的数量
    5.统一密码管理,16个数据库相同密码
  5. redis索引都是从零开始
  6. 默认端口6379

Redis数据类型

1. Redis键(Key)

命令

  • set key value //写入键值对(只写入当前数据库)(如果key存在会被覆盖)
  • get key:查看key的值
  • keys *:查询所有key(支持*和?(*为所有,?为一位))
  • exists key:判断key是否存在(1为存在)
  • move key db:把key移到第几个db(数据库)
  • ttl key:查看还有几秒过期,-1是永不过期,-2是已过期(过期即死亡,查不到)
  • expire key 秒数:设置key多久后过期(设置0秒瞬间去世)
  • type key:查看key是什么类型
  • del key:删除key
2. Redis字符串(String)
最基本的类型。 二进制安全的,即可以包含任何数据。

命令

  • set key value

  • get key

  • del key

  • append key value:把value加到key值的后面

  • strlen key:查看key值的长度

  • incr key:值加1 (value是数字才能用)

  • decr key:值减1 (同上)

  • incrby key 数字:值加’数字’(同上)

  • decrby key 数字:值减’数字’(同上)

  • getrange key 开始索引 结束索引:获取key值的指定片段(结束索引-1表示结尾)

  • setrange key 插入索引 value:把value从索引处开始覆盖,value从开始到结束都会覆盖原来的值(例:x1是abcde,setrange x1 0 xxx,x1是xxxde)

  • setex key 秒数 value:在set的基础上增加设置存活时间

  • setnx key value:在set的时候判断有没有值,有则不会覆盖,没有则写入(防止覆盖)

  • mset k1 v1 k2 v2 ...:set多个键值对

  • mget k1 k2 ...:get多个key的值

  • msetnx:同setnx,可以设置多个(如果其中有一个存在,则全部失效,插入失败)

3. Redis列表(List)

简单的字符串列表,按照插入顺序排列,可以在头部或尾部添加元素。底层是链表。

命令

l从顶部插入或取出,r从底部插入或取出

  • lpush listname 值1 值2 值3 ...:写入list(排序与输入相反,先写的在底部,l:left)

  • rpush listname x1 x2 x3 ...:写入list(排序与输入相同,先写的在顶部,r:right)

  • lrange lname 开始 结束索引:获取list指定的元素(结束索引-1为结尾)

  • lpop lname取出顶部元素(序号最小的元素)

  • rpop lname取出底部元素(序号最大的元素)

  • lindex lname 索引:获取索引对应的元素

  • llen lname:获取list的长度

  • lrem lname n个 元素:删除list中n个元素(例:list1->1,2,3,3,3,4,lrem list1 2 3,list1->1,2,3,4)

  • ltrim lname 开始索引 结束索引:截取指定片段后重新赋予lname

  • rpoplpush list1 list2:从list1底部拿一个元素到list2的顶部

  • lset lname 索引 value:用value替代list中索引对应的元素

  • linsert lname before/after 值1 值2:在list的值1之前/之后插入值2

4. *Redis集合(Set)

无序无重复的集合。

命令

  • sadd sname 值1 值2 值3 ...:写入set(重复只写入一个)
    smembers sname:查看set里的值
    sismember sname value:查看set里是否存在value

  • scard sname:获取set元素的个数

  • srem key value:删除set中元素

  • srandmember sname 数字n:从set里随机获取n个元素

  • spop key:随机取出一个元素

  • smove set1 set2 值:从set1中拿指定元素放到set2

  • sdiff set1 set2:获取set1中set2没有的元素(差集)

  • sinter set1 set2:获取set1和set2都有的元素(交集)

  • sunion set1 set2:获取set1和set2所有不相同的元素(并集)

5. **Redis哈希(Hash)

一个键值对集合,类似java的map,特别适合存储对象。KV中的V是键值对

命令

  • hset hname key value:写入哈希,如果存在,就写入,不存在就新建再写入

  • hget hname key:获取hash1中key对应的value

  • hmset hname k1 v1 k2 v2 ...:新建哈希并插入多对键值对

  • hmget hname k1 k2 ...:获取hash中多个key对应的value

  • hgetall hname:获取hash中所有的键值对

  • hdel hname key:删除hash中指定的键值对

  • hlen hname:查看hash中的键值对数

  • hexists hname key:判断hash中指定key是否存在

  • hkeys hname:获取hash中所有的key

  • hvals hname:获取hash中所有的value

  • hincrby hname key 数字n:往hash中的key对应的value加n

  • hincrbyfloat hname key 小数f:往hash中的key对应的value加f

  • hsetnx hname key value:如果hash中存在要插入的key,则不插入

6. Redis有序集合Zset(sorted set)

zset和set一样是string类型元素的集合,且不允许重复的成员。但是zset的每个元素都会关联一个double类型的分数。zset成员是唯一的,但分数可以重复。redis就是按照每个成员的分数进行排序的。
在set基础上,每个值加上一个score值,set是k1 v1 v2 v3,zset是k1 score1 v1 score2 v2

命令

  • zadd zsname s1 v1 s2 v2 ...:插入zset

  • zrange zsname 开始索引 结束索引:查看zset中指定区域索引的value

  • zrangebyscore zsname 开始score 结束score:按score查询zset中的value
    例1:zrangebyscore zset1 (60 (90 大于60小于90
    例2:zrangebyscore zset1 60 90 limit 2 3 分页显示,从索引为2开始,获取包括自己及往下2个

  • zrem zsname value:删除zset中指定的value

  • zcard zsname:查询zset中value的个数

  • zcount zsname 开始score 结束score:查询在练歌score之间元素的个数

  • zrank zsname value:查看value的索引

  • zscore zsname value:查看value对应的score

  • zrevrank zsname value:逆序获取value的索引(反着数)

  • zrevrange zsname 开始索引 结束索引:与zrange作用相似,不过得到的结果是反着排序输出

  • zrevrangebyscore 结束score 开始score:与zrangebyscore作用相似,不过也是反着的

配置文件redis.conf

Units单位
  1. 配置文件就开始定义了基本的度量单位,只支持bytes,不支持bit。
  2. 大小写不敏感。
INCLUDES包含
  1. redis.conf文件中可以包含其他配置文件。
NETWORK网络
  1. bind 127.0.0.1
    绑定的端口/网络
  2. protected-mode yes
  3. port 6379
    端口号。
  4. tcp-backlog 511
    设置tcp的backlog,backlog是一个连接队列,backlog队列总和=未完成的三次握手队列+已完成的三次握手队列。高并发环境下用高backlog值避免慢客户端连接问题。
  5. timeout 0
    客户端闲置N秒后关闭连接(0为不关闭)。
  6. tcp-keepalive 300
    TCP保持活动状态。
    作用:
    1)检测死亡的同伴。
    2)从网络角度使连接活跃起来
    此选项的合理值为300秒
GENERAL通用

通用常用的标准化配置

  1. daemonize no
    默认情况下,Redis不会作为守护程序运行。需要将no改为yes。Redis守护进程将在/var/run/redis.pid中写入一个pid文件。(使用docker不需要改yes)
  2. supervised no
  3. pidfile /var/run/redis_6379.pid
    进程管道id文件
  4. Loglevel notice
    日志级别

    1. debug:开发测试阶段使用(日志信息最多)
    2. verbose
    3. notice
    4. warning(日志信息最少)
  5. logfile ""
    日志文件的名字,不写也可以是空字符串。
  6. databases 16
    默认16个数据库,默认数据库为0数据库,select切换数据库。
  7. always-show-logo yes
SNAPSHOTTING快照
  1. save <seconds> <changes>
    seconds:多少时间内
    changes:修改几次
    指定在多长时间,有多少次更新操作,就将数据同步到数据文件,可以多个save条件配合。
    默认三种:

    • save 900 1     #15分钟改1次
      
    • save 300 10    #5分钟改10次
      
    • save 60 10000  #1分钟改10000次
      

如果想禁用RDB持久化的策略,只要不设置save或设置save ""就可以了。
也可以在命令界面下输入save或bgsave立刻备份。
* save save时只管保存,其他不管,全部阻塞
* bgsave redis后台异步进行快照操作,快照的同事还可以响应客户端请求。
执行flushall也会产生dump.rdb文件,但里面是空的,无意义。
2. stop-writes-on-bgsave-error yes
后台保存时出错,前台停止写入,默认yes。
3. rdbcompression yes
指定存储到本地时是否LZF压缩数据,默认yes。
4. rdbchecksum
在存储快照后,让reids使用CRC64算法进行数据校验,会增加大约10%的性能消耗,默认yes。
5. dbfilename dump.rdb
指定本地数据库文件名。
6. dir ./
指定本地数据库存放目录。

REPLICATION复制
  1. masterauth <master-password>
SECURITY安全
  1. requirepass foobared
    设置redis连接密码,默认关闭
    也可以在redis服务器命令框下设置
    config get requirepass:查看密码
    config set requirepass password:设置密码
    auth password:输入密码
CLIENTS限制
  1. maxclients 10000
    最多连接数,0则不限制

  2. maxmemory <bytes>
    最大的内存(512M)

  3. maxmemory-policy noeviction
    缓存的移除策略(过期策略)
    lru:最近最少使用
    lfu:最不频繁使用
    random:随机
    ttl:有限时间内
    noeviction:永不过期(工作不推荐)

    1. volatile-lru:使用设置了过期时间的键中的近似LRU退出。
    2. allkeys-lru:使用近似的LRU退出任何密钥。
    3. volatile-lfu:使用已设置有效期的键中的近似LFU退出。
    4. allkeys-lfu:使用近似的LFU退出任何密钥。
    5. volatile-random:从设置了过期的密钥中删除一个随机密钥。
    6. allkeys-random:删除随机密钥,任何密钥。
    7. volatile-ttl:删除最接近到期时间(较小的TTL)的密钥。
    8. noeviction:不要驱逐任何东西,只在写操作时返回一个错误。
  4. maxmemory-samples 5
    设置样本数量,默认5个

APPEND ONLY MODE追加
  1. appendonly no
    aof的持久化,将redis执行过的所有写指令记录下来,默认no,需要开启。

  2. appendfilename "appendonly.aof"
    aop文件名字,默认appendonly.aof"。

  3. appendfsync everysec

    • no:
    • always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好。
    • everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内宕机,有数据丢失。
  4. no-appendfsync-on-rewrite no
    重写时是否可以运用yunyongAppendfsync,用默认no即可,保证数据安全性。

  5. auto-aof-rewrite-percentage 100
    设置重写的基准值:文件大小翻一倍(100为100%)触发。

  6. auto-aof-rewrite-min-size 64mb
    设置重写的基准值:文件大于64mb触发。(工作时可以设置到5GB以上)

redis的持久化

RDB(Redis DataBase)

在指定的时间间隔内将内存中的数据集快照写入磁盘,行话里的Snapshot快照,它恢复时是将快照文件直接读到内存里

恢复

如果电脑出现了问题,我们需要恢复原来的数据。

  1. 正常恢复
    重启就会重新加载。
  2. 异常恢复
    如果dump.rdb出现异常(如在写入dump.rdb时断电等),需要先将dump.rdb进行修复(redis-check-rdb --fix dump.rdb),然后重启恢复数据。

优势:

劣势:

总结:

AOF(Append Only File)

如果appendonly.aof和dump.rdb同时存在,加载的是appendonly.aof。

恢复

在配置文件中,将appendonly设置成yes,我们在写入数据时,就会记录到appendonly.aof,如果电脑出现了问题,我们需要恢复原来的数据。

  1. 正常恢复
    重启就会重新加载。

  2. 异常恢复

    如果appendonly.aof出现异常(如在写入appendonly.aof时断电等),需要先将appendonly.aof进行修复(redis-check-aof --fix appendonly.aof),然后重启恢复数据。

Rewrite



优势

劣势

总结:

RDB与AOF

redis的事务

常用命令

  1. discard:放弃执行事务块内的所有命令(取消事务)。
  2. exec:执行所有事务块内的命令(执行事务)。
  3. multi:标记一个事务块的开始,接下来的命令都会加入事务队列中(开始事务)。
  4. unwatch:取消watch命令对所有key的监控(取消监控)。
  5. watch key1 key2 ...:监视一个或多个key,如果在事务执行前这些key有被改动,那么事务将被打断(监控)。
正常执行exec
放弃事务discard
1. 全体连坐

multi之后,只要其中一个命令直接返回error,则在exec时也会返回error,执行失败。(如java的编译时异常)

2. 冤头债主(不保证原子性)

multi之后,其中一个命令逻辑错误但没直接返回error,则exec成功,error的返回error,ok的返回ok(如java的运行时异常)。

3. *watch监控

悲观锁(上锁)

乐观锁(不上锁)

CAS(check and set)
检查并设置

事务的三阶段

事务的三特性

redis的订阅/发布

不推荐充当消息中间件(了解redis有这功能即可)

命令

redis的消息

读写分离
容灾恢复



info replication:查看信息

slaveof 127.0.0.1 端口号:把本数据库设置成指定端口号的从库(没设置前都是master,设置了之后为slave)

当设置完从库后,从库就复制了主库所有的数据,包括slaveof之前设置的数据都会被复制到从库。(只有master主库才能写,slave从库只负责读)

一主二从(配从不配主)

这里设置了三个redis,6379当主库,6380和6381为6379从库。

  1. 当主库挂了(把主库exit来模拟死机)之后,从库还是slave,但是连接状态变为down,从库待命等待主库,当主库回来后,从库依然可以获取主库写入的数据。

  2. 当其中一个从库挂了,重启后,不再是slave,而是master,需要重新设置。

薪火相传

这里设置了三个redis,6379当主库,6380是6379的从库,6381是从库6380。

在主库6379写的数据,6380和6380的从库6381都能拿到。

  1. 当主库6379挂了,6380的连接状态为down,6381的连接状态依旧是up,主库重新连接后6380和6381都能获得6379的值。

  2. 当从库6380挂了,6379没从库,而6381连接状态为down,6381此时获取不到6379更新的数据,6380重新连接后,需要重新连接6379,6381才能拿到最新的数据。

反客为主

当主库挂了,需要一个从库来当主库。
slaveof no one:让一个从库来当主库,另一个从库重新连接这个新主库。

复制的原理

首次连接是全量复制(全部复制),其他是增量复制(只复制新的)。

*哨兵模式(反客为主的自动版)

  1. 一主二从,79下挂着80和81
  2. 在/myredis目录下新建sentinel.conf文件,名字不能错。
    在sentinel.conf文件中写入sentinel monitor 被监控数据库名字(自己起名字host6379) 127.0.0.1 6379 1
  3. 启动哨兵
    redis-sentinel /myredis/sentinel.conf

    当主库6379挂了,哨兵就会进行投票,选出一个从库来担任主库(票数相同则重新投票)。



    当6379重新启动后,哨兵会将6379变成slave挂在新主库下面。

    这时,6380挂了,哨兵会在6379和6381之间选主库。
    当只有两个库时,且新主库又挂了,剩下最后一个从库担任主库。
    如果都挂了,哨兵会等数据库重新启动,当有一个数据库启动后,哨兵会在一个启动两个死机的数据库中选出新主库,新主库不一定是重新启动了的数据库,有可能是死机的数据库。
复制的缺点

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重, Slave机器数量的增加也会使这个问题更加严重。

Jedis

Jedis的API与redis命令基本一致,可以直接参照redis的命令。

1. 测试连接

终端启动redis。
然后在linux下的IDEA,新建maven工程,选择webapp骨架。

导入jedis包坐标:

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency>

新建个java文件。

Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.ping());//返回PONG证明连接成功。
2. set和get
  • set添加键值对
    jedis.set("k1", "v1");jedis.set("k2", "v3");jedis.set("k3", "v3");

在终端keys *查看添加的数据。

  • get获得value
    System.out.println("k1");
  • keys获取所有数据
    Set<String> keys = jedis.keys("*");
3. 数据类型
1. key
2. String
3. List
4. Set
5. Hash
6. zSet
4. 事务
    Transaction transaction = jedis.multi();    //开启事务transaction.set("k4", "v4");    //添加到事务队列transaction.exec(); //执行事务//transaction.discard();  //取消事务
    jedis.watch("k1");  //加监控jedis.unwatch("k1");    //取消监控
5. 主从复制(配从不配主)

开启6379和6380,两个都为master

    Jedis jedis_M = new Jedis("127.0.0.1", 6379);Jedis jedis_S = new Jedis("127.0.0.1", 6380);jedis_S.slaveof("127.0.0.1", 6379);jedis_M.set("k1", "v1");    //主写System.out.println(jedis_S.get("k1"));  //从读
6. RedisPool连接池

学习redis是在b站看尚硅谷阳哥的视频的。
https://www.bilibili.com/video/BV1oW411u75R?p=1

上面有些图片就是视频中的内容,本人菜鸟一枚,笔记写的不全不好的地方,请多多见谅。

人气最高的缓存中间件:Redis相关推荐

  1. 新课发布-SpringBoot2.0缓存中间件Redis技术入门与实战(抢红包系统设计与实战)

    概要介绍:历经半个多月的时间,Debug呕心沥血.亲自录制的 "缓存中间件Redis技术入门与应用场景实战(SpringBoot2.x + 抢红包系统设计与实战)"的新课终于完成了 ...

  2. 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化

    引言 今天周末,我在家坐着掐指一算,马上又要到一年一度的金九银十招聘季了,国内今年上半年受到 YQ 冲击,金三银四泡汤了,这就直接导致很多今年毕业的同学会和明年毕业的同学一起参加今年下半年的秋招,这个 ...

  3. java实现缓存中间件,Redis,分布式系统中不可少的缓存中间件

    1.为什么要用缓存 内存在整个计算机系统来说也就是一个缓存,CPU操作内存速度很快:因为操作数据的时候,先从硬盘中取出数据放到内存中,然后CPU操作数据 缓存:提升访问效率,将一些频繁访问地放在缓存里 ...

  4. 分布式缓存中间件:Redis

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...

  5. 认识常见中间件-redis(二)-redis缓存雪崩、缓存击穿、缓存穿透

    缓存雪崩   缓存雪崩指的是大量的请求无法在 Redis 缓存系统中处理,请求全部打到数据库,导致数据库压力激增,甚至宕机.出现该错误的原因主要有两种: 大量热点数据同时过期,导致大量请求需要查询数据 ...

  6. SpringBoot高级-缓存-搭建redis环境测试

    实际开发中我们用的是缓存中间件,比如我们经常使用的Redis,memcache,包括ehcache,我们都是用一些缓存中间件,Springboot支持很多缓存的配置,而默认开启的是SimpleCach ...

  7. 设置log缓存_node多级缓存之redis缓存

    在node项目开发过程中,缓存常常被用来解决高性能.高并发等问题.在我们的实际项目中,运用缓存的思路是内存缓存-->接口-->文件缓存.前面的总结中已经详细的说明了怎么实现和封装内存缓存和 ...

  8. Spring Cache 实战:兼容所有缓存中间件!

    作者 | 悟空聊架构 来源 | 悟空聊架构(ID:PassJava666) 本篇给大家介绍一种兼容所有缓存中间件的方案,不论我们是使用 Redis 还是 Ehcache,都不需要关心如何操作 Redi ...

  9. APICACHE : Express/Node的API响应缓存中间件

    APICACHE : Express/Node的API响应缓存中间件 翻译来源:https://gitee.com/yunwisdoms/apicache 支持Redis或具有自动清除功能的内置内存引 ...

最新文章

  1. 数据库MYSQL学习系列三
  2. 没有任何基础学编程从哪开始_没有编程基础的朋友,学Python还是C/C++好,看了这个就明白了...
  3. 75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)
  4. android4.0 开机启动activity 4.0,如何正确理解和使用Activity的4种启动模式
  5. Xamarin Evolve 2016 Keynote回顾
  6. HTML5 文本元素
  7. mysql 无法创建视图_mysql无法创建视图怎么办
  8. 解决GET请求时中文乱码的问题
  9. dp - Google Code jam Qualification Round 2015 --- Problem B. Infinite House of Pancakes
  10. 深入浅出CChart 每日一课——快乐高四第九课 于无声处,CChart内置功能介绍之数据存取篇...
  11. Python 大文件处理
  12. 在线教学质量评价系统java web_基于JavaWeb的教师教学质量评价系统
  13. vue脚手架安装 axios 安装 配置 轮播图
  14. 计算机win10+上锁,手把手教你在windows 10右键菜单中添加Bitlocker上锁/解锁教程-网络教程与技术 -亦是美网络...
  15. 计算机软件公司用ps是,[计算机软件及应用]ps婚纱.doc
  16. 通信信道带宽为1Gbit/s,端到端时延为10ms。TCP的发送窗口为65535字节。试问: 可能达到的最大吞吐量是多少?信道的利用率是多少?
  17. PYTHON开发对接短信语音验证码接口
  18. 异常:egret获取引擎列表失败
  19. Mysql安装(转自韩顺平教育)
  20. NGFF接口标准, 或在今年大放异彩

热门文章

  1. WinForm DataGrid的功能扩展及实现 (已写完)
  2. SQL server 删除某行语句
  3. 【金三银四】Java集合面试题(2021最新版)
  4. python signal模块作用_Python模块:signal
  5. 微软:我们的电脑识图能力已超越人类
  6. 夏驰和徐策的大学英语四六级备考
  7. shell中各种括号的作用()、(())、[]、[[]]、{}
  8. stata psm命令_互助问答第301期:关于面板数据的PSM问题
  9. Reflections一个强大的类扫描工具介绍
  10. win10安装安卓子系统android13肯定成功Windows Subsystem for Android(WSA)install 无法定位程序输入点ucal_getHostTimeZone 无网络