search
HomeDatabaseRedisWhat are the methods for Linux command operation and redis installation?

电脑操作系统 : windows7,8,10,xp,win98
      操作系统 : linux ax unix
    以后开发项目是部署在服务器上,服务器一般采用linux.
    linux的优点:系统稳定,操作速度快,系统安全..
    linux可以部署 : 数据库 tomcat 缓存(redis).....
  1.如果安装虚拟机,必须把金山毒霸,360防护退出(禁用vmware程序)
  
  指令:
    通用语法:
      命令后面不接 ./  或者  ../  表示是当前目录.
      ./ 表示当前目录
      ../表示上一层目录
      /表示根目录 
      
      clear清屏
      
  磁盘管理:
    ls list 显示目录下的数据:
      -l : 详细列别
      -r : 反序
      -t : 日期
      需要记住的是 ll
      ll -a
      -a : 表示所有文件都显示.
    cd change 切换目录:
      路径满足通用语法.
      ~ 表示 : 当前用户的目录,cd~回到用户目录 cd 跟 cd~一样.
      cd - : 回调刚才所在目录.
    pwd : 显示当前所在目录.
    mkdir -p : 批量创建文件夹
  文件浏览:
    cat : 显示所有的内容,如果内容过多,没办法看完.
      cat 文件名.
    more : 查询文件的内容.
      more 文件
      空格 下一页
      b 上一页
      回车 一行
      q 退出
    less 查看文件内容
      less 文件
      空格 下一页
      b 上一页
      回车 一行
      q 退出
       
       进入以后可以进行 在翻页的时候 进行(/字符串 向下搜索,?字符串 向上搜索) ?字符串 向上搜索   /字符串 向下搜索
      参数:
        -m 百分比
        -N 行号
          
    tail 查看文件末尾内容:
      tail-数字 文件名 查看最后指定的条数.
      参数 -f循环读取.
      (重要 可以动态查看文件末尾的内容,开发中往日志里写数据)
      
      此处模拟过程
      往一个文件动态循环写数据,使用tail指令动态查看数据.
      ping 用来测试连通性.
      ping 127.0.0.1>ip.log 将ping的命令打印内容输出到文件中去
      例如: 127.0.0.1>ip.log & : 表示后台运行
      tail -f ip.log  : 循环读取文件ip.log里面的内容,并显示在控制台上
    
  文件操作:
    cp 复制 复制并重命名 copy
      cp 文件 路径 表示复制
      cp 文件 路径/新文件名称   表示复制并重命名
      -r : 表示递归
    mv  move
      mv 文件 路径 表示 移动.
      mv 文件 路径/新文件名称   表示移动并重命名.
      -f表示强制
    rm remove 删除
      rm-fr 文件名 可以删除一切
    find 查找
      find 路径 -name 文件名称
      find 路径 -name '*...'
  文档编辑:
    vi vim 命令一摸一样
      vi 相当于txt
      vim 相当于 note++
  vim : 有三种模式
    一般模式 : 能看不能输入内容,进入文件默认是一般默认,按i或者a或者o切换,到编辑默认 按:切换到行底模式.
    编辑模式 : 可以输入内容 如果编写完了,按esc表示退回到一般模式.
    行底模式 : 可以输入 registry-zookeeper:wq  退出保存  :q! 退出不保存.
    退出,先按esc ,再按 Shift+:   ,q! 或者wq
  一般模式有特点:
    yy复制  p 粘贴  dd 删除一行.
    nyy 复制多行 ndd删除多行.
    gg 第一行 shift + g 最多一行.
  管道 | 
    作用 : 将两个命令合成一个命令  命令1|命令2
  
  grep 正则匹配 过滤
    语法 1: grep-i 过滤的字符 文件名称
    语法 2: 命令1|grep-i 过滤的字符  需要匹配不同内容  输出不同的值
    前面命令1的内容 作为了后面过滤的依据.
  
  
  
  系统命令:
    ps-ef 查看所有的进程
    以后的用法:
      ps-ef|grep-i 过滤的字符
    kill 杀死
    kill pid 终止进程
    kill-9 pid 杀死进程
    
    ifconfig 查看当前ip
    ping 测试连通性
    
  备份压缩:
    参数不可以改变顺序:
    tar -zcvf 文档名 文件    压缩
    tar -zxvf 文档名     解压缩
  
  关机重启(忽略)
    重启 reboot
    关机 halt
    
    shutdown -r 时间 重启
    shutdonw -h 时间 关机
  
  文件权限
    chmod 接上数字 文件
    chmod 000 删除所有权限
    comod 777 添加所有权限
    一个7 表示三个权限
    4 2 1
    r 可读    2的2次方  4
    w 可写    2的1次方  2
    x 可执行    2的0次方  1
  
    例如:
      drwxr-xr-x. 2 root root 4096 8月 11 04:23 a : 第一个字母代表是文件夹或者文件, d代表文件夹,-代表文件
      -rw-r--r--.  : rw- 表示用户 ; r-- 表示用户名组 ; r-- 表示其他
      官方文档解释 : -rwxrw-r--
        第一位 : 文件类型(d目录,-普通文件 ,| 链接文件(桌面快捷方式));
        第2-4位: 所属用户权限,用u(user)表示;
        第5-7位: 所属组权限,用g(group)表示;
        第8-10位: 其他用户权限,用o(other)表示;
        第2-10位: 表示所有的权限,用a(all)表示;
        r 可读权限
        w 可写权限
        x 可执行权限
    
    修改权限:- 表示去除权限
      chmod u-rwx aaa.tar;表示把用户权限变成---
      chmod g-rwx aaa.tar;表示把用户组权限变成---
      chmod o-rwx aaa.tar;表示把其他用户权限变成---
      
      chmod ugo+rwx aaa.tar : 表示给这个文件加上应有权限
      chmod 000 aaa.tar ; 表示去除文件所有权限
      chmod 777 aaa.tar; 表示给文件加上应有权限
    
  安装过程注意事项 : 使用CRT连接不上linux,存在以下几种情况:
    vim/etc/sysconfig/netword-scripts/ifcfg-eth0
      1 . 配置网络,自动连接勾选.
      2 . 360或金山毒霸没关.
      3 . 本地虚拟机服务器没开启.
      4 . 本地适配没有打开.
      5 . Linux配置环境 网卡没有开机自动启动.
  
  ONBOOT = yes  : 开机自动启动网卡
Linux环境可以按照服务器,应用服务器,tomcat ,需要jdk,mysql,缓存redis
  统一步骤:
    1.需要上传压缩包.
    2.解压.
    3.安装.
  
  rpm -qa 查看.
  rpm -ivh 程序名称 安装.
  rpm -Uvh 程序名称 更新.
  rpm -e 删除  --nodeps 不删除依赖.
  
  例子:
    查看系统中是否安装有jdk : rpm -qa | grep -i jdk
    如果有就删除jdk,删除了以后再安装
    rpm -e 上面查到的jdk全称
  
  yum remove 联网自动删除数据
  yum install 联网自动安装数据
  cm95DvStxaqflMVE : 自动生成的秘密 每个人都不一样
  
  gPKufF50DIn720ua 我的MySql秘密
  
  NoSql : 
  
    NoSql 特点:
      在大数据存取上具备关系型数据库无法比拟的性能优势:
        1.易扩展:
          NoSql 数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性.数据之间
          无关系,这样就非常容易扩展.也无形之间,在架构的层面上带来了可扩展的能力.
        2.大数据量,高性能
          NoSql 数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀.这得益于它的
          无关系性,数据库的结果简单.
        3.灵活的数据模型
          NoSql 无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式.而在关系数
          据库里,增删字段是一件非常麻烦的事情.如果是非常大数据量的表,增加字段简直就是
          一个噩梦.这点在大数据量的Web2.0时代尤其明显.
        4.高可用
          NoSql 在不太影响性能的情况,就可以方便的实现高可用的架构.比如Cassandra,HBase
          模型,通过复制模型也能实现高可用.
          
  
  
    MySql 关系型数据库 : 泛指数据库中数据表,具有一定关系.
    Redis 非关系性数据库 : 数据库中数据是没有关系(用作缓存,缓存服务器)
    db4o 文件数据库 : 数据是保存在文件中.
    
    短链接 : 打开一次连接 关闭.
    长链接 : 连接池 打卡一次不关闭.
    
    Redis : 用来存储数据 将数据存到内存中 用于处理大数据.
      Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提高多种键值数据类型来适应不同
      场景下的存储需求,目前为止Redis支持的键值数据类型如下:
        1.字符串类型  2.散列类型  3.列表类型  4.集合类型  5.有序集合类型
    hibernate : 一级缓存 内置缓存.
    hibernate : 二级缓存(需要其他配置) 使用redis替换.
    
    redis 安装
      需要C的编译环境.
    
    Redis的后台启动方式:
      1.如果需要后台启动 需要从redis配置目录中 copy一个文件 redis.conf
      cp redis.conf /usr/local/src/redis
      
      2.修改配置文件
        daemonize yes(修改成yes)
        以后开发中命名有规范的,项目名称_业务名称_表名称_字段名称_0  1
        Constant 常量池 一个项目需要有自己的常量池.
        public static final 项目名称_业务名称_表名称_字段名称_=""
    
    数据结构:
    
      redis 是一种高级的key-value的存储系统,其中value支持五中数据类型.
        1.字符串(String)  2.哈希(hash)  3.字符串列表(list)
        4.字符串集合(set)  5.有序字符串集合(sorted set)
        而关于key的定义呢,需要大家注意的几点:
        1:key不要太长,最好不要超过1024个字节,这不仅会消耗内存还会降低查找效率
        2.key不要太短,如果太短会降低key的可读性.
        3.在项目中,key最好有一个统一的命名规范.
    
      String
        赋值 set key value
        
        取值 get key
           getset key value 获得并赋值
        
        删除 del key
        
        其他
          递增 incr key
          
          递减 decr key
          
          增加多少 incrby key 数字
          
          减少多少 decrby key 数字
          
          追加 append key 拼接的字符
          
      Hash
        赋值:
          hset 集合名称 字段的名称 字段的值 只能赋值一个
          hmset 集合名称 字段的名称 字段的值 字段的名称 赋值多个
        取值
          hget 集合的名称 字段名称 获得一个字段值
          hmget 集合的名称 字段名称 [字段名称 字段名称]... 获得指定多个字段值
          hgetall 集合名称 获得所有的字段值
        删除
          del 集合名称 删除集合 通用语法(其他集合一样可以使用)
          hdel 集合名称 字段名称[....]
      
        其他
          增加指定数字
            hincrby 集合名称 字段名称 增加的数字
          判断集合中是否含有某个字段
            hexists 集合 字段
          长度
            hlen 集合
          获得所有的key
            hkeys 集合
          获得所有的value
            hvals 集合
          显示集合中的key和value
            hgetall 集合
            
  类加载器的作用 : 将类加载到内存中形成class对象 , 保证虚拟机中就只有一个对象.
  三个类加载器 : 应用加载器(主要加载tomcat的jar包和自己放的一些jar包,加载自己创建的类的class文件) , 扩展加载器(加载一些特殊的jar包,如果公司需要放jar包也放在这里面) , 引导类加载器(主要是把环境加载进来).
  应用类加载器继承扩展类加载器继承引导类加载器.
  加载机制 : 全盘负责机制 , 父类委托机制
  System.out.println(ClassLoaderDemo.class.getClassLoader());
  System.out.println(ClassLoaderDemo.class.getClassLoader().getParent());
  System.out.println(ClassLoaderDemo.class.getClassLoader().getParent().getParent());
  
  rt.jar 表示运行时 , 加载不同位置的东西.
  String parths = System.getProperty("sun.boot.class.path");
  String[] arr = parths.split(";");
  for(String string : arr) {
    System.out.println(string);
  }
  System.out.println(String.class.getClassLoader());
  
  public class ClassLoaderDemo {
  /*public static void main(String[] args) {
    //类加载器的作用: 将类加载到内存中形成class对象 保证虚拟机中就只有一个对象
    //三个类加载器 : 应用类加载器  扩展类加载器  引导类加载器(不是类 C 调用批处理 加载我们数据Class对象)
    //加载机制:全盘负责 委托机制 
    //System.out.println(ClassLoaderDemo.class.getClassLoader());
    //System.out.println(ClassLoaderDemo.class.getClassLoader().getParent());
    //System.out.println(ClassLoaderDemo.class.getClassLoader().getParent().getParent());
    //System.out.println(DNSNameService.class.getClassLoader());
    
    //rt.jar 表示运行时  加载不同位置的东西
    String parths = System.getProperty("sun.boot.class.path");
    String [] arr = parths.split(";");
    
    for (String string : arr) {
      System.out.println(string);
    }
    System.out.println(String.class.getClassLoader());
    
  }*/
  /*public static void main(String[] args) {
    //类加载器的作用: 将类加载到内存中形成class对象 保证虚拟机中就只有一个对象
    //三个类加载器 : 应用类加载器  扩展类加载器  引导类加载器(不是类 C 调用批处理 加载我们数据Class对象)
    //加载机制:全盘负责 委托机制 
    //System.out.println(ClassLoaderDemo.class.getClassLoader());
    //System.out.println(ClassLoaderDemo.class.getClassLoader().getParent());
    //System.out.println(ClassLoaderDemo.class.getClassLoader().getParent().getParent());
    //System.out.println(DNSNameService.class.getClassLoader());
    
    //rt.jar 表示运行时  加载不同位置的东西
    String parths = System.getProperty("java.ext.dirs");
    String [] arr = parths.split(";");
    
    for (String string : arr) {
      System.out.println(string);
    }
    //扩展类加载器 一般公司使用
    System.out.println(DNSNameService.class.getClassLoader());
    
  }*/
  
  
  public static void main(String[] args) {
    //类加载器的作用: 将类加载到内存中形成class对象 保证虚拟机中就只有一个对象
    //三个类加载器 : 应用类加载器  扩展类加载器  引导类加载器(不是类 C 调用批处理 加载我们数据Class对象)
    //加载机制:全盘负责 委托机制 
    //System.out.println(ClassLoaderDemo.class.getClassLoader());
    //System.out.println(ClassLoaderDemo.class.getClassLoader().getParent());
    //System.out.println(ClassLoaderDemo.class.getClassLoader().getParent().getParent());
    //System.out.println(DNSNameService.class.getClassLoader());
    
    //rt.jar 表示运行时  加载不同位置的东西
    String parths = System.getProperty("java.class.path");
    String [] arr = parths.split(";");
    
    for (String string : arr) {
      System.out.println(string);
    }
    //应用加载器  负责加载tomcat的路径jar 还有下面两个
    //E:\Users\hzb\workspace\ee66_day48\build\classes
    //E:\Users\hzb\workspace\ee66_day48\WebContent\WEB-INF\lib\jedis-2.7.0.jar
    System.out.println(ClassLoaderDemo.class.getClassLoader());
    
  }
}
List
    赋值:lpush key value1[value2......] 从链表的左边添加  如果key不存在就创建
       rpush key value1[value2......] 从链表的右边添加  如果key不存在就创建
    取值
      lrange key start end  查询数据 start表示开始索引 end表示结束索引 默认情况.
      end 可以为负数 负数表示 从右边开始数
    删除
      lpop key 从左边弹出
      rpop key 从右边弹出
    其他
      llen key 集合长度大小
      lpushx key value1  添加链表的左边 如果key不存在 不会进行创建
      rpushx key value1  添加链表的右边 如果key不存在 不会进行创建
      lrem key count value  删除集合中多少个元素
        count > 0 从左往右删除count个
        count = 0 删除所有指定的value值
        count 0 还有多少秒之后失效
        
  Jedis
    Jedis java 中访问redis 环境 操作命令对象 如果需要在java环境中使用redis 必须导入jar包
      commons-pool-2.3.jar
      jedis-2.7.0.jar
      
    jedis 操作:
      public static void main(String[] args) {
        //创建redis对象 java表示的是jedis对象
        
        Jedis jedis = new Jedis("192.168.40.199",6379);
        String nickname = jedis.get("nickname");
        System.out.println(nickname);
        //重写设置
        jedis.set("nickname","吉吉");//以后设置都是json字符串
        nickname = jedis.get("nickname");
        System.out.println(nickname);
        jedis.close();
        
      }
    
    Jedis 连接池:
      public static void main(String[] args) {
        //需要增加配置
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        
        //设置其他配置
        //最小空闲数 (例如在访问数据库高分期的时候,会创建很多连接给予使用,当连接池连接数量用完了以后,会继续产生连接,保证连接池有三个空闲连接,以备不时只需)
        poolConfig.setMinIdle(3);
        //最大空闲数 (例如在访问数据库低分期的时候,连接池会有很多闲置的连接,这时会保证闲置连接不能超过30个,如果超过去30个,超过的会销毁)
        poolConfig.setMaxIdle(30);
        //获得连接池
        JedisPool jedisPool = new JedisPool(poolConfig,"192.168.40.199",6379);
        //通过连接池 可以获得jedis对象
        Jedis jedis = jedisPool.getResource();
        
        String nickname = jedis.get("nickname");
        System.out.println(nickname);
        jedis.close();
        
      }
      
  1.8Redis特性
    1.8.1多数据库概念
    默认情况下 我们操作时操作第一个

    Select 索引 选择数据库
    Move key 索引 将key 移动到对应的数据库下

    退出 quit exit ctrl + c
    Dbsize key的数量
    Info 信息

    Flushdb 删除当前数据库的所有key
    Flushall 删除所有数据库的key


    1.8.2消息订阅和发布
    Subscribe  频道名称   表示 订阅某个频道
    Psubscribe  频道名称 表示订阅多个频道
    Publish 频道名称 内容  往频道内发布内容



  1.8.3事务(批量处理)
    Multi 开启事务
    Exec 提交
    Discard 回滚事务

    提交事务时 如果中间报错  不会回滚 继续操作
    1.9持久化
    Redis的数据是在内存中 持久化就是将数据保存在磁盘上(序列化 钝化)
    Redis中提供了两种持久化机制 : 将数据持久化起来

      为什么要有数据库? 数据库能保存数据
      RDB : 快照 redis默认机制 我们不处理
        优点:恢复速度快
        缺点:存在数据库丢失情况
      AOF : 记录日志  将命令行保存起来
        优点:不存在数据丢失
        缺点:恢复速度太慢
      如果想要使用AOF 需要手动配置
      检查AOF机制是否存在
    1.配置AOF
    2.打开客户端 进行操作数据
    3.清空数据库
    4.将redis 服务器线程关闭(看日志文件  修改日志文件)
    5.启动redis 看数据是否能恢复
        
    如果需要修改修改端口号进行对外开放进入:vim /etc/sysconfig/iptables
    重新启动服务器 : service iptables restart

        进入redis安装目录下
        cd /usr/local/redis
        /usr/local/src/redis install
        进入bin目录下的批处理进行登录
        ./bin/redis-cli
        ./redis-server ../redis.conf
    
  9.进入redis目录
      cd /root/baidu/redis/redis-3.0.0
      10.将redis下的conf文件拷贝到redis下
      cp redis.conf /usr/local/redis

      11.进入redis的bin目录下
      cd /usr/local/src/redis/bin
      12.启动
      ./redis-server ../redis.conf 



      后端启动
      vim /usr/local/redis/redis.conf
      1.找到一下代码 修改成yes
      daemonize no  ==>>daemonize yes

      2.启动时,指定配置文件
      cd /usr/local/redis/
      ./bin/redis-server ./redis.conf

The above is the detailed content of What are the methods for Linux command operation and redis installation?. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:亿速云. If there is any infringement, please contact admin@php.cn delete
什么是linux设备节点什么是linux设备节点Apr 18, 2022 pm 08:10 PM

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

Linux中open和fopen的区别有哪些Linux中open和fopen的区别有哪些Apr 29, 2022 pm 06:57 PM

区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

linux中什么叫端口映射linux中什么叫端口映射May 09, 2022 pm 01:49 PM

端口映射又称端口转发,是指将外部主机的IP地址的端口映射到Intranet中的一台计算机,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上;可以通过使用动态或固定的公共网络IP路由ADSL宽带路由器来实现。

linux中eof是什么linux中eof是什么May 07, 2022 pm 04:26 PM

在linux中,eof是自定义终止符,是“END Of File”的缩写;因为是自定义的终止符,所以eof就不是固定的,可以随意的设置别名,linux中按“ctrl+d”就代表eof,eof一般会配合cat命令用于多行文本输出,指文件末尾。

linux怎么判断pcre是否安装linux怎么判断pcre是否安装May 09, 2022 pm 04:14 PM

在linux中,可以利用“rpm -qa pcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。

什么是linux交叉编译什么是linux交叉编译Apr 29, 2022 pm 06:47 PM

在linux中,交叉编译是指在一个平台上生成另一个平台上的可执行代码,即编译源代码的平台和执行源代码编译后程序的平台是两个不同的平台。使用交叉编译的原因:1、目标系统没有能力在其上进行本地编译;2、有能力进行源代码编译的平台与目标平台不同。

linux中rpc是什么意思linux中rpc是什么意思May 07, 2022 pm 04:48 PM

在linux中,rpc是远程过程调用的意思,是Reomote Procedure Call的缩写,特指一种隐藏了过程调用时实际通信细节的IPC方法;linux中通过RPC可以充分利用非共享内存的多处理器环境,提高系统资源的利用率。

linux怎么查询mac地址linux怎么查询mac地址Apr 24, 2022 pm 08:01 PM

linux查询mac地址的方法:1、打开系统,在桌面中点击鼠标右键,选择“打开终端”;2、在终端中,执行“ifconfig”命令,查看输出结果,在输出信息第四行中紧跟“ether”单词后的字符串就是mac地址。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),