Nginx+Lua 从Nginx和Redis缓存获取数据案例 详解_小柴的生活观的博客-CSDN博客_nginx获取redis数据


本站和网页 https://blog.csdn.net/chenshun123/article/details/80301606 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Nginx+Lua 从Nginx和Redis缓存获取数据案例 详解_小柴的生活观的博客-CSDN博客_nginx获取redis数据
Nginx+Lua 从Nginx和Redis缓存获取数据案例 详解
小柴的生活观
于 2018-05-13 18:46:02 发布
4234
收藏
分类专栏:
Nginx
Lua
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenshun123/article/details/80301606
版权
Nginx
同时被 2 个专栏收录
4 篇文章
1 订阅
订阅专栏
Lua
4 篇文章
0 订阅
订阅专栏
在 Nginx、Redis、Ehcache 三级缓存中,Nginx 分发层 和 应用层。在分发层 Nginx,通过 Lua,将商品id、商品店铺id,都转发到后端的应用nginx
可以通过 Nginx 指令重新加载所有配置包括 Lua 脚本
# /opt/modules/openresty/nginx/sbin/nginx/sbin/nginx -s reload
1> 应用 Nginx 的 Lua脚本接收到请求
2> 获取请求参数中的商品id,以及商品店铺id
3> 根据 商品id 和 商品店铺id,在 Nginx 本地缓存中尝试获取数据
4> 如果在 Nginx本地缓存中没有获取到数据,那么就到 Redis分布式缓存中获取数据,如果获取到数据,还要设置到 Nginx本地缓存中
这里有个问题,建议不要用 Nginx+Lua 直接去获取 Redis数据,因为 OpenResty 没有太好的 redis cluster 的支持包,所以建议是发送http请求到缓存数据生产服务,由该服务提供一个 http接口。缓存数生产服务可以基于 redis cluster api 从 Redis 中直接获取数据,并返回给 Nginx
在 OpenResty 编译文件中,引入 lua http lib包(一个网络请求的库)
GitHub访问地址 : 
https://github.com/pintsized/lua-resty-http
# cd 
/opt/modules/openresty/lualib/resty

wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http_headers.lua
--2018-05-10 21:23:25--  https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http_headers.lua
正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.72.133
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|151.101.72.133|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1150 (1.1K) [text/plain]
正在保存至: “http_headers.lua”
100%[==============================================================================================================================================>] 1,150       --.-K/s 用时 0s
2018-05-10 21:23:27 (262 MB/s) - 已保存 “http_headers.lua” [1150/1150])
# wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http.lua
--2018-05-10 21:24:33--  https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http.lua
正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.72.133
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|151.101.72.133|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:29686 (29K) [text/plain]
正在保存至: “http.lua”
100%[==============================================================================================================================================>] 29,686      --.-K/s 用时 0.1s
2018-05-10 21:24:34 (239 KB/s) - 已保存 “http.lua” [29686/29686])
5> 如果缓存数据生产服务没有在 Redis分布式缓存中没有获取到数据,那么就在本地 Ehcache 中获取数据,返回数据给 Nginx,也要设置到 Nginx本地缓存中
6> 如果 Ehcache 本地缓存都没有数据,那么就需要去原始的服务中拉去数据,该服务会从 MySQL 中查询,拉去到数据之后,返回给 Nginx,并重新设置到 Ehcache和 Rdis 中
注 : 这里存在一个问题,那就是分布式缓存重建并发冲突问题
7> Nginx 最终利用获取到的数据,动态渲染网页模板
在 OpenResty 编译文件中,引入lua-resty-template库
GitHub 访问地址 : 
https://github.com/bungle/lua-resty-template
# cd /opt/modules/openresty/lualib/resty
# wget https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template.lua
--2018-04-18 03:49:12--  https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template.lua
正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:15473 (15K) [text/plain]
正在保存至: “template.lua”
100%[=================================================================================================>] 15,473      95.8KB/s 用时 0.2s
2018-04-18 03:49:14 (95.8 KB/s) - 已保存 “template.lua” [15473/15473])
# mkdir html
# cd html
# wget https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template/html.lua
--2018-04-18 03:50:32--  https://raw.githubusercontent.com/bungle/lua-resty-template/master/lib/resty/template/html.lua
正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1235 (1.2K) [text/plain]
正在保存至: “html.lua”
100%[=================================================================================================>] 1,235       --.-K/s 用时 0s
在 lua.conf 也就是 Nginx 配置中引入的配置文件,在该文件的 server 标签中配置模板位置
# cd /opt/modules/openresty
# mkdir templates/
# mkdir -p hello/templates
# cd /opt/modules/openresty/nginx/conf
# vi lua.conf
server {
    listen       80;
    server_name  _;
    # template_root (set $template_root /var/www/site/templates)
    # template_location (set $template_location /templates)
    # 如果在 Nginx 配置中没有这些设置,则使用 ngx.var.document_root的值。如果设置 template_location,则正常返回(状态码200),则使用优先使用该配置其渲染。
    # 如果找不到,将尝试使用 template_root 或 document_root
    # 如果使用 $template_location 此时服务器使用 ngx_static 模式
    # $template_root 无法识别该目录下子目录中存放的模板
    #set $template_location "/opt/modules/openresty/templates";
    set $template_root "/opt/modules/openresty/templates";
    location /lua {
        default_type 'text/html';
        content_by_lua_file conf/lua/test.lua;
    }
    location /hello {
        default_type 'text/html';
        content_by_lua_file conf/lua/hello.lua;
    }
创建产品 HTML 模板
# cd /opt/modules/openresty/templates
# vi product.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>商品详情页</title>
</head>
<body>
商品id: {* productId *}

商品名称: {* productName *}

商品图片列表: {* productPictureList *}

商品规格: {* productSpecification *}

商品售后服务: {* productService *}

商品颜色: {* productColor *}

商品大小: {* productSize *}

店铺id: {* shopId *}

店铺名称: {* shopName *}

店铺评级: {* shopLevel *}

店铺好评率: {* shopGoodCommentRate *}

</body>
</html>
8> 将渲染后的网页模板作为 http 响应,返回给 分发层Nginx
修改 Lua 缓存大小
# cd /opt/modules/openresty/nginx/conf
# vi nginx.conf
#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
# 设置缓存大小
    
lua_shared_dict my_cache 128m;
    lua_package_path "/opt/modules/openresty/lualib/?.lua;;";
    lua_package_cpath "/opt/modules/openresty/lualib/?.so;;";
    include lua.conf;
添加产品访问监控,并设置产品 Lua 脚本
# cd /opt/modules/openresty/nginx/conf
# vi lua.conf
server {
    listen       80;
    server_name  _;
    # 设置模板存放位置
    set $template_location "/opt/modules/openresty/templates";
    set $template_root "/opt/modules/openresty/hello/templates";
    # 设置缓存大小
    lua_shared_dict my_cache 128m;
    location /lua {
        default_type 'text/html';
        content_by_lua_file conf/lua/test.lua;
    }
    location /hello {
        default_type 'text/html';
        content_by_lua_file conf/lua/hello.lua;
    }
    # 产品访问位置
    location /product {
        default_type 'text/html';
        content_by_lua_file conf/lua/product.lua;
    }
# cd lua
# vi product.lua
local uri_args = ngx.req.get_uri_args()
local productId = uri_args["productId"]
local shopId = uri_args["shopId"]
-- 使用在 nginx.conf 中通过 lua_shared_dict my_cache 128m; 定义的缓存中获取数据
local cache_ngx = ngx.shared.my_cache
-- 生成产品和商店的 key
local productCacheKey = "product_info_" .. productId
local shopCacheKey = "shop_info_" .. shopId
-- 获取缓存信息
local productCache = cache_ngx:get(productCacheKey)
local shopCache = cache_ngx:get(shopCacheKey)
-- 请求访问地址
-- 检查 product 缓存信息,如果不存在,则向服务端获取
if productCache == "" or productCache == nil then
    local http = require("resty.http")
    local httpc = http.new()
    local resp, err = httpc:request_uri("http://192.168.86.226:8080", {
        method = "GET",
        path = "/getProductInfo?productId=" .. productId
    })
    productCache = resp.body
    -- 缓存产品信息,并设置缓存时间 10 * 60 秒,也就是 10分钟
    cache_ngx:set(productCacheKey, productCache, 10 * 60)
end
-- 检查 shop 缓存信息,如果不存在,则向服务端获取
if shopCache == "" or shopCache == nil then
    local http = require("resty.http")
    local httpc = http.new()
    local resp, err = httpc:request_uri("http://192.168.86.226:8080", {
        method = "GET",
        path = "/getShopInfo?shopId=" .. shopId
    })
    shopCache = resp.body
    -- 缓存店铺信息,并设置缓存时间 10 * 60 秒,也就是 10分钟
    cache_ngx:set(shopCacheKey, shopCache, 10 * 60)
end
local cjson = require("cjson")
local productCacheJSON = cjson.decode(productCache)
local shopCacheJSON = cjson.decode(shopCache)
local context = {
    productId = productCacheJSON.id,
    productName = productCacheJSON.name,
    productPrice = productCacheJSON.price,
    productPictureList = productCacheJSON.pictureList,
    productSpecification = productCacheJSON.specification,
    productService = productCacheJSON.service,
    productColor = productCacheJSON.color,
    productSize = productCacheJSON.size,
    shopId = shopCacheJSON.id,
    shopName = shopCacheJSON.name,
    shopLevel = shopCacheJSON.level,
    shopGoodCommentRate = shopCacheJSON.goodCommentRate
-- 使用模板生成相应的文件
local template = require("resty.template")
template.render("product.html", context)
# 重新加载所有配置包括,有新模板的添加也要使用 Nginx 重新加载一次模板
# cd /opt/modules/openresty/nginx
# ./sbin/nginx -s reload
第一次访问的时候,其实在 Nginx本地缓存中是取不到的,所以会发送 http请求到后端的缓存服务里去获取,会从 Redis 中获取。拿到数据以后,会放到 Nginx 本地缓存里面去,过期时间是 10分钟,然后将所有数据渲染到模板中,返回模板,以后再来访问的时候,就会直接从 Nginx本地缓存区获取数据 :
缓存数据生产 -> 有数据变更 -> 主动更新两级缓存(ehcache+redis) -> 缓存维度化拆分
分发层Nginx + 应用层Nginx -> 自定义流量分发策略提高缓存命中率
nginx shared dict缓存 -> 缓存服务 -> redis -> ehcache -> 渲染html模板 -> 返回页面
还差最后一个很关键的要点,就是如果数据在 nginx -> redis -> ehcache 三级缓存都不在,可能就是数据通过 LRU 算法给清理掉了,这个时候缓存服务会重新拉去数据,去更新到 ehcache 和 redis中,这里存在 分布式的缓存重建的并发问题,这个问题可以通过分布式锁解决 
小柴的生活观
关注
关注
点赞
收藏
打赏
评论
Nginx+Lua 从Nginx和Redis缓存获取数据案例 详解
在 Nginx、Redis、Ehcache 三级缓存中,Nginx 分发层 和 应用层。在分发层 Nginx,通过 Lua,将商品id、商品店铺id,都转发到后端的应用nginx可以通过 Nginx 指令重新加载所有配置包括 Lua 脚本# /opt/modules/openresty/nginx/sbin/nginx/sbin/nginx -s reload1&gt; 应用 Nginx 的 Lu...
复制链接
扫一扫
专栏目录
nginx-lua-redis-rate-measuring:一个lua库,可使用nginx + redis提供分布式速率测量,您可以使用它来在许多节点内进行节流系统
02-03
nginx-lua-redis-rate-measuring:一个lua库,可使用nginx + redis提供分布式速率测量,您可以使用它来在许多节点内进行节流系统
评论 2
您还未登录,请先
登录
后发表或查看评论
redis和nginx安装命令1
qq_56233360的博客
09-03
redis和nginx安装
nginx+lua+redis实现post请求接口之黑名单(一)
weixin_33923762的博客
06-05
263
一、概述
需求:所有访问/webapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器(Tomcat)实现思路:通过在Nginx上进行访问限制,通过Lua来灵活实现业务需求,而Redis用于存储黑名单列表。
二、具体实现
1.lua代码本例中限制规则包括(post请求,ip地址黑名单,请求参数中imsi,tel值和黑名单)
[ro...
【java服务框架】多级缓存 使用openResty实现Nginx本地缓存
最新发布
m0_57042151的博客
10-27
87
OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点:
具备Nginx的完整功能
基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块
允许使用Lua自定义业务逻辑、自定义库
Lua在nginx环境中读取redis的demo(01)
Hierarch的博客
05-22
403
我使用的环境是openresty-1.15.8.1-win64 为运行环境;编辑器是 idea项目结构
lua.conf :
server {
listen 8033;
server_name _;
location /lua {
default_type 'text/html';
content_by_lua_file testlua/TestSearch.lua;
...
Nginx+Lua+Redis 实现高性能缓存数据读取
09-11
725
本文摘自:https://segmentfault.com/p/1210000011625271/read
不采用lua之前,我们从redis获取数据的路径与采用lua之后获取数据的路径对比,明显可以看出效率的提升。
安装OpenResty
参考官方给出的yum安装步骤,各种系统均有支持,也可采用源码安装的形式,安装完成后默认路径是/usr/local/op...
使用nginx+lua脚本读写redis缓存
weixin_30535043的博客
04-29
173
配置
新建springboot项目增加redis配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dep...
(转)nginx+redis实现接入层高性能缓存技术
super-pf的博客
01-29
1万+
转自:http://blog.csdn.net/phil_code/article/details/79154271
一. OpenResty
OpenResty是一个基于 Nginx与 Lua的高性能 Web平台,其内部集成了大量精良的 Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web 应用、Web 服务和动态网关。
接入层缓存技术就是使用Op
Nginx与Redis
mj1515dsa的博客
08-18
312
我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的 情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负 载均衡。降低原来单个服务器的压力。..
nginx 代理 redis
faceqq的博客
05-17
1937
kubernetes 发布的redis服务端口为 31250
通过命令查询
[mini@ecs-88500735 /]$ minikube service redis --url
http://192.168.49.2:31250
[root@ecs-88500735 /]# vi /etc/nginx/nginx.conf
配置nginx.conf
stream {
upstream redis {
server 192.168.49.2:31250;
server {
32、Nginx + OpenResty +redis 实现URL地址自取Redis缓存信息
众神之翼
04-04
1076
第一步:安装OpenResty 依赖
# apt-get install libreadline-dev libpcre3-dev libssl-dev perl
摘要说明:OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起
OpenResty提供了一些常用的ngx_lua开发模块:如
lua-resty-memcached
...
nginx使用redis作为外置缓存
飞龙在天
07-16
473
redis2-nginx-module是一个支持 Redis 2.0 协议的 Nginx upstream 模块,它可以让 Nginx 以非阻塞方式直接防问远方的 Redis 服务,同时支持 TCP 协议和 Unix Domain Socket 模式,并且可以启用强大的 Redis 连接池功能。...
Nginx + Lua + redis (一)
热门推荐
08-21
4万+
使用 Lua 脚本语言操作 Redis。
由于大量的 Lua 代码写在 Nginx
中,会使配置文件显得很繁琐,所以这里使用 content_by_lua_file 来引入 Lua
脚本文件。
要使用 content_by_lua_file,需要安装 nginx_lua_module 模块。
安装介绍,猛击这里:nginx_lua_module
大神 章亦春 提供了一个很方便的开发
lua nginx mysql_使用lua从mysql数据库导出数据到redis与Nginx缓存
weixin_42364833的博客
02-01
51
安装lua有linux版本的安装也有mac版本的安装。。我们采用linux版本的安装,首先我们准备一个linux虚拟机。安装步骤,在linux系统中执行下面的命令。//下载curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz//解压tar zxf lua-5.3.5.tar.gzcd lua-5.3.5make linux test此时再执行lua测...
33、Nginx + OpenResty + Redis 采用Lua脚本方式自取Redis缓存信息
众神之翼
04-11
720
安装攻略,请参照https://blog.csdn.net/crystalcs2010/article/details/89027002
这里只针对Nginx 配置文件以及Lua脚本做描述
nginx.conf 添加如下代码
location /lua_get {
add_header 'Access-Control-Allow-Origin' '*';
add_he...
Nginx 连接 Redis 实现数据库操作
uno的博客
07-11
1644
Nginx 连接 Redis 实现数据库操作
实现的功能:当有新的连接到达Nginx时,在redis记录连接数量。
1. redis 创建数据库
安装完成redis之后,通过set connums 0 创建数据。(redis基本使用参照官方文档即可)。
2. 更改 Nginx 源码
由于是要在新建连接时进行连接计数加一,因此需要在nginx accept新的连接时进行计数操作,首先找到 Nginx 处理新连接的函数所在文件nginx/src/event/ngx_event_accept.c,在该文件中能够找
Nginx+Lua+Redis实例
jazywoo_在路上
03-04
2645
lua加入到nginx中,相当于让nginx拥有了处理业务逻辑的能力。
例如:对IP进行封禁
在站点遇到攻击且无明显攻击特征,造成站点访问慢,nginx不断返回502等错误时,可利用nginx+lua+redis实现在指定的时间段内,若单IP的请求量达到指定的数量后对该IP进行封禁,nginx返回403禁止访问。利用redis的expire命令设置封禁IP的过期时间达到在指定的封禁时间后实行
nginx redis php,Nginx 高级篇(五)Nginx 直连 Redis
weixin_33954881的博客
03-20
246
redis2-nginx-module 是一个支持 Redis 2.0 协议的 Nginx upstream 模块,它可以让 Nginx 以非阻塞方式直接防问远方的 Redis 服务,同时支持 TCP 协议和 Unix Domain Socket 模式,并且可以启用强大的 Redis 连接池功能。详情见github https://github.com/openresty/redis2-nginx...
nginx动静分离,集群 和redis安装
mobai___的博客
06-23
40
1.动静分离
服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html,css,js和图片资源等等,有一部分是动态数据的请求。因为tomcat处理静态资源的速度比较慢,所以我们可以把所有静态资源独立开来,交给处理静态资源更快的服务器例如nginx处理,而把动态请求交给tomcat处理。
测试:
1)创建一个web工程打包放入linux系统中
2)修改nginx配置
2.nginx集群
服务器在使用时有可能发生故障,如果只有一台服务器,此时服务器宕机就不能服务用户了。而利用集群管理
Nginx 相关介绍
a315612852的博客
08-06
571
Nginx的产生
没有听过Nginx?那么一定听过它的“同行”Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
然而,这些服务器在设计...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
小柴的生活观
CSDN认证博客专家
CSDN认证企业博客
码龄11年
暂无认证
230
原创
7万+
周排名
1万+
总排名
131万+
访问
等级
8739
积分
190
粉丝
297
获赞
95
评论
863
收藏
私信
关注
热门文章
IntelliJ IDEA Tomcat配置 详解
285174
MySQL 清空表(truncate)与删除表中数据(delete) 详解
93670
IntelliJ IDEA 配置MySQL数据库 详解
86243
IntelliJ IDEA 缓存和索引介绍和清理方法
53545
Lambda表达式 详解
48533
分类专栏
golang
1篇
数仓
2篇
HBase
1篇
Kafka
1篇
Flink
2篇
读书
1篇
MySQL
27篇
Java
46篇
Android
19篇
JavaWeb
4篇
GitHub
5篇
网络安全
4篇
SVN
1篇
UI设计规范
1篇
Eclipse
3篇
Tomcat
5篇
Android Studio
2篇
读书笔记
1篇
设计模式
19篇
IOS
28篇
IntelliJ IDEA
9篇
快捷键
1篇
工具使用
1篇
Linux
6篇
Git
2篇
maven
2篇
hadoop
2篇
Hive
3篇
Hue
2篇
Scala
1篇
AngularJS
1篇
Redis
2篇
MyBatis
2篇
Spring
3篇
JQuery
1篇
JavaScript
9篇
ActiveMQ
1篇
Docker
1篇
ReactJS
5篇
前端
集群/分布式
4篇
MyCat
9篇
Oracle
Nginx
4篇
Lua
4篇
最新评论
Kafka 顺序消费 详解
梁教授0416:
你这个样例解决不了问题。你不可能就部署一个实例。贴业务干吧,如果update比insert提前消费,先把数据入到mysql,紧接着去查数据库消费数据库里的update
Java Nashorn 详解
weixin_39105133:
能支持es6语法吗
IntelliJ IDEA Tomcat配置 详解
weixin_53727237:
请问楼主显示 no artifacts configured怎么解决
Lambda表达式 详解
坏人修:
这样的文章值得尊敬
MapStruct 详解
误逐世间乐:
因为是机翻的
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Mac/Linux 安装 Go 详解
Hive 数据抽样 详解
HBase Shell操作 详解
2022年10篇
2021年1篇
2018年77篇
2017年48篇
2016年87篇
2015年7篇
目录
目录
分类专栏
golang
1篇
数仓
2篇
HBase
1篇
Kafka
1篇
Flink
2篇
读书
1篇
MySQL
27篇
Java
46篇
Android
19篇
JavaWeb
4篇
GitHub
5篇
网络安全
4篇
SVN
1篇
UI设计规范
1篇
Eclipse
3篇
Tomcat
5篇
Android Studio
2篇
读书笔记
1篇
设计模式
19篇
IOS
28篇
IntelliJ IDEA
9篇
快捷键
1篇
工具使用
1篇
Linux
6篇
Git
2篇
maven
2篇
hadoop
2篇
Hive
3篇
Hue
2篇
Scala
1篇
AngularJS
1篇
Redis
2篇
MyBatis
2篇
Spring
3篇
JQuery
1篇
JavaScript
9篇
ActiveMQ
1篇
Docker
1篇
ReactJS
5篇
前端
集群/分布式
4篇
MyCat
9篇
Oracle
Nginx
4篇
Lua
4篇
目录
评论 2
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
小柴的生活观
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值