硬件环境

本文适用的硬件环境如下

  1. Linux版本:CentOS release 6.7 (Final)
  2. Redis版本:3.2.

Redis已经成功安装,安装路径为/home/idata/yangfan/local/redis-3.2.1。

我们要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群。

1、启动Redis多个实例

我们在Redis安装目录下创建目录cluster,并编写7000.conf~7005.conf 6个配置文件,这6个配置文件用来启动6个实例,后面将使用这6个实例组成集群。

以7000.conf为例,配置文件需要填写如下几项。

  1. port 7000 //端口7000,7002,7003
  2. bind 10.93.84.53 //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
  3. daemonize yes //redis后台运行
  4. pidfile ./redis_7000.pid //pidfile文件对应7000,7001,7002
  5. cluster-enabled yes //开启集群 把注释#去掉
  6. cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
  7. cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
  8. appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 

分别启动6个实例

  1. ./bin/redis-server cluster/conf/7000.conf
  2. ./bin/redis-server cluster/conf/7001.conf
  3. ./bin/redis-server cluster/conf/7002.conf
  4. ./bin/redis-server cluster/conf/7003.conf
  5. ./bin/redis-server cluster/conf/7004.conf
  6. ./bin/redis-server cluster/conf/7005.conf

启动成功后,看一下进程

  1. # ps -ef | grep redis | grep cluster
  2. idata 15711 22329 0 18:40 pts/10 00:00:00 ./bin/redis-server 10.93.84.53:7000 [cluster]
  3. idata 15740 22329 0 18:40 pts/10 00:00:00 ./bin/redis-server 10.93.84.53:7001 [cluster]
  4. idata 15810 22329 0 18:40 pts/10 00:00:00 ./bin/redis-server 10.93.84.53:7002 [cluster]
  5. idata 17023 22329 0 18:42 pts/10 00:00:00 ./bin/redis-server 10.93.84.53:7003 [cluster]
  6. idata 17030 22329 0 18:42 pts/10 00:00:00 ./bin/redis-server 10.93.84.53:7004 [cluster]
  7. idata 17035 22329 0 18:42 pts/10 00:00:00 ./bin/redis-server 10.93.84.53:7005 [cluster]

至此,ip=10.93.84.53机器上创建了6个实例,端口号为port=7000~7005。

Redis 3.0以上的集群方式是通过Redis安装目录下的bin/redis-trib.rb脚本搭建。

这个脚本是用Ruby编写的,尝试运行,如果打印如下,你可以跳过本文的第二部分。

  1. idata@qa-f1502-xg01.xg01:~/yangfan/local/redis-3.2./bin$ ruby redis-trib.rb
  2. Usage: redis-trib <command> <options> <arguments ...>
  3.  
  4. create host1:port1 ... hostN:portN
  5. --replicas <arg>
  6. check host:port
  7. info host:port
  8. fix host:port
  9. --timeout <arg>
  10. reshard host:port
  11. --from <arg>
  12. --to <arg>
  13. --slots <arg>
  14. --yes
  15. --timeout <arg>
  16. --pipeline <arg>
  17. rebalance host:port
  18. --weight <arg>
  19. --auto-weights
  20. --use-empty-masters
  21. --timeout <arg>
  22. --simulate
  23. --pipeline <arg>
  24. --threshold <arg>
  25. add-node new_host:new_port existing_host:existing_port
  26. --slave
  27. --master-id <arg>
  28. del-node host:port node_id
  29. set-timeout host:port milliseconds
  30. call host:port command arg arg .. arg
  31. import host:port
  32. --from <arg>
  33. --copy
  34. --replace
  35. help (show this help)
  36.  
  37. For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

如果执行失败,那么不幸的是你的机器没有Ruby运行的环境,那么你需要安装Ruby。进入第二部分。

2、安装ruby

下面的过程都是在root权限下完成的。

1)yum安装ruby和依赖的包。

  1. # yum -y install ruby ruby-devel rubygems rpm-build

一般来说,这一步是能正常完成的。

2)使用gem这个命令来安装redis接口

gem是ruby的一个工具包

  1. # gem install redis

安装过程出错

郁闷,看样子要升级ruby版本。

3)升级Ruby的版本

安装rvm,我不知道这是个什么东西,但是感觉像是Ruby的一个包管理器。

  1. # curl -L get.rvm.io | bash -s stable

WTF,又出问题了

气急败坏的照着他说的做

  1. # gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
  2. gpg: keyring `/root/.gnupg/secring.gpg' created
  3. gpg: requesting key D39DC0E3 from hkp server keys.gnupg.net
  4. gpg: /root/.gnupg/trustdb.gpg: trustdb created
  5. gpg: key D39DC0E3: public key "Michal Papis (RVM signing) <mpapis@gmail.com>" imported
  6. gpg: no ultimately trusted keys found
  7. gpg: Total number processed:
  8. gpg: imported: (RSA: )

然后重新下载rvm安装,成功了。

  1. # curl -L get.rvm.io | bash -s stable
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. :: :: --:--:-- 129k
  5. Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz
  6. Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc
  7. gpg: Signature made Mon Sep :: AM CST using RSA key ID BF04FF17
  8. gpg: Good signature from "Michal Papis (RVM signing) <mpapis@gmail.com>"
  9. gpg: aka "Michal Papis <michal.papis@toptal.com>"
  10. gpg: aka "[jpeg image of size 5015]"
  11. gpg: WARNING: This key is not certified with a trusted signature!
  12. gpg: There is no indication that the signature belongs to the owner.
  13. Primary key fingerprint: 409B 6B17 96C2 2A17 BB82 D39D C0E3
  14. Subkey fingerprint: 62C9 E5F4 DA30 0D94 AC36 166B E206 C29F BF04 FF17
  15. GPG verified '/usr/local/rvm/archives/rvm-1.29.3.tgz'
  16. Creating group 'rvm'
  17.  
  18. Installing RVM to /usr/local/rvm/
  19. Installation of RVM in /usr/local/rvm/ is almost complete:
  20.  
  21. * First you need to add all users that will be using rvm to 'rvm' group,
  22. and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.
  23.  
  24. * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
  25. in all your open shell windows, in rare cases you need to reopen all shell windows.

接着,source环境,让rvm可用。

  1. # source /usr/local/rvm/scripts/rvm

查看Ruby可用版本

  1. # rvm list known
  2. # MRI Rubies
  3. [ruby-]1.8.[-p420]
  4. [ruby-]1.8.[-head] # security released on head
  5. [ruby-]1.9.[-p431]
  6. [ruby-]1.9.[-p330]
  7. [ruby-]1.9.[-p551]
  8. [ruby-]2.0.[-p648]
  9. [ruby-]2.1[.]
  10. [ruby-]2.2[.]
  11. [ruby-]2.3[.]
  12. [ruby-]2.4[.]

可以看到最新的版本是2.4.1,那么我们装最新的吧。

  1. # rvm install 2.4.
  2. Searching for binary rubies, this might take some time.
  3. No binary rubies available for: centos//x86_64/ruby-2.4..
  4. Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
  5. Checking requirements for centos.
  6. Installing requirements for centos.
  7. Installing required packages: libffi-devel, libyaml-devel......
  8. Requirements installation successful.
  9. Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.4., this may take a while depending on your cpu(s)...
  10. ruby-2.4. - #downloading ruby-2.4., this may take a while depending on your connection...
  11.  
  12. curl: () SSL connect error
  13. There was an error().
  14. Checking fallback: https://ftp.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
  15. % Total % Received % Xferd Average Speed Time Time Time Current
  16. Dload Upload Total Spent Left Speed
  17. 11.9M 11.9M 1753k :: :: --:--:-- 2919k
  18. ruby-2.4. - #extracting ruby-2.4. to /usr/local/rvm/src/ruby-2.4.....
  19. ruby-2.4. - #applying patch /usr/local/rvm/patches/ruby/2.4./random_c_using_NR_prefix.patch.
  20. ruby-2.4. - #configuring..................................................................
  21. ruby-2.4. - #post-configuration..
  22. ruby-2.4. - #compiling..............................................................................................
  23. ruby-2.4. - #installing.........................
  24. ruby-2.4. - #making binaries executable..
  25. ruby-2.4. - #downloading rubygems-2.6.
  26. % Total % Received % Xferd Average Speed Time Time Time Current
  27. Dload Upload Total Spent Left Speed
  28. 751k 751k 443k :: :: --:--:-- 628k
  29. No checksum for downloaded archive, recording checksum in user configuration.
  30. ruby-2.4. - #extracting rubygems-2.6.....
  31. ruby-2.4. - #removing old rubygems.........
  32. ruby-2.4. - #installing rubygems-2.6............................
  33. ruby-2.4. - #gemset created /usr/local/rvm/gems/ruby-2.4.@global
  34. ruby-2.4. - #importing gemset /usr/local/rvm/gemsets/global.gems...............................................
  35. ruby-2.4. - #generating global wrappers........
  36. ruby-2.4. - #gemset created /usr/local/rvm/gems/ruby-2.4.
  37. ruby-2.4. - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list
  38. ruby-2.4. - #generating default wrappers........
  39. ruby-2.4. - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
  40. Install of ruby-2.4. - #complete
  41. Ruby was built without documentation, to build it run: rvm docs generate-ri

至此,我们升级了Ruby的版本。

4)安装gem redis接口,成功!

  1. gem install redis
  2. Fetching: redis-4.0..gem (%)
  3. Successfully installed redis-4.0.
  4. Parsing documentation for redis-4.0.
  5. Installing ri documentation for redis-4.0.
  6. Done installing documentation for redis after seconds
  7. gem installed

5)安装rubygems,成功!

  1. # yum install -y rubygems
  2. Loaded plugins: fastestmirror, security
  3. Setting up Install Process
  4. Loading mirror speeds from cached hostfile
  5. base | 3.7 kB :
  6. didi_jenkins_enable | 1.5 kB :
  7. didi_op_toa_enable | 1.5 kB :
  8. didi_txjenkins_enable | 1.5 kB :
  9. didi_update | 1.5 kB :
  10. epel | 4.3 kB :
  11. extras | 3.4 kB :
  12. tmprepo | 1.5 kB :
  13. updates | 3.4 kB :
  14. Package rubygems-1.3.-.el6.noarch already installed and latest version
  15. Nothing to do

至此,我们的Ruby和运行redis-trib.rb需要的环境安装完成了。

3、Redis集群搭建

有了Ruby执行环境,可以开始将之前的6个实例组建成集群了。

命令方式:

  1. ruby ./bin/redis-trib.rb create --replicas 10.93.84.53: 10.93.84.53: 10.93.84.53: 10.93.84.53: 10.93.84.53: 10.93.84.53:
  1. --replicas 1表示为集群的master节点创建1个副本。那么6个实例里,有三个master,有三个是slave
  2.  
  3. 后面跟上6个实例就好了,形式就是ip:port

执行情况:

  1. # ruby ./bin/redis-trib.rb create --replicas 10.93.84.53: 10.93.84.53: 10.93.84.53: 10.93.84.53: 10.93.84.53: 10.93.84.53:
  2. >>> Creating cluster
  3. >>> Performing hash slots allocation on nodes...
  4. Using masters:
  5. 10.93.84.53:
  6. 10.93.84.53:
  7. 10.93.84.53:
  8. Adding replica 10.93.84.53: to 10.93.84.53:
  9. Adding replica 10.93.84.53: to 10.93.84.53:
  10. Adding replica 10.93.84.53: to 10.93.84.53:
  11. M: 6346ae8c7af7949658619fcf4021cc7aca454819 10.93.84.53:
  12. slots:- ( slots) master
  13. M: 5ac973bceab0d486c497345fe884ff54d1bb225a 10.93.84.53:
  14. slots:- ( slots) master
  15. M: cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 10.93.84.53:
  16. slots:- ( slots) master
  17. S: 92f62ec93a0550d962f81213ca7e9b3c9c996afd 10.93.84.53:
  18. replicates 6346ae8c7af7949658619fcf4021cc7aca454819
  19. S: 942c9f97dc68198c39f425d13df0d8e3c40c5a58 10.93.84.53:
  20. replicates 5ac973bceab0d486c497345fe884ff54d1bb225a
  21. S: a92a81532b63652bbd862be6f19a9bd8832e5e05 10.93.84.53:
  22. replicates cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932
  23. Can I set the above configuration? (type 'yes' to accept): yes
  24. >>> Nodes configuration updated
  25. >>> Assign a different config epoch to each node
  26. >>> Sending CLUSTER MEET messages to join the cluster
  27. Waiting for the cluster to join...
  28. >>> Performing Cluster Check (using node 10.93.84.53:)
  29. M: 6346ae8c7af7949658619fcf4021cc7aca454819 10.93.84.53:
  30. slots:- ( slots) master
  31. additional replica(s)
  32. S: a92a81532b63652bbd862be6f19a9bd8832e5e05 10.93.84.53:
  33. slots: ( slots) slave
  34. replicates cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932
  35. M: 5ac973bceab0d486c497345fe884ff54d1bb225a 10.93.84.53:
  36. slots:- ( slots) master
  37. additional replica(s)
  38. S: 942c9f97dc68198c39f425d13df0d8e3c40c5a58 10.93.84.53:
  39. slots: ( slots) slave
  40. replicates 5ac973bceab0d486c497345fe884ff54d1bb225a
  41. S: 92f62ec93a0550d962f81213ca7e9b3c9c996afd 10.93.84.53:
  42. slots: ( slots) slave
  43. replicates 6346ae8c7af7949658619fcf4021cc7aca454819
  44. M: cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 10.93.84.53:
  45. slots:- ( slots) master
  46. additional replica(s)
  47. [OK] All nodes agree about slots configuration.
  48. >>> Check for open slots...
  49. >>> Check slots coverage...
  50. [OK] All slots covered.

可以看到16384个slot都已经创建完成,并且建立了3个master和对应的replica:

  1. Using masters:
  2. 10.93.84.53:
  3. 10.93.84.53:
  4. 10.93.84.53:
  5. Adding replica 10.93.84.53: to 10.93.84.53:
  6. Adding replica 10.93.84.53: to 10.93.84.53:
  7. Adding replica 10.93.84.53: to 10.93.84.53:7002
  8.  
  9. 。。。
  1. [OK] All 16384 slots covered.

4、验证集群状态

登录集群客户端,-c标识以集群方式登录

  1. ./bin/redis-cli -h 10.93.84.53 -p -c

查看集群状态

  1. 10.93.84.53:> cluster info
  2. cluster_state:ok
  3. cluster_slots_assigned:
  4. cluster_slots_ok:
  5. cluster_slots_pfail:
  6. cluster_slots_fail:
  7. cluster_known_nodes:
  8. cluster_size:
  9. cluster_current_epoch:
  10. cluster_my_epoch:
  11. cluster_stats_messages_sent:
  12. cluster_stats_messages_received:
  13. 10.93.84.53:> cluster nodes
  14. 942c9f97dc68198c39f425d13df0d8e3c40c5a58 10.93.84.53: slave 5ac973bceab0d486c497345fe884ff54d1bb225a connected
  15. 5ac973bceab0d486c497345fe884ff54d1bb225a 10.93.84.53: master - connected -
  16. a92a81532b63652bbd862be6f19a9bd8832e5e05 10.93.84.53: slave cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 connected
  17. cc46a4a1c0ec3f621b6b5405c6c10b7cffe73932 10.93.84.53: master - connected -
  18. 6346ae8c7af7949658619fcf4021cc7aca454819 10.93.84.53: myself,slave 92f62ec93a0550d962f81213ca7e9b3c9c996afd connected
  19. 92f62ec93a0550d962f81213ca7e9b3c9c996afd 10.93.84.53: master - connected -

 一些原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的,一致性哈希对向集群中新增和删除实例的支持很好,但是哈希槽对向集群新增实例或者删除实例的话,需要额外的操作,需要手动的将slot重新平均的分配到新集群的实例中。

redis cluster 默认分配了 16384 个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key)%16384。

Redis 集群会把数据存在一个master节点,然后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的salve节点,充当master。

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

5、python集群客户端

以Python Redis Cluster集群的使用方式为例,简单说明一下如何使用,让大家更直观的了解一下Redis集群。

Redis集群方式与单机方式在python客户端实现上是有很大不同的。

  • 包不同,单机依赖包redis-py,集群依赖包redis-py-cluster
  • 对同时操作多个keys的命令(mset, mget, sinter, ...),redis-py-cluster重写StriceRedis(单机Redis操作类)了其方法,而这些方法丧失了命令的原子性。
  • Pipelines在集群中的表现也不同了。在单机版中,pipeline是批量batch提交redis批量执行的,但是在集群版中,是one by one提交redis执行完成直接返回,在客户端重新组合成一个列表返回。所以集群中只是看起来像是批量执行。
  • 一些命令是会Fanout(扇形)发送到集群中各个shard中执行并汇总的,如ping,keys等。一些命令是不提倡使用(blocked),如watch,unwatch等。

我只是简单翻译了官网的一些内容,相信信息大家可以参考:

http://redis-py-cluster.readthedocs.io/en/master/commands.html

http://redis-py-cluster.readthedocs.io/en/master/limitations-and-differences.html

1)安装redis-py-cluster 

简单的通过pip安装redis-py-cluster包。如果安装失败,可以自助下载安装。

  1. # pip install redis-py-cluster
  2. Collecting redis-py-cluster
  3. Downloading redis_py_cluster-1.3.-py2.py3-none-any.whl
  4. Requirement already satisfied: redis>=2.10. in /home/idata/pythonEnv/idataPlatEnv/lib/python2./site-packages/redis-2.10.-py2..egg (from redis-py-cluster)
  5. Installing collected packages: redis-py-cluster
  6. Successfully installed redis-py-cluster-1.3.

2)一个简单的demo

封装了RedisCluster操作类,实现了一些方法,其实就是做了一层封装。

封装的意义是:我喜欢对这些封装增加一些装饰器,控制异常和重试等逻辑。

  1. # -*- coding:utf-8 -*-
  2.  
  3. from rediscluster import StrictRedisCluster
  4.  
  5. redis_nodes = [
  6. {'host': '10.93.84.53', 'port': 7000},
  7. {'host': '10.93.84.53', 'port': 7001},
  8. {'host': '10.93.84.53', 'port': 7002},
  9. {'host': '10.93.84.53', 'port': 7003},
  10. {'host': '10.93.84.53', 'port': 7004},
  11. {'host': '10.93.84.53', 'port': 7005},
  12. ]
  13.  
  14. class RedisCluster(object):
  15.  
  16. def __init__(self, redis_nodes):
  17. self.cluster = StrictRedisCluster(startup_nodes=redis_nodes)
  18.  
  19. # 无差别的方法
  20. def set(self, name, value, ex=None, px=None, nx=False, xx=False):
  21. return self.cluster.set(name, value, ex, px, nx, xx)
  22.  
  23. # 无差别的方法
  24. def get(self, name):
  25. return self.cluster.get(name)
  26.  
  27. # 扇形发送的命令
  28. def cluster_info(self):
  29. return self.cluster.cluster_info()
  30.  
  31. # 重写StrictRedis的方法
  32. def mset(self, *args, **kwargs):
  33. return self.cluster.mset(args, kwargs)
  34.  
  35. # 重写StrictRedis的方法
  36. def mget(self, keys, *args):
  37. return self.cluster.mget(keys, args)
  38.  
  39. cluster = RedisCluster(redis_nodes)
  40. cluster.cluster_info()

Linux Redis集群搭建与集群客户端实现(Python)的更多相关文章

  1. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  2. 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  3. 分布式缓存技术redis系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  4. redis高级应用(集群搭建、集群分区原理、集群操作)

    文章主目录 Redis集群简介 Redis集群搭建 Redis集群分区原理 集群操作 参考文档 本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 ...

  5. redis系列之4----redis高级应用(集群搭建、集群分区原理、集群操作)

    文章主目录 Redis集群简介 Redis集群搭建 Redis集群分区原理 集群操作 参考文档 本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 ...

  6. Redis.之.环境搭建(集群)

    Redis.之.环境搭建(集群) 现有环境: /u01/app/ |- redis # 单机版 |- redis-3.2.12    # redis源件 所需软件:redis-3.0.0.gem -- ...

  7. MongoDB集群搭建-副本集

    MongoDB集群搭建-副本集 概念性的知识,可以参考本人博客地址: 一.Master-Slave方案: 主从: 二.Replica Set方案: 副本集: 步骤:(只要按步骤操作,100%成功) 1 ...

  8. Linux Redis集群搭建与集群客户端实现

    硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本: Redis已经成功安装,安装路径为/home/idata/yangfan/lo ...

  9. Linux 下 LXD 容器搭建 Hadoop 集群

    配置要求 主机内存 4GB . 磁盘 100 GB 以上. HOST 机安装常用 Linux 发行版. Linux Container ( LXD ) 以主机 ubuntu 16.04 为例. 安装 ...

随机推荐

  1. 沙盒单机网站代表-Steam【推荐】

    Steam平台是Valve公司聘请BitTorrent(BT下载)发明者布拉姆·科恩亲自开发设计的游戏平台. Steam平台目前是一款全球最大的综合性数字发行平台.玩家可以在该平台购买.下载.讨论.上 ...

  2. [转载]Linux shell中的竖线(|)——管道符号

    原文地址:Linux shell中的竖线(|)--管道符号作者:潇潇 管道符号,是unix一个很强大的功能,符号为一条竖线:"|". 用法: command 1 | command ...

  3. Java 多线程(四) 多线程访问成员变量与局部变量

    先看一个程序例子: public class HelloThreadTest { public static void main(String[] args) { HelloThread r = ne ...

  4. 201521123069 《Java程序设计》 第9周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. (1)使用try...catch语句捕获异常(try块后可跟一个或多个catch块,注意子类异常要放在父类异常前面, ...

  5. 201521123030 《Java程序设计》 第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  6. Geronimo tomcat: 在 Apache Geronimo 插件体系中将 Apache Tomcat 这个优秀的 Web 容器整合至其中

    Apache Geronimo 灵活的插件体系将 Tomcat, OpenJPA, OpenEJB, ActiveMQ 等第三方组件集成至其中.本文从多角度介绍了在 Apache Geronimo 中 ...

  7. PIC单片机状态寄存器中的C(进位/借位位标志)

    查阅PIC单片机芯片手册,关于进位/借位位的说明为: C:进位/借位位. 1 = 结果的最高位发生了进位 0 = 结果的最高位未发生进位 同时有一条标注:借位的极性是相反的. 通过以上说明,可以将C的 ...

  8. php中文分词

    主要列出现知道的几个工具: 1,scws中文分词支持php7 http://www.xunsearch.com/scws/index.php 2,phpanalysis中文分词,主要使用了机械分词方法 ...

  9. 在linux下通过hexdump生成一个十六进制的文本保存文件,解析此文件转变成正常源代码文件。

    举例说明: 此十六进制保存的文件为此源代码hexdump生成的: #include<stdio.h> #include<string.h> #include<stdlib ...

  10. Maven第三篇【Maven术语、pom.xml介绍】

    maven术语 在我们上一篇中已经知道了在Intellij idea下是如何使用Maven的了,创建出来的目录结构是这样子的: 上面的目录结构就是Maven所谓的"约定",我们使用 ...