精华内容
下载资源
问答
  • 这些技术中每一种技术都使用不同存储机制、索引技巧、锁定水平并且最终提供广泛不同功能能力。通过选择不同技术,你能够获得额外速度或者功能,从而改善你应用整体功能。例如,如果你在研究大量...

    存储引擎是什么?

    MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

    例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

    这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

    选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。

    在这篇文章中,我们不准备集中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面),相反,我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启用不同的存储引擎。为了实现这个目的,在介绍每一个存储引擎的具体情况之前,我们必须要了解一些基本的问题。

    如何确定有哪些存储引擎可用

    你可以在MySQL(假设是MySQL server version: 5.0.22-community-nt)中使用显示引擎的命令得到一个可用引擎的列表。

    mysql> show engines;

    +------------+---------+----------------------------------------------------------------+

    | Engine      | Support | Comment                                                         |

    +------------+---------+----------------------------------------------------------------+

    | MyISAM      | YES      | Default engine as of MySQL 3.23 with great performance          |

    | MEMORY      | YES      | Hash based, stored in memory, useful for temporary tables       |

    | InnoDB      | DEFAULT | Supports transactions, row-level locking, and foreign keys      |

    | BerkeleyDB | NO       | Supports transactions and page-level locking                    |

    | BLACKHOLE   | NO       | /dev/null storage engine (anything you write to it disappears) |

    | EXAMPLE     | NO       | Example storage engine                                          |

    | ARCHIVE     | YES      | Archive storage engine                                          |

    | CSV         | NO       | CSV storage engine                                              |

    | ndbcluster | NO       | Clustered, fault-tolerant, memory-based tables                  |

    | FEDERATED   | NO       | Federated MySQL storage engine                                  |

    | MRG_MYISAM | YES      | Collection of identical MyISAM tables                           |

    | ISAM        | NO       | Obsolete storage engine                                         |

    +------------+---------+----------------------------------------------------------------+

    12 rows in set (0.00 sec)

    16 rows in set (0.01 sec)   这个表格显示了可用的数据库引擎的全部名单以及在当前的数据库服务器中是否支持这些引擎。

    对于MySQL server version: 5.0.22-community-nt,可以使用mysql> show variables like "have_%"(显示类似“have_%”的变量):

    mysql> show variables like "have_%";

    +-----------------------+----------+

    | Variable_name          | Value     |

    +-----------------------+----------+

    | have_archive           | YES       |

    | have_bdb               | NO        |

    | have_blackhole_engine | NO        |

    | have_compress          | YES       |

    | have_crypt             | NO        |

    | have_csv               | NO        |

    | have_example_engine    | NO        |

    | have_federated_engine | NO        |

    | have_geometry          | YES       |

    | have_innodb            | YES       |

    | have_isam              | NO        |

    | have_ndbcluster        | NO        |

    | have_openssl           | DISABLED |

    | have_query_cache       | YES       |

    | have_raid              | NO        |

    | have_rtree_keys        | YES       |

    | have_symlink           | YES       |

    +-----------------------+----------+

    17 rows in set (0.00 sec)

    你可以通过修改设置脚本中的选项来设置在MySQL安装软件中可用的引擎。如果你在使用一个预先包装好的MySQL二进制发布版软件,那么,这个软件就包含了常用的引擎。然而,需要指出的是,如果你要使用某些不常用的引擎,特别是CSV、RCHIVE(存档)和BLACKHOLE(黑洞)引擎,你就需要手工重新编译MySQL源码 。

    使用一个指定的存储引擎

    你可以使用很多方法指定一个要使用的存储引擎。最简单的方法是,如果你喜欢一种能满足你的大多数数据库需求的存储引擎,你可以在MySQL设置文件中设置一个默认的引擎类型(使用storage_engine 选项)或者在启动数据库服务器时在命令行后面加上--default-storage-engine或--default-table-type选项 。

    更灵活的方式是在随MySQL服务器发布同时提供的MySQL客户端时指定使用的存储引擎。最直接的方式是在创建表时指定存储引擎的类型,向下面这样:

    CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB

    你还可以改变现有的表使用的存储引擎,用以下语句:

    ALTER TABLE mytable ENGINE = MyISAM

    然而,你在以这种方式修改表格类型的时候需要非常仔细,因为对不支持同样的索引、字段类型或者表大小的一个类型进行修改可能使你丢失数据。如果你指定一个在你的当前的数据库中不存在的一个存储引擎,那么就会创建一个MyISAM(默认的)类型的表。

    各存储引擎之间的区别

    为了做出选择哪一个存储引擎的决定,我们首先需要考虑每一个存储引擎提供了哪些不同的核心功能。这种功能使我们能够把不同的存储引擎区别开来。我们一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。一些引擎具有能过促使你做出决定的独特的功能,我们一会儿再仔细研究这些具体问题。

    字段和数据类型

    虽然所有这些引擎都支持通用的数据类型,例如整型、实型和字符型等,但是,并不是所有的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。其它引擎也许仅支持有限的字符宽度和数据大小。

    这些局限性可能直接影响到你可以存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息创建的索引产生间接的影响。这些区别能够影响你的应用程序的性能和功能,因为你必须要根据你要存储的数据类型选择对需要的存储引擎的功能做出决策。

    锁定

    数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成之前,其它处理不能修改这个数据(在某些情况下还不允许读这种数据)。

    锁定不仅影响许多不同的应用程序如何更新数据库中的信息,而且还影响对那个数据的查询。这是因为查询可能要访问正在被修改或者更新的数据。总的来说,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。由于向数据中插入信息和更新信息这两种情况都需要锁定,你可以想象,多个应用程序使用同一个数据库可能会有很大的影响。

    不同的存储引擎在不同的对象级别支持锁定,而且这些级别将影响可以同时访问的信息。得到支持的级别有三种:表锁定、块锁定和行锁定。支持最多的是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用很多的多用户数据库有很大的影响,因为它延迟了更新的过程。

    页级锁定使用Berkeley DB引擎,并且根据上载的信息页(8KB)锁定数据。当在数据库的很多地方进行更新的时候,这种锁定不会出现什么问题。但是,由于增加几行信息就要锁定数据结构的最后8KB,当需要增加大量的行,也别是大量的小型数据,就会带来问题。

    行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着很多应用程序能够更新同一个表中的不同行的数据,而不会引起锁定的问题。只有InnoDB存储引擎支持行级锁定。

    建立索引

    建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些技术也许会更适合你存储的数据类型。

    有些存储引擎根本就不支持索引,其原因可能是它们使用基本表索引(如MERGE引擎)或者是因为数据存储的方式不允许索引(例如FEDERATED或者BLACKHOLE引擎)。

    事务处理

    事务处理功能通过提供在向表中更新和插入信息期间的可靠性。这种可靠性是通过如下方法实现的,它允许你更新表中的数据,但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你需要要使用事务处理功能保证对借方科目和贷方科目的数据更改都顺利完成,才接受所做的修改。如果任一项操作失败了,你都可以取消这个事务处理,这些修改就不存在了。如果这个事务处理过程完成了,我们可以通过允许这个修改来确认这个操作。

    附:MySQL中MyISAM引擎与InnoDB引擎性能简单测试

    [硬件配置]

    CPU : AMD2500+ (1.8G)

    内存: 1G/现代

    硬盘: 80G/IDE

    [软件配置]

    OS : Windows XP SP2

    SE : PHP5.2.1

    DB : MySQL5.0.37

    Web: IIS6

    [MySQL表结构]

    CREATE TABLE `myisam` (

    `id` int(11) NOT NULL auto_increment,

    `name` varchar(100) default NULL,

    `content` text,

    PRIMARY KEY    (`id`)

    ) ENGINE=MyISAM DEFAULT CHARSET=gbk;

    CREATE TABLE `innodb` (

    `id` int(11) NOT NULL auto_increment,

    `name` varchar(100) default NULL,

    `content` text,

    PRIMARY KEY    (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

    [数据内容]

    $name = "heiyeluren";

    $content = "MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:· MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。 ·MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。 释:MEMORY存储引擎正式地被确定为HEAP引擎。· InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。·EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。";

    [插入数据-1] (innodb_flush_log_at_trx_commit=1)

    MyISAM 1W:3/s

    InnoDB 1W:219/s

    MyISAM 10W:29/s

    InnoDB 10W:2092/s

    MyISAM 100W:287/s

    InnoDB 100W:没敢测试

    [插入数据-2] (innodb_flush_log_at_trx_commit=0)

    MyISAM 1W:3/s

    InnoDB 1W:3/s

    MyISAM 10W:30/s

    InnoDB 10W:29/s

    MyISAM 100W:273/s

    InnoDB 100W:423/s

    [插入数据3] (innodb_buffer_pool_size=1024M)

    InnoDB 1W:3/s

    InnoDB 10W:33/s

    InnoDB 100W:607/s

    [插入数据4] (innodb_buffer_pool_size=256M, innodb_flush_log_at_trx_commit=1, set autocommit=0)

    InnoDB 1W:3/s

    InnoDB 10W:26/s

    InnoDB 100W:379/s

    [MySQL 配置文件] (缺省配置)

    # MySQL Server Instance Configuration File

    [client]

    port=3306

    [mysql]

    default-character-set=gbk

    [mysqld]

    port=3306

    basedir="C:/mysql50/"

    datadir="C:/mysql50/Data/"

    default-character-set=gbk

    default-storage-engine=INNODB

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    max_connections=100

    query_cache_size=0

    table_cache=256

    tmp_table_size=50M

    thread_cache_size=8

    myisam_max_sort_file_size=100G

    myisam_max_extra_sort_file_size=100G

    myisam_sort_buffer_size=100M

    key_buffer_size=82M

    read_buffer_size=64K

    read_rnd_buffer_size=256K

    sort_buffer_size=256K

    innodb_additional_mem_pool_size=4M

    innodb_flush_log_at_trx_commit=1

    innodb_log_buffer_size=2M

    innodb_buffer_pool_size=159M

    innodb_log_file_size=80M

    innodb_thread_concurrency=8

    【总结】

    可以看出在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显的提升。

    基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在my.cnf中的配置也是比较关键的,良好的配置,能够有效的加速你的应用。

    如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

    展开全文
  • 从mysql.com下载了一个最新mysql.5.6.17后安装后,因原机器安装过mysql,启动总是报错检查了一下mysql原安装目录里面有个一新myql-new.conf。对比了下原/etc/my.confmysql-net.conf在mysql.5.6.17这个版本下有...

    从mysql.com下载了一个最新的mysql.5.6.17后安装后,因原机器安装过mysql,启动总是报错

    f747cbf0a2548ce1e3a4c1a5e282fe61.png

    检查了一下mysql的原安装目录里面有个一新的myql-new.conf。

    对比了下原/etc/my.conf和mysql-net.conf在mysql.5.6.17这个版本下有很大不同

    原my.conf配置内容

    [root@nginx01 bin]# cat /etc/my.cnf

    [mysqld]

    datadir=/var/lib/mysql

    socket=/var/lib/mysql/mysql.sock

    user=mysql

    # Disabling symbolic-links is recommended to prevent assorted security risks

    symbolic-links=0

    [mysqld_safe]

    log-error=/var/log/mysqld.log

    pid-file=/var/run/mysqld/mysqld.pid

    mysql_enable="YES"

    mysql_args="--skip-grant-tables --skip-networking"

    新配置的my.conf

    [root@nginx01 mysql]# cat /etc/my.cnf

    # For advice on how to change settings please see

    # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

    [mysqld]

    # Remove leading # and set to the amount of RAM for the most important data

    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

    # innodb_buffer_pool_size = 128M

    # Remove leading # to turn on a very important data integrity option: logging

    # changes to the binary log between backups.

    # log_bin

    # These are commonly set, remove the # and set as required.

    # basedir = .....

    # datadir = .....

    # port = .....

    # server_id = .....

    # socket = .....

    # Remove leading # to set options mainly useful for reporting servers.

    # The server defaults are faster for transactions and fast SELECTs.

    # Adjust sizes as needed, experiment to find the optimal values.

    # join_buffer_size = 128M

    # sort_buffer_size = 2M

    # read_rnd_buffer_size = 2M

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

    将安装目录下面的这个文件覆盖后

    重启mysql

    [root@nginx01 bin]# ./mysqld_safe --user=mysql &

    [1] 30069

    [root@nginx01 bin]# 140518 11:21:42 mysqld_safe Logging to '/usr/local/mysql/data/nginx01.err'.

    140518 11:21:42 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

    [root@nginx01 bin]# netsat -atnp|grep 3306

    -bash: netsat: command not found

    [root@nginx01 bin]# netstat -antp|grep 3306

    tcp        0      0 :::3306                     :::*                        LISTEN      30173/mysqld

    启动成功

    展开全文
  • 在这篇文章中,我们不准备集中讨论不同存储引擎技术方面问题(尽管我们不可 避免地要研究这些因素某些方面),相反,我们将集中介绍这些不同引擎分别最适应哪种需求如何启用不同存储引擎。
  • 这两个方法都 可以启动Service,但是它们使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连, 即使调用者退出了,服务仍然运行。使用bindService()方 法启用服务,调用者与服务绑定在...
    服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都 可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连, 即使调用者退出了,服务仍然运行。使用bindService()方 法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
     
    如果打算采用Context.startService()方 法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方 法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调 用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调 用onDestroy()方法。
     
    如果打算采用Context.bindService()方 法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方 法,接着调用onBind()方法。这个时候调用者和服务绑定 在一起,调用者退出了,系统就会先调用服务的onUnbind()方 法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方 法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑 定,可以调用unbindService()方法,调用该方法 也会导致系统调用服务的onUnbind()-->onDestroy()方 法。

    服务常用生命周期回调方法如下:
    onCreate() 该方法在服务被创建 时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
    onDestroy()该方法在服务被终止时调用。
     
    与采用Context.startService()方 法启动服务有关的生命周期方法
    onStart() 只有采用Context.startService()方 法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方 法尽管不会多次创建服务,但onStart() 方法会被多次调用。
     
    与采用Context.bindService()方 法启动服务有关的生命周期方法
    onBind()只有采用Context.bindService()方 法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
    onUnbind()只有采用Context.bindService()方 法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用

    //采用Context.startService()方法启动服务的代码如下:
    public class HelloActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            ......
            Button button =(Button) this.findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener(){
           public void onClick(View v) {
                  Intent intent = new Intent(HelloActivity.this, SMSService.class);
                  startService(intent);
           }});       
        }
    }
     
    //采用Context. bindService()方法启动服务的代码如下:
    public class HelloActivity extends Activity {
         ServiceConnection conn = new ServiceConnection() {
                  public void onServiceConnected(ComponentName name, IBinder service) {
               }
               public void onServiceDisconnected(ComponentName name) {
               }
         };
        @Override public void onCreate(Bundle savedInstanceState) { 
            Button button =(Button) this.findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener(){
                   public void onClick(View v) {
                      Intent intent = new Intent(HelloActivity.this, SMSService.class);
                      bindService(intent, conn, Context.BIND_AUTO_CREATE);
                      //unbindService(conn);//解除绑定
              }});       
        }
    }
     

     

     

    服务的生命周期回调方法:

    服务的生命周期跟启动服务的方法有关:
     当采用Context.startService()方法启动服务,与之有关的生命周期方法
    onCreate()--> onStart()--> onDestroy()
    onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
    onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
    onDestroy()该方法在服务被终止时调用。

     当采用Context.bindService()方法启动服务,与之有关的生命周期方法
    onCreate()--> onBind() --> onUnbind() --> onDestroy()
    onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
    onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

    如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
    onCreate()-->onStart()-->onBind()-->onUnbind()[重载后的方法需返回true-->onRebind()

     


    展开全文
  • 2:redis服务启动 2.1:在windows系统中 启动redis服务端 使用cmd进入到redis安装目录 redis-server.exe redis.windows.conf 可以在windows系统中编写一个启动文件,可以把该指令写入到startup.cmd文件中 启动...

    1:redis的安装

    1.1:redis在window系统的安装

    省略,可以自行百度
    我这里安装的压缩版

    1.2:redis在linux系统的安装

    现在还没有用到,用到了再补上TODO

    2:redis的服务启动

    2.1:在windows系统中

    启动redis服务端
    使用cmd进入到redis的安装目录

    redis-server.exe redis.windows.conf
    

    可以在windows系统中编写一个启动文件,可以把该指令写入到startup.cmd文件中

    启动redis客户端
    重新启用一个cmd会话窗口,进入到redis的安装目录

    redis-cli –h IP地址 –p 端口 -a 密码	//默认IP本机 端口6379 密码在配置文件中自定义
    redis-cli -h 127.0.0.1 -p 6379 -a 123456
    

    在这里插入图片描述

    2.2:在linux系统中

    启动redis服务器端
    进入对应的安装目录

    cd .....
    方式一
    ./bin/redis-server
    方式二
    ./bin/redis-server ./redis.conf
    

    启动客户端
    进入Redis客服端(Clone Session克隆一个窗口) 进入对应的安装目录

    redis-cli –h IP地址 –p 端口 -a 密码	//默认IP本机 端口6379 密码在配置文件中配置
    

    退出客户端命令:Ctrl+C

    3:redis的关闭

    在windows环境中

    服务端:
    redis-server --service-stop

    在linux环境中

    方式一

    (断电、非正常关闭。容易数据丢失) 查询redis进程id

    ps -ef | grep -i redis
    //kill对 查询的id进行强制关闭
    kill -9 PID
    

    方式二
    (正常关闭、数据保存)
    关闭redis服务,通过客户端进行shutdown
    如果redis设置了密码,需要先在客户端通过密码登录,再进行shutdown即可关闭服务端
    在这里插入图片描述

    4:远程连接

    远程连接比较流行的软件: RedisDesktopManager
    默认不允许远程连接,需要修改一下信息才可以进行修改

    bind 127.0.01	注释掉 允许除本机外的机器访问Redis服务
    requirepass 设置密码 设定数据库密码 (有些情况下不设定密码是无法进行远程连接访问的)
    

    5:redis中redis.windows.conf和redis.windows-service.conf文件的区别

    在这里插入图片描述
    Windows版的Redis有2个配置文件,一个是:redis.windows.conf,另一个是redis.windows-service.conf。

    由于安装版的Redis服务自启动,是直接通过redis-server.exe启动的,但是,启动时并没有加载Redis的配置文件(redis.windows.conf),导致redis 中bind配置和密码设置不生效。
    Redis自启动导致的常见的问题有:

    1、在CMD命令加载配置文件(redis.windows.conf)进行启动是不成功的。提示如下:

    D:\soft\Redis>redis-server.exe redis.windows.conf  
    [13760] 11 Jul 16:39:51.067 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error  
    

    因为Redis服务已经自启动,这里是不会再新启动的,故加载配置文件是失败的。也没有出现Redis启动的小盒子(下面有图片,慢慢往下看),需要注意的是Windows版的Redis安装时,默认启动加载的配置文件是redis.windows-service.conf,如下图所示:
    在这里插入图片描述
    2、密码失效。虽然在配置文件(redis.windows.conf)设置了密码,密码为123456:

    ################################## SECURITY ###################################  
    ……省略……  
    # requirepass foobared  
    requirepass 123456  
    

    但启动客户端进行Redis命令操作时,是不需要密码的,也没有提示无权限操作,这是一个严重的安全问题。

    D:\soft\Redis>redis-cli.exe  
    127.0.0.1:6379> get name  
    "haha"  
    127.0.0.1:6379>  
    

    3、Redis访问IP绑定(bind)无效
    Redis默认绑定的ip为127.0.0.1,但如果想内网的机器都能访问,则需要设置内网的ip地址,如192.168.100.66,然后redis.host则可以设置为192.168.100.66访问Redis。
    Redis ip地址绑定默认说明:

    ################################## NETWORK #####################################  
      
    # By default, if no "bind" configuration directive is specified, Redis listens  
    # for connections from all the network interfaces available on the server.  
    # It is possible to listen to just one or multiple selected interfaces using  
    # the "bind" configuration directive, followed by one or more IP addresses.  
    #  
    # Examples:  
    #  
    # bind 192.168.1.100 10.0.0.1  
    # bind 127.0.0.1 ::1  
    #  
    # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the  
    # internet, binding to all the interfaces is dangerous and will expose the  
    # instance to everybody on the internet. So by default we uncomment the  
    # following bind directive, that will force Redis to listen only into  
    # the IPv4 lookback interface address (this means Redis will be able to  
    # accept connections only from clients running into the same computer it  
    # is running).  
    #  
    # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES  
    # JUST COMMENT THE FOLLOWING LINE.  
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
    bind 127.0.0.1  
    

    主要是意思是,如果设置了bind,只能通过绑定的地址访问Redis。

    如果不设置bind,则所有地址都可以访问,如果在项目部署外网,所有人都可以访问到,所以这里也是个注意的地址,还是设置bind比较安全。

    绑定多个ip地址:

    bind 127.0.0.1 192.168.100.66  
    

    127.0.0.1和192.168.100.66之间通过空格分隔,不是逗号。
    但如果Redis是自启动的,没有加载配置文件(redis.windows.conf)启动,这里的设置也是无效的。
    如果不绑定ip地址(192.168.100.66),直接设置redis.host=192.168.100.66是访问不了的,出现以下的错误:
    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

    所以说,Redis由Windows自启动的,配置文件(redis.windows.conf)的设置都是无效的

    五、解决方案:

    1、禁用Redis的自启动,设置为手动
    2、不要使用Redis安装版,使用压缩版
    3、通过命令行CMD加载配置文件(redis.windows.conf)启动

    D:\soft\Redis>redis-server.exe redis.windows.conf  
    

    4、再新打开一个cmd(不要关闭之前打的Cmd窗口),启动Redis客户端:

    D:\soft\Redis>redis-cli.exe  
    

    5、获取Redis中某个key的值,提示无权限。

    127.0.0.1:6379> get name  
    (error) NOAUTH Authentication required.  
    127.0.0.1:6379>  
    

    通过密码进入访问,使用 auth + 密码,如下:

    127.0.0.1:6379> get name  
    (error) NOAUTH Authentication required.  
    127.0.0.1:6379> auth 123456  
    OK  
    127.0.0.1:6379> get name  
    "haha"  
    127.0.0.1:6379>  
    

    六、如果不是安装版的Redis,又想让Redis自启动的时候,可以向Windows添加自启动服务:
    1、进入到Redis的安装目录

    D:\soft\Redis>  
    

    2、执行命令:

    redis-server --service-install redis.windows.conf --loglevel notice --service-name Redis 
    

    完整实例指令:

    D:\soft\Redis>redis-server --service-install redis.windows.conf --loglevel notice --service-name Redis  
    

    –service-install redis.windows.conf 指定redis配置文件
    –loglevel notice 指定日志级别
    –service-name Redis 指定服务名称
    运行结果如下( Redis successfully installed as a service.):

    D:\soft\Redis>redis-server --service-install redis.windows.conf --loglevel notice --service-name Redis  
    [7176] 12 Jul 09:34:50.730 # Granting read/write access to 'NT AUTHORITY\NetworkService' on: "D:\soft\Redis" "D:\soft\Redis\"  
    [7176] 12 Jul 09:34:50.730 # Redis successfully installed as a service. 
    

    4、安装服务后,默认不是马上启动的,但启动类型是自启动,如果想马上启动,请执行命令:

    redis-server --service-start 
    
    服务成功启动显示如下:  
    [9876] 12 Jul 09:57:41.251 # Redis service successfully started.  
    

    或者重启电脑。

    5、删除Redis服务:
    redis-server --service-uninstall

    5:redis的配置文件讲解

    redis.windows.conf文件中

    #redis的配置
    
    #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    daemonize yes
    #当Redis以守护进程方式运行时,Redis默认会把pid写入redis.pid文件,可以通过pidfile指定
    pidfile 'E:/xxx/redis/redis_pid/redis.pid'
    #端口
    port 6379
    #绑定主机的ip地址
    bind 127.0.0.1
    #当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
    timeout 300
    #指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
    loglevel notice
    #日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
    logfile stdout
    #设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
    databases 16
    #指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
    #分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改
    save 900 1
    save 300 10
    save 60 10000
    #指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    rdbcompression yes
    #指定本地数据库文件名,默认值为dump.rdb
    dbfilename dump.rdb
    #指定本地数据库存放目录
    dir 'D:/XXX/redis/redis_database'
    #设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
    #slaveof 127.0.0.1 6379
    #当master服务设置了密码保护时,slav服务连接master的密码
    #masterauth 123456
    #设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
    #requirepass foobared
    #设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
    maxclients 10000
    #指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
    maxmemory 300m
    #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
    appendonly yes
    #指定更新日志文件名,默认为appendonly.aof
    appendfilename 'appendonly.aof'
    #指定更新日志条件,共有3个可选值
    #no:表示等操作系统进行数据缓存同步到磁盘(快) 
    #always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
    #everysec:表示每秒同步一次(折衷,默认值)
    appendfsync everysec
    
    展开全文
  • 今后玩家在启动游戏时不会再有两个客户端选择,而会直接启动重生客户端。值得注意是,更新以后会自动删除起源1老客户端文件,DOTA2文件夹所占硬盘容量也会减少。而未更新玩家将不能够进入客户端,此外客户端中...
  • BIOSCMOS的区别

    2014-12-28 11:54:20
    很多新手分不清BIOSCMOS的区别,其实可以这么理解:BIOS是软件,CMOS是硬件,BIOS运行在CMOS上。当然,这么说是不严格的,但是足以让你理解两者的关系。 下面来详细讲解一下。 BIOS是基本输入输出系统,Basic ...
  • 这两个方法都 可以启动Service,但是它们使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连, 即使调用者退出了,服务仍然运行。使用bindService()方 法启用服务,调用者与服务绑定在...
  • 北京时间9月10日凌晨,打开《DOTA2》客户端,发现已经正式启用了起源2引擎,现在玩家在启动《DOTA2》时已经无法找到起源1引擎选项,所以现在打开游戏后,将直接进入重生客户端。起源2引擎游戏载入画面此前...
  • 转自:...要开放vSGA私ESXI主机最好要2张显卡(一张也可以,只是ESXI主机每次重新启动要下指令指定启用vSGA显卡)。2.启用vSGA显卡显示顺序不能是Primary(在Bios设定)3.要安装Nvidia For ESXIDri...
  • 2、容器虚拟化的区别 容器技术: 1、共用宿主机的内核; 2、启动第一个进程nginx; 3、轻量级、损耗少、启动快、性能高; 4、共用linux内核无法启用windows机器; 5、硬盘写入速度快; 虚拟化技术: 1、需要硬件...
  • jdk1.6jdk1.7的区别

    千次阅读 2018-01-10 08:50:58
    现在 Java7也是采用了模块划分方式来提速,一些不是必须模块并没有下载和安装,因此在使用全新Java7虚拟机时候会发现真很快,当虚拟机需要用到某些功能时候,再下载和启用相应模块,这样使得最初...
  • HttpWebRequest类HttpWebRequest类与HttpRequest类的区别. HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReque ...常用邮箱的服务器&lpar;SMTP&...
  • 这里对linux 的几个命令整理下,有:休眠,挂起,待机,关机等几个命令的区别及如何实现。 休眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,所有设备都停止工作。当再次使用时需按开关机键,机器将会恢复...
  • mongodb中使用$in$all的区别

    千次阅读 2019-04-13 13:19:41
    在这里我启用本地mongodb进行测试 1:先启动本地mongodb服务文件 2:再启动本地mongodb 3:在这里我们使用nosql booster可视化工具进行操作 测试数据为: 需求1: 查询出包含1或者包含4数据 db....
  • 这两个方法都可以启动Service,但是它们使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了...
  • 浅谈线程池及submit()execute()的区别

    千次阅读 2017-11-01 00:29:51
    其二:submitexecute的区别。 一、线程池概述 首先,线程池的使用,是非必须的。并不是涉及到启用多线程的地方,就非得整出个线程池出来! 1.1,什么是线程池 线程池是一种多线程处理形式,处理过程中将任务...
  • Windows To Go 操作任何其他 Windows 安装程序一样,但一些例外情况除外。这些例外情况包括: 默认情况下,禁用休眠睡眠功能。为防止 Windows To Go 在漫游期间遭受意外数据损坏,禁用休眠睡眠功能。...
  • Spring Cloud版本:Angle -> Brixton -> Camden -> Dalston -> Edgware ->...需要在主启动类上增加@EnableDiscoveryClient或者@EnableEurekaClient注解   EnableEurekaClient 中...
  • jdk1.71.6区别

    千次阅读 2016-10-09 10:30:46
    现在 Java7也是采用了模块划分方式来提速,一些不是必须模块并没有下载和安装,因此在使用全新Java7虚拟机时候会发现真很快,当虚拟机需要用到某些功能时候,再下载和启用相应模块,这样使得最初...
  • Java线程中start()run()的区别

    千次阅读 2018-03-24 11:05:30
    run():不管是通过实现Runnable接口还是继承Thread类(其实Thread中run方法也是调用了Runnable接口run方法),调用run()方法仅仅是相当于调用了一个方法,没有启用线程。start():会启动一个新线程,运行重写...
  • 项目启动的入口(默认必须在最外层目录) @ ComponentScan : 配置扫描路径 @ Configuration :配置spring容器(应用上下文) @ EnableAutoConfiguration :启用自动配置 @Value:基本属性值注入 @PropertySource:...
  •  hive中order by 传统sql中order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数据多少,不管文件多少,都启用一个reduce进行处理。...
  • ifconfig与ifconfig -a的区别

    千次阅读 2020-09-21 20:55:21
    今天做项目时需要通过ifconfig -a命令统计网卡数量,就想知道ifconfigifconfig -a的区别。结果在网上找了半天,也没有找到。正好同一天在docker中启用网卡时,发现了两个命令的区别,特此记录。 先上结论 ...
  • 1、order by hive中order by 传统sql中order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数据多少,不管文件多少,都启用一个reduce进行...
  • 这两个方法都可以启动Service,但是它们使用场合有所不同。  使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在...
  • 最近一直在结合代码读《Linux insides》这本书,内容讲很详细。 实模式保护模式内存地址是不同:实模式是...此外,启动过程中和待机后地址也有不同,区别主要在是否启用了分页机制。 注意:Linux启动过程...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 163
精华内容 65
关键字:

启动和启用的区别