java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4479|回复: 2

【java学习】java web Redis学习总结 经典

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66083

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2016-7-28 19:08:43 | 显示全部楼层 |阅读模式
    第一章 Redis
    redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了PythonRubyErlangPHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定
    一.1 LINUX下面安装redis
         Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。
    Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)
    1. 下载地址:
    2. 解压缩
    $ tar xzf redis-2.6.13.tar.gz
    3. 编译
    $ cd redis-2.6.13
    $ make
    $make install
    $cp redis.conf /etc/
    ) C9 q! _/ z4 |/ U0 J. |! z1 c
    安装成功之后会在src文件夹内有redis-serverredis-cli两个命令
    建议将其放到bin
    sudo cp redis-server /usr/local/bin/
    sudo cp redis-cli /usr/local/bin/

      E: m$ m5 i. a  A( x# O+ G
    参数介绍:
    make install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-serverredis-cliredis-benchmarkredis-check-aof redis-check-dump,它们的作用如下:
    redis-serverRedis服务器的daemon启动程序
    redis-cliRedis命令行操作工具。也可以用telnet根据其纯文本协议来操作
    redis-benchmarkRedis性能测试工具,测试Redis在当前系统下的读写性能
    redis-check-aof:数据修复
    redis-check-dump:检查导出工具
    一.2 配置文件参数
    redis.conf 文件配置如下:
    ! [5 Y1 c0 V. g5 |; G; ~% Hdaemonize yes  #以后台daemon方式运行redis
    # F: u, h$ c7 ^" y8 rpidfile "/var/run/redis.pid"  #redis以后台运行,默认pid文件路径/var/run/redis.pid
    4 j% u3 y9 \9 x8 [port 6379  #默认端口. L& J+ c5 Q; b7 g. b4 d
    bind 127.0.0.1 #默认绑定本机所有ip地址,为了安全,可以只监听内网ip- P1 f& r* m2 H* A, W$ [
    timeout 300 #客户端超时设置,单位为秒) f) _& W+ R0 X8 `
    loglevel verbose  #设置日志级别,支持四个级别:debugnoticeverbosewarning. s: I/ `7 J* j8 ?$ @
    logfile stdout  #日志记录方式,默认为标准输出,logs不写文件,输出到空设备/deb/null
    # U1 L4 n) A, j/ o7 m2 @( Zlogfile "/usr/local/redis/var/redis.log"  #可以指定日志文件路径
    7 w. U" h( L+ |- p4 u) Hdatabases 16  #开启数据库的数量
    , z% A' q2 N  n9 O; Q  [( K9 ssave 900 1
    7 \: h. z8 Z; `6 }& Osave 300 10$ _7 ?; d) V9 U( R0 I+ A
    save 60 10000# N; U+ k, A- y! p9 Z/ i
    创建本地数据库快照,格式:save * *& @  ]7 e( ^8 f2 U+ a* `9 e
    900秒内,执行1次写操作# C9 w0 l8 @7 P9 t2 ?( ]$ j, T% J
    300秒内,执行10次写操作" Y1 s& q! @. C2 m5 x9 B) @
    60秒内,执行10000次写操作5 x# `2 L4 ^8 [
    rdbcompression yes #启用数据库lzf压缩,也可以设置为no
    ' F5 v! ~3 S2 D/ b: Adbfilename dump.rdb  #本地快照数据库名称
    , G1 E0 `. }: c  I" g* sdir "/usr/local/redis/var/"   #本地快照数据库存放目录
    + S2 k/ c0 z8 e; c: a9 \requirepass 123456  #设置redis数据库连接密码, [+ X8 Z0 Y- u7 L3 @
    maxclients 10000 #同一时间最大客户端连接数,0为无限制
    : c, l8 j1 t$ D) h7 Tmaxmemory 1024MB #设定redis最大使用内存,值要小于物理内存,必须设置
    9 z( B& t1 n- P+ U5 d2 o4 _appendonly yes  #开启日志记录,相当于MySQLbinlog
    # V( F% R; Z% `) C  x) Jappendfilename "appendonly.aof"   #日志文件名,注意:不是目录路径
    . |9 e$ L3 F. q. Bappendfsync everysec #每秒执行同步,还有两个参数alwaysno一般设置为everysec,相当于MySQL事物日志的写方式' r$ v; k. e9 r% a( m& w9 ]" r+ D
    :wq! #保存退出
    一.3 启动和关闭
    启动redis服务
        [root@Architect redis-1.2.6]# pwd  
        /usr/local/redis-1.2.6  
        [root@Architect redis-1.2.6]# redis-server /etc/redis.conf  
    查看进程,确认redis已经启动
        [root@Architect redis-1.2.6]# ps -ef | grep redis  
        root       401 29222  0 18:06 pts/3    00:00:00 grep redis  
        root     29258     1  0 16:23 ?        00:00:00 redis-server /etc/redis.conf  
    如果这里启动redis服务失败,一般情况下是因为redis.conf文件有问题,建议检查或找个可用的配置文件进行覆盖,
    避免少走弯路,这里建议,修改redis.conf,设置redis进程为后台守护进程
        # 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  
    一.4 测试redis
        [root@Architect redis-1.2.6]# redis-cli -a 33e9redis
        redis> set name songbin  
        OK  
        redis> get name   
    "songbin"  
    5 Q9 B5 U2 A: ~& d/ S
    redis-cli -a 123456  #连接redis数据库,注意:-a后面跟redis数据库密码
    5 P* Q" w0 j* Eset name 111cn.net  #写数据3 p" I; p6 C6 i) R. x, B- i& i# `0 ~1 Q
    get name  #读取数据
    ( H( e. L* J) g8 j# f0 g, r" texit #退出redis数据库控制台 quit

    5 i1 S( |( g8 m6 O
    ' X5 r+ ~1 |& Q* M3 A4 d0 \! b# e7 I
    5关闭redis服务
        redis-cli shutdown  
    redis服务关闭后,缓存数据会自动dump到硬盘上,硬盘地址为redis.conf中的配置项dbfilename dump.rdb所设定强制备份数据到磁盘,使用如下命令
    redis-cli save 或者 redis-cli -p 6380 save(指定端口)
    一.5 redis启动脚本
    启动脚本(startRedis.sh):
    #/opt/redis-2.8.6/redis.confredis配置文件目录
    #nohup /usr/local/bin/redis-server  /redis/redis-2.8.6/redis.conf &
    redis-2.8.6/src/redis-server redis-2.8.6/redis.conf &
    停止脚本(stopRedis.sh)
    redis-2.8.6/src/redis-cli -p 6379 -a 33e9redis  shutdown
    两个脚本放在和redis安装目录同级,如下图所示:
    8 y1 s6 A" e6 X" J3 k
    启动命令如下: ./startRedis.sh

    1 k& J; N- J0 [% Z; V
    输入 ps -ef |grep redis 查看是否启动成功。
    关闭命令如下:./stopRedis.sh
    如果报错:-bash: ./stopRedis.sh: 权限不够
    则要增加权限:
    localhost redis]# chmod u+x stopRedis.sh
    [root@localhost redis]# ./stoRedis.sh
    一.6 安全性
        为redis设置密码:设置客户端连接后进行任何其他指定前需要实用的密码。
    警告:因为redis速度非常快,所以在一台较好的服务器下,一个外部用户可以在一秒钟进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
    修改密码的方法:
        只需要在redis的配置文件redis.conf中开启requirepass就可以了,比如我设置我的访问密码是mypassword
    requirepass mypassword
    redis.conf中加入这一行代码之后,我们杀死原来的redis进程:
    pkill redis然后重新启动redis
    /usr/local/redis-2.8.1/src/redis-server /user/local/redis-2.8.1/redis.conf
    然后我们用/usr/local/redis-2.8.1/src/redis-cli发现还能登陆进来,但是当我们执行操作的时候,比如keys *就会如下错误:
    127.0.0.1:6379> keys *
      L7 g+ `% s4 q# D2 v- b# Y(error) NOAUTH Authentication required.
    没有必要的授权验证。
    在这里redis支持两种授权方式,一种就是直接用auth命令进行授权:
    , \" W9 h+ G! Y8 o4 d; e7 s$ T# t
    第一次输入了一个错误的密码test,授权失败,第二次输入正确的密码,返回ok,授权成功,之后就可以进行所有的操作。
    如果我们不想每次登录进来之后都要用auth进行授权,那么我们可以采用另一种授权方式,就是在登陆客户端的时候用-a 来指定密码
    sh-3.2# /usr/local/redis-2.8.1/src/redis-cli -a mypassword
    上面的密码如果输错,也能进入,但是之后不能进行操作。需要用auth重新进行授权。
    第二章 二、主从复制
        Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。
    redis主从复制的特点:
    1.一台master可以拥有多个slave1对多的关系)
    2.多个slave可以连接同一个master外,还可以连接到其他slave(这样做的原因是如果masterdown掉之后其中的一台slave立马可以充当master的角色,这样整个服务流程不受影响)
    3.中从复制不会阻塞master,在同步数据的同时,master可以继续处理client请求。
    4.提高系统的伸缩性
    redis主从复制的过程:
    1.slavemaster建立连接,发送sync同步命令。
    2.Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新得写命令并缓存。
    3.后台完成保存后,将文件发送给slave
    4.slave将文件保存到硬盘上
    配置主从服务器:
    配置slave服务器很简单,只需要在slave的配置文件中加入以下配置:
    slaveof masterip masterport
    如果主机开启了登录验证,那么还需要加入下面这句:
    masterauth authpassword
    然后启动从机,首先主机会发快照给从机,从机的数据库会更新到和主机相同的状态,然后往主机里写内容,从机也会随之更新。
    如果我们在从机上写数据那么会报错:
    (error) READONLY You can't write against a read only slave.
    我们可以用info命令来查看主从服务器的信息,在从机上用info命令可以看到
    roleslave
    master_host:masterip
    master_port:masterport
    master_link_status:up证明和主机处在连接状态
    在主机上用info命令
    rolemaster
    同时连接着几台从机
    connected_slaves:1
    同时可以查看连接到主机上=6379,state=online,offset=1709,lag=17 S* h' E4 ?  p  ]
    第三章 Jedis使用三.1 入门实例
    RedisUtil 代码如下:
    package com.test;

    5 g1 h/ t& ^. _
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    ) }8 P3 s- `; P/ i( [; \
    public final class RedisUtil {

    9 L) k' `9 ^( b$ G% e$ H
        //Redis服务器IP
        private static String ADDR = "192.168.0.100";

    . N& U+ y. Z% v8 T  D
        //Redis的端口号
        private static int PORT = 6379;

    ; b$ j  A$ B) y
        //访问密码
        private static String AUTH = "admin";
    4 e4 G  Q  \6 S
        //可用连接实例的最大数目,默认值为8;
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        private static int MAX_ACTIVE = 1024;
    # m) W7 Y- v5 w+ E
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
        private static int MAX_IDLE = 200;

    ) _) @( g) s& T$ C& h$ Z+ t) E3 U0 @: O
        //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
        private static int MAX_WAIT = 10000;
    . c5 S: z. J  C7 j
        private static int TIMEOUT = 10000;
    $ E1 x0 J  u$ j& t# [
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
        private static boolean TEST_ON_BORROW = true;
    ' C, W5 F; H: \3 W- z/ C6 U' G3 Y
        private static JedisPool jedisPool = null;

    ' R! q) ~7 X. l5 s& y' o3 Y6 c+ o
        /**
         * 初始化Redis连接池
         */
        static {
            try {
                JedisPoolConfig config = new JedisPoolConfig();
                config.setMaxActive(MAX_ACTIVE);
                config.setMaxIdle(MAX_IDLE);
                config.setMaxWait(MAX_WAIT);
                config.setTestOnBorrow(TEST_ON_BORROW);
                jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    + B! G, m5 g- v! a6 y" n' P) k
        /**
         * 获取Jedis实例
         * @return
         */
        public synchronized static Jedis getJedis() {
            try {
                if (jedisPool != null) {
                    Jedis resource = jedisPool.getResource();
                    return resource;
                } else {
                    return null;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    & w# L  H- S- \- U! ^$ a
        /**
         * 释放jedis资源
         * @param jedis
         */
        public static void returnResource(final Jedis jedis) {
            if (jedis != null) {
                jedisPool.returnResource(jedis);
            }
        }
    }
    TestRedis 代码如下:
    package com.test;

    * @5 \3 A5 ?9 R% j
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;

    * C. W$ O/ b" m; Q
    import org.junit.Before;
    import org.junit.Test;

    ) |- S+ C8 [9 U5 [; h" p9 _# t
    import redis.clients.jedis.Jedis;

    ) a( F2 m2 M& l
    public class TestRedis {
        private Jedis jedis;

      D. F4 u9 d$ ?% i0 K; Y
        @Before
        public void setup() {
            //连接redis服务器,192.168.0.100:6379
            jedis = new Jedis("192.168.0.100", 6379);
            //权限认证
            jedis.auth("admin");  
        }
    + O6 l7 e1 B, Y* m
        /**
         * redis存储字符串
         */
        @Test
        public void testString() {
            //-----添加数据----------  
            jedis.set("name","xinxin");//向key-->name中放入了value-->xinxin  
            System.out.println(jedis.get("name"));//执行结果:xinxin  

    % G2 ^* a  U$ L8 F2 I$ n
            jedis.append("name", " is my lover"); //拼接
            System.out.println(jedis.get("name"));

    7 U& P4 ^# L: `
            jedis.del("name");  //删除某个键
            System.out.println(jedis.get("name"));
            //设置多个键值对
            jedis.mset("name","liuling","age","23","qq","476777XXX");
            jedis.incr("age"); //进行加1操作
            System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));

    ; }( g' ], W+ Y3 G) m
        }
    / t6 h8 y. c, d8 ~' f
        /**
         * redis操作Map
         */
        @Test
        public void testMap() {
            //-----添加数据----------  
            Map<String, String> map = new HashMap<String, String>();
            map.put("name", "xinxin");
            map.put("age", "22");
            map.put("qq", "123456");
            jedis.hmset("user",map);
            //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List  
            //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数  
            List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
            System.out.println(rsmap);  
    - X/ p, B: b/ }5 I9 k  Z
            //删除map中的某个键值  
            jedis.hdel("user","age");
            System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null  
            System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2
            System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true  
            System.out.println(jedis.hkeys("user"));//返回map对象中的所有key  
            System.out.println(jedis.hvals("user"));//返回map对象中的所有value
    : `! u# O5 u+ M! t2 i* m) K) p6 k
            Iterator<String> iter=jedis.hkeys("user").iterator();  
            while (iter.hasNext()){  
                String key = iter.next();  
                System.out.println(key+":"+jedis.hmget("user",key));  
            }  
        }
    : F* L3 _0 d* j: L# `" A0 B. v
        /**
         * jedis操作List
         */  
        @Test  
        public void testList(){  
            //开始前,先移除所有的内容  
            jedis.del("java framework");  
            System.out.println(jedis.lrange("java framework",0,-1));  
            //先向key java framework中存放三条数据  
            jedis.lpush("java framework","spring");  
            jedis.lpush("java framework","struts");  
            jedis.lpush("java framework","hibernate");  
            //再取出所有数据jedis.lrange是按范围取出,  
            // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有  
            System.out.println(jedis.lrange("java framework",0,-1));  
    ; Y: N4 z" Z) Y6 v6 T$ V) r
            jedis.del("java framework");
            jedis.rpush("java framework","spring");  
            jedis.rpush("java framework","struts");  
            jedis.rpush("java framework","hibernate");
            System.out.println(jedis.lrange("java framework",0,-1));
        }  

    , ^% ]! O) Z9 B
        /**
         * jedis操作Set
         */  
        @Test  
        public void testSet(){  
            //添加  
            jedis.sadd("user","liuling");  
            jedis.sadd("user","xinxin");  
            jedis.sadd("user","ling");  
            jedis.sadd("user","zhangxinxin");
            jedis.sadd("user","who");  
            //移除noname  
            jedis.srem("user","who");  
            System.out.println(jedis.smembers("user"));//获取所有加入的value  
            System.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素  
            System.out.println(jedis.srandmember("user"));  
            System.out.println(jedis.scard("user"));//返回集合的元素个数  
        }  
    , k5 c, @/ _, j+ h5 R
        @Test  
        public void test() throws InterruptedException {  
            //jedis 排序  
            //注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)  
            jedis.del("a");//先清除数据,再加入数据进行测试  
            jedis.rpush("a", "1");  
            jedis.lpush("a","6");  
            jedis.lpush("a","3");  
            jedis.lpush("a","9");  
            System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6, 1]  
            System.out.println(jedis.sort("a")); //[1, 3, 6, 9]  //输入排序后结果  
            System.out.println(jedis.lrange("a",0,-1));  
        }  
    & o: V' _. t& A# |0 D' F
        @Test
        public void testRedisPool() {
            RedisUtil.getJedis().set("newname", "中文测试");
            System.out.println(RedisUtil.getJedis().get("newname"));
        }
    }
    四.1 配置要求
    1.Spring3.2.8以上。
    2.redis2.6及以上。
    3.Jdk1.6以上。
    4.包含Jedis,JRedis,SRP and Lettuce,四个文件。

    4 W3 A* u3 {$ L9 c6 Y" h* ~( T: |% K) Y
    . i5 S1 D$ \: d: ?- f
    ( v& c, b6 z% j) r3 u% P
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-9-27 14:42
  • 签到天数: 3 天

    [LV.2]登堂入室

    0

    主题

    16

    帖子

    66

    积分

    普通会员

    Rank: 2

    积分
    66
    发表于 2016-9-21 05:52:29 | 显示全部楼层
    啦啦啦啦啦啦啦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-20 16:20
  • 签到天数: 1 天

    [LV.1]初学乍练

    0

    主题

    27

    帖子

    63

    积分

    普通会员

    Rank: 2

    积分
    63
    发表于 2016-11-20 16:33:08 | 显示全部楼层
    Web前端开发工程师,主要职责是利用HTML、XHTML、CSS、JAVAScript、FLASH等各种Web前端技术进行客户端产品的开发。完成客户端程序(也就是浏览器端)的开发,开发JavaScript以及Flash模块,同时结合后台开发技术模拟整体效果,进行丰富互联网的Web前端开发,致力于通过技术改善用户体验。; K. ~1 d' w# W) e
    % i+ y7 X, T- S" H/ T
    第一阶段:页面制作基础$ B9 ]. ?& q$ n0 S3 g
    从这一基础阶段开始,正式学习Web前端开发需要的编程语言HTML,CSS和JavaScript。HTML和CSS用于Web静态内容的展示,JavaScript用于Web动态交互。完成这一阶段前端开发的学习,你就可以独立实现一个动静结合的Web前端项目啦!
    0 C" k2 O9 I( J/ k
    - T' _# e0 k1 W5 O4 N第二阶段:主流框架应用
    9 j) t0 \1 P( `+ }5 q: X9 k$ o& E优秀的Web前端开发工程师一定都是追求高效率的”懒人“。这一框架阶段就是教你如何使用当今流行的Web前端框架,包括bootstrap、Angularjs等,来提高前端开发效率。在学习前端框架本身的同时,也希望你能掌握任意一种快速上手的web前端框架的方法!?
    : U5 q9 E3 e! b$ ~* \" D& O ; J# Y2 O! p9 J" R8 a
    第三阶段:前端技术进阶
    , h# ^0 N+ n8 F0 x9 Q* ^1 X* pweb前端开发进阶阶段的学习,主要是让大家快速掌握当今流行、实用、最新的技术,比如:less、sass、json、ajax等,并将这些前端技术快速用于实践,开发出更加符合客户体验度的web前端页面。
    # R6 }* i6 |0 u, W
    ; n/ z2 G$ E' ^$ g2 K& M$ `2 T第四阶段:前端技术拓展
    2 L; ]7 r0 |( ]  @8 W, eweb前端技术发展日新月异,因此前端技术的拓展学习及实践对于web前端工程师来说非常重要。本阶段就是基于、Backbone、bootstrap等技术的拓展学习和web前端项目的实战开发演练。, o) V$ h8 B! p9 e7 z
    + K6 f! f2 O; b
    课程包含部分:
    0 q: u; V2 ~3 n0 G
    $ V" k% T3 B3 u2 P第一部分 html与css入门 共100课时 5 L# X3 J4 r$ f6 g* |+ l
    课时 名称
    , a/ e" S- ], a  U9 L1 html简介
    ! q$ `: \- w* N" V8 r% D! V2 html骨架
    # n4 _3 G9 N) k0 Y- X* J) |0 q3 元标签-编码
    7 c5 s0 S- z  s, F4 E: K4 元标签-关键字与描述7 [. D% Y% m7 ?1 @, q
    5 标签空白符
    * ~# T7 j4 V6 I9 p2 Y* d+ c1 `1 H6 X6 标题标签% c% [8 N6 U, y8 f. w
    7 段落标签
    9 Z8 S9 {# `7 ^$ m# {8 注释  O$ F; v) S  q3 @, f
    9 块元素与行内元素
    1 L( U6 ^% t. o10 超链接4 x2 K# @( M& S* Y0 n9 Q! z
    11 图片标签
    ' ]3 Q+ m4 q  f5 E5 p12 绝对路径与相对路径' _& w& k' ~  {. Y" H5 l, M
    13 无序列表2 v* a' ^3 c. k
    14 有序列表
    9 P9 m6 V' h- p$ k" L; _1 o15 列表嵌套
    ( e2 _0 k7 F1 O7 b0 U; y16 定义列表
    - ^0 s/ V+ }* k+ q17 表格
    6 q. z/ V# P2 f3 b: v! m$ B18 单元格拆分与合并
    9 I+ @1 _, `1 w1 v. k, i19 表格头尾
    6 V- E/ z8 Z; T# @) K8 l% ^) N20 表单元素
    % G( \: @9 t: E" b2 Y. K1 b21 下拉框与文本输入框" n  L% @" {& h0 w# i* P
    22 表单分组# V$ _/ _7 U  h, o
    23 常见字符实体
    % c! @/ }2 {4 L/ u' i) G24 文字标签
    : }5 B8 Q. A, t7 ^25 语义化标签
    3 f& z8 x5 ~9 x( m8 a4 V26 废弃标签6 ]7 K% }0 k% W+ y1 R
    27 css简介
    * o5 ~' }/ J8 ]+ _/ ]9 ?+ }- R4 \2 b28 css三种书写方式
    5 I# ?% d3 ?# ^6 U& z# W7 Y4 Q29 css常见选择器
    $ e% _( z: \5 v; O# N# I) m% V! c$ |30 id选择器与类选择器注意事项
    6 A( w4 ?8 A1 s+ u31 选择器组合
    / D4 G) d+ s; J: z  X. \32 后代选择器9 p# z9 a2 q' I0 y" t$ q
    33 交集选择器与并集选择器
    " g! K! R5 K# l/ `34 选择器通配符, o9 N; t6 h, _
    35 腾讯新闻列表
    6 n3 P( g$ x- L+ [7 ?36 选择器权重( r8 \: K% Y. c! i
    37 就近原则
    & U/ P, S! m! |# z" K1 C7 r38 样式引入方式权重比较
    2 d& V2 e- r( d, c39 权重计算练习
      Z$ F& L" l) x# z- j' }40 important提升权重+ h# H& `3 a6 c0 Z/ _! {5 p
    41 盒模型( {: E! B4 W& K( q$ l
    42 IE盒模型
    $ C/ l  D& k% l# ~5 {# X/ |43 内边距与外边距: D4 z5 c8 O: E, b5 }
    44 边框属性, S1 b1 R) \8 p) X6 L% V/ i7 l3 z& S
    45 盒子居中) M1 c  }6 [1 V9 i5 J; u
    46 外边距重计算盒子宽度
    ) `" Z* e' U. D. C* X  {" {) I6 ~, E47 文字属性1 R+ F! x1 N1 k6 z/ u
    48 css常见单位# U6 F7 ?7 }# r7 a
    49 文字修饰属性
    - a. @) }' P! z0 U( z50 文字属性继承性
    5 F, c! l6 W* B$ \, P% p51 文字水平居中与垂直居中5 ]( f6 q" j' |7 W0 b4 {& M& e4 z4 t
    52 图片元素排版
    ! L: k, e& _& N53 超链接标签默认样式# n" N0 ?# g9 ~1 S, m" t/ L  q
    54 腾讯体育
    % i, B" [6 F0 e$ m1 v2 x" p55 超链接标签伪类  w% C, y$ i( f+ T! c4 c+ q
    56 伪元素; ]+ T$ x9 s) A/ y5 a
    57 背景样式与图片. k5 Y2 X# \2 y
    58 背景平铺与背景位置
    : }8 v! Z: k4 `9 H9 a9 B7 W59 背景在SEO中的应用
    ( V- v0 F+ e2 v" Q3 `5 C9 S60 块元素设置背景" W% _3 ^% d& K: n" @2 B- \
    61 行内元素设置背景
    8 t1 H" [) Y/ }62 伪元素设置背景" _1 I% i1 Y& D* R2 R0 }5 N
    63 水平精灵图/ a9 r6 H! K3 g; U) F
    64 垂直精灵图
    % J/ l2 x( y5 `8 `1 W) |65 定点精灵图
    7 W" w$ @( Q. K# Q6 ^66 hao1236 f" X. r5 e- @
    67 四种箭头
    . Q) B. V7 c  j3 X& h$ M6 L  [68 hao123箭头
    5 _( G2 S" E! g/ S69 css绘制集合图形9 I  E# F6 |8 k
    70 块元素与行内元素特性; |9 y0 I9 b4 f* e8 n& I
    71 块元素与行内元素转化* q- {, r, W8 B, f
    72 浮动元素
    " I; \2 j4 T( b* U+ \* \5 ]- A$ l73 浮动元素与文档流
    # `* u: O; H# z) a74 浮动元素特性% G, l2 e. q3 \! T9 C: d
    75 浮动元素与边距
    . C( z3 A  [% \% A- ^76 浮动元素父元素高度丢失2 E4 M2 ?  r" j
    77 清除浮动# c# ?& l) }4 M
    78 清除浮动的7中方式; k2 Q' q' a, ]. X! u2 m  N
    79 新浪布局9 I. o8 V2 p" q( c# P5 {  \
    80 列表布局" q; o% w+ L+ a
    81 双飞翼布局! n1 E; `% L" P
    82 圣杯布局# S7 _6 R$ d' E. Q- t! M/ y
    83 排查错误6 X, E# t) c' k) C
    84 相对定位  M$ f, i5 X$ t2 [/ e
    85 表单对齐
    - z6 O1 l. r- `3 v/ u* W2 E86 新浪tab栏3 F# m5 |3 I0 _1 Y, n% B% v3 H
    87 绝对定位2 Z7 c* h5 C/ w7 D- \& ?
    88 子绝父相
    3 `7 O1 f0 H' P89 jd轮播图
    # T8 q* i9 A: L: X  I2 B( K6 ^, w1 q90 文本居中,行内元素居中与块元素居中
    4 g- T. L: i2 z$ r* Y91 优酷+ [8 _" R4 }# k
    92 固定定位
    6 v2 f/ W$ p6 \8 r93 遮盖  f3 l2 N2 Q! a" j& w; h& [
    94 拼爹; ]! {/ k( K, ?8 y+ X
    95 html 注释 hack3 a* B% u- g4 [4 E9 ~
    96 css属性hack
    # u0 @% }2 H1 y97 IE6-交集选择器与DTD内减盒模型
    " U9 B! \$ P& L# H98 IE6-最小高度与盒子位置
    " D6 R9 h8 n9 Z99 IE6-overflow与透明度% L, M) b6 d" ~% C1 u) m9 U
    100 IE6-双倍margin与3像素bug
    2 x0 [- E+ n& Z, ? 4 t% y7 p2 Y& C: F  e5 c/ L! |0 J

    . v/ {, K& g4 g/ D' h8 N4 }3 [
      Y  z0 |$ j5 t( U# c4 x4 [
    7 t- v5 P+ x- |% N" d第二部分 源生javascript 共150课时  & m  T  Z% G0 [
    - [& g2 Z5 G! E8 n0 }6 Y* G0 v
    第三部分 jquery与bootstrap 共60课时
    $ G/ Z( ^( ]1 c( R. O# r' b ' G  e/ O3 L" E
    第四部分 HTML5 CSS3与移动端开发 共50课时  ' s- q$ ~, \  Y* S
    1 S+ ]9 Z5 L0 ]5 m. N( K8 M
    第五部分 canvas游戏开发 共30课时 5 C6 u, M9 \2 [' S0 \) x/ Z/ E/ E

    / S% ^# }9 N5 {- w第六部分 微信与百度地图 共30课时 / ~& i) H$ q+ D

    2 ^* _% I* |" o0 C) P第七部分 nodejs 共80课时  
    * O# r- |5 _' |) R2 d / O& l) V4 H9 U. n0 R
    第八部分 设计模式 共80课时 ; X! X0 H9 T) ?# f7 W, G; O

      Z; X  `& y; Q; L( J第九部分 模块化开发 共20课时
    / v4 j( W7 k0 d( R6 h- w
    ( _7 V) F7 J' l* [" k6 Z& ^/ t第十部分 大数据可视化 共15课时
    1 s# G5 Z: M. n 7 \: t, z4 V- ~
    第十一部分 Backbone 共60课时
    8 Y, N2 R6 u$ ~1 q# K / x7 G6 m( W* L9 ~* x
    第十二部分 vue 共40课时
    0 b. r1 L* C3 n 1 q6 ]* S- i3 [! u) E' y" a
    第十三部分 angular 共70课时
    9 ]: _; q2 i& N" k6 r* Y& T/ P 0 w! i5 h( k1 S) g3 _$ @/ p2 `
    第十四部分 前端工程化 共30课时
    3 B0 Z7 M5 I+ D: q
      [" N  |. S9 p  c: z2 r课程更新网盘
    ) X, M  q* A9 X- H+ s1 S3 J8 |# G! ~. i2016年前端开发Angular.JS从入门到上手企业开发视频
    ' B) K8 W4 i  ?7 b- h/ K ( a. _# {9 q  h" ^& J$ ^
    链接: https://pan.baidu.com/s/1dF2vBzV 密码: 3hbk* X, V! b/ a0 ]9 d6 \6 ^% `( l

    9 e3 j6 C7 f, N, I+ ~+ B2016年最新前端技术react视频入门
    " J& Z- D9 p) t链接: http://pan.baidu.com/s/1i46by8t 密码: 48tt. v1 ]4 B+ T6 r5 x* C) f5 A

    ' L+ _' H+ A: U5 n0 [2016年CSS实体班同步教程
    & [6 J/ y: ^7 ~0 ~, h4 U3 ^链接: https://pan.baidu.com/s/1qXWRbCK 密码: a725, A4 X) Z. X3 }& z/ Z1 e1 y

    & x4 A& U1 e3 ?1 E2016年JS视频教程实体班同步教程
    + \9 m( u8 a1 W$ k4 p( [: D- T2 _链接: https://pan.baidu.com/s/1jHIkxLG 密码: hpyb
    $ g/ X% J* M  s& |   J+ ~. ~6 `/ L. Z
    % [# w3 l' P% U5 k( S
    不定时更新web前端学习免费教程领取请加QQ  2079576908
    9 q1 O1 }6 i( L3 I
    $ z" R1 `, U2 O- j) `, M% K 5 K- h- _) s& Y) i' Y
    目前爱创课程web前端培训的学员就业薪资一般在10K-17K: V. r7 _% S4 m0 a. O

    1 s$ `- t* q* p/ A6 f1 `! E官方网站:http://www.icketang.com/* u, o, C7 p% _: ~4 l+ F) g
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2024-4-19 16:28 , Processed in 0.111395 second(s), 31 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表